zhuyumu 发表于 2018-1-4 18:35:47

K8S Kubernetes 简单介绍 转自 http://time-track.cn/kubernetes-trial.html Kubernetes初

  这段时间学习了一下 git jenkins docker最近也在看Kubernetes感觉写得很赞也是对自己对于K8S 有了进一步得理解感谢 倪 大神得Blog 也希望看到这篇Blog 得人有点帮助   ‘“Kubernetes初体验”   转自    http://time-track.cn/kubernetes-trial.html

Kubernetes Cluster

  Kubernetes is a production-grade, open-source platform that orchestrates the placement (scheduling) and execution of application containers within and across computer clusters.

  Kubernetes将底层的计算资源连接在一起对外体现为一个计算集群,并将资源高度抽象化。部署应用时Kubernetes会以更高效的方式自动的将应用分发到集群内的机器上面,并调度运行。几个Kubernetes集群包含两种类型的资源:


[*]  Master节点:协调控制整个集群。

[*]  Nodes节点:运行应用的工作节点。

  如下图:
http://kubernetes.io/docs/tutorials/kubernetes-basics/public/images/module_01_cluster.svg

  Masters manage the cluster and the nodes are used to host the running applications.

  Master负责管理整个集群,协调集群内的所有行为。比如调度应用,监控应用的状态等。
  Node节点负责运行应用,一般是一台物理机或者虚机。每个Node节点上面都有一个Kubelet,它是一个代理程序,用来管理该节点以及和Master节点通信。除此以外,Node节点上还会有一些管理容器的工具,比如Docker或者rkt等。生产环境中一个Kubernetes集群至少应该包含三个Nodes节点。
  当部署应用的时候,我们通知Master节点启动应用容器。然后Master会调度这些应用将它们运行在Node节点上面。Node节点和Master节点通过Master节点暴露的Kubernetes API通信。当然我们也可以直接通过这些API和集群交互。
  Kubernetes提供了一个轻量级的Minikube应用,利用它我们可以很容器的创建一个只包含一个Node节点的Kubernetes Cluster用于日常的开发测试。

安装Minikube
  Minikube的Github:https://github.com/kubernetes/minikube
  Minikube提供OSX、Linux、Windows版本,本文测试环境为OSX,且以当时最新的版本为例。实际操作时,尽量到官网查看最新的版本及安装命令。
  MacOS安装:
  

curl -Lo minikube https://storage.googleapis.com/minikube/releases/v0.15.0/minikube-darwin-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/  

  Linux安装:
  

curl -Lo minikube https://storage.googleapis.com/minikube/releases/v0.15.0/minikube-linux-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/  

  Minikube要正常使用,还必须安装kubectl,并且放在PATH里面。kubectl是一个通过Kubernetes API和Kubernetes集群交互的命令行工具。安装方法如下:
  MACOS安装:
  

wget https://storage.googleapis.com/kubernetes-release/release/v1.5.1/bin/darwin/amd64/kubectl  
chmod +x kubectl
  
mv kubectl /usr/local/bin/kubectl
  

  Linux安装:
  

wget https://storage.googleapis.com/kubernetes-release/release/v1.5.1/bin/linux/amd64/kubectl  
chmod +x kubectl
  
mv kubectl /usr/local/bin/kubectl
  

  因为Minikube使用Docker Machine管理Kubernetes的虚机,所以我们还需要安装一些虚机的driver,这里推荐使用Virtualbox,因为安装简单(从官网下载安装即可),而且后面可以简单的登录到VM里面去进行一些操作。其它driver的安装请参考官方文档:https://github.com/kubernetes/minikube/blob/master/DRIVERS.md。
  安装完以后,我们可以使用一下命令进行一些信息查看:
  

minikube version    # 查看版本  
minikube start --vm-driver=virtualbox   # 启动Kubernetes Cluster,这里使用的driver是Virtualbox
  

  
kubectl version    # 查看版本
  
kubectl cluster-info # 查看集群信息
  
kubectl get nodes # 查看当前可用的Node,使用Minikube创建的cluster只有一个Node节点
  

  至此,我们已经用Minikube创建了一个Kubernetes Cluster,下面我们在这个集群上面部署一个应用。

Only For Chinese
  在进行下一节部署具体应用前我们先要做一件事情。Kubernetes在部署容器应用的时候会先拉一个pause镜像,这个是一个基础容器,主要是负责网络部分的功能的,具体这里不展开讨论。最关键的是Kubernetes里面镜像默认都是从Google的镜像仓库拉的(就跟docker默认从docker hub拉的一样),但是因为GFW的原因,中国用户是访问不了Google的镜像仓库gcr.io的(如果你可以ping通,那恭喜你)。庆幸的是这个镜像被传到了docker hub上面,虽然中国用户访问后者也非常艰难,但通过一些加速器之类的还是可以pull下来的。如果没有VPN等科学上网的工具的话,请先做如下操作:
  

minikube ssh    # 登录到我们的Kubernetes VM里面去  
docker pull hub.c.163.com/allan1991/pause-amd64:3.0
  
docker tag hub.c.163.com/allan1991/pause-amd64:3.0 gcr.io/google_containers/pause-amd64:3.0
  

  我们先从其他镜像仓库(这里我使用的是HNA CloudOS容器云平台提供的镜像仓库)下载Kubernetes需要的基础网络容器pause,Mac OSX上面kubectl 1.5.1版本需要的是pause-amd64:3.0,然后我将其打成gcr.io/google_containers/pause-amd64:3.0。这样Kubernetes VM就不会从gcr.io拉镜像了,而是会直接使用本地的镜像。
  关于这个问题,Kubernetes上面还专门有个issue讨论,有兴趣的可以看看:https://github.com/kubernetes/kubernetes/issues/6888。
  OK,接着我们可以进行下一步了。

Deploy an App
  在Kubernetes Cluster上面部署应用,我们需要先创建一个Kubernetes Deployment。这个Deployment负责创建和更新我们的应用实例。当这个Deployment创建之后,Kubernetes master就会将这个Deployment创建出来的应用实例部署到集群内某个Node节点上。而且自应用实例创建后,Deployment controller还会持续监控应用,直到应用被删除或者部署应用的Node节点不存在。

  A Deployment is responsible for creating and updating instances of your application

http://kubernetes.io/docs/tutorials/kubernetes-basics/public/images/module_02_first_app.svg
  这里我们依旧使用kubectl来创建Deployment,创建的时候需要制定容器镜像以及我们要启动的个数(replicas),当然这些信息后面可以再更新。这里我用Go写了一个简单的Webserver,返回“Hello World”,监听端口是8090.我们就来启动这个应用(镜像地址:registry.hnaresearch.com/public/hello-world:v1.0 备用镜像地址:hub.c.163.com/allan1991/hello-world:v1.0)
  

kubectl run helloworld --image=registry.hnaresearch.com/public/hello-world:v1.0 --port=8090  

  这条命令执行后master寻找一个合适的node来部署我们的应用实例(我们只有一个node)。我们可以使用kubectl get deployment来查看我们创建的Deployment:
  

➜~ kubectl get deployment  
NAME         DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
  
helloworld   1         1         1            1         53m
  

  默认应用部署好之后是只在Kubernetes Cluster内部可见的,有多种方法可以让我们的应用暴露到外部,这里先介绍一种简单的:我们可以通过kubectl proxy命令在我们的终端和Kubernetes Cluster直接创建一个代理。然后,打开一个新的终端,通过Pod名(Pod后面会有讲到,可以通过kubectl get pod查看Pod名字)就可以访问了:
  

➜~ kubectl proxy  
Starting to serve on 127.0.0.1:8001
  

  
# 打开新的终端
  
➜~ kubectl get pod
  
NAME                        READY   STATUS    RESTARTS   AGE
  
helloworld-2080166056-4q88d   1/1       Running   0          1h
  
➜~ curl http://localhost:8001/api/v1/proxy/namespaces/default/pods/helloworld-2080166056-4q88d/
  
Hello world !
  

  OK,我们的第一个应用已经部署成功了。如果你的应用有问题(比如kubectl get deployment执行后看到AVAILABL是0),可以通过kubectl describe pod pod名字来查看信息(最后面的Events部分是该Pod的信息),看哪里出错了。
  好吧,这里我们已经提到了Pod,它是Kubernetes中一个非常重要的概念,也是区别于其他编排系统的一个设计,这里我们简单介绍一下。

  Pods和Nodes
  其实我们创建了Deployment之后,它并不是直接创建了容器实例,而是先在Node上面创建了Pod,然后再在Pod里面创建容器。那Pod到底是什么?Pod是Kubernetes里面抽象出来的一个概念,它是能够被创建、调度和管理的最小单元;每个Pod都有一个独立的IP;一个Pod由若干个容器构成。一个Pod之内的容器共享Pod的所有资源,这些资源主要包括:共享存储(以Volumes的形式)、共享网络、共享端口等。Kubernetes虽然也是一个容器编排系统,但不同于其他系统,它的最小操作单元不是单个容器,而是Pod。这个特性给Kubernetes带来了很多优势,比如最显而易见的是同一个Pod内的容器可以非常方便的互相访问(通过localhost就可以访问)和共享数据。
  A Pod is a group of one or more application containers (such as Docker or rkt) and includes shared storage (volumes), IP address and information about how to run them.

http://kubernetes.io/docs/tutorials/kubernetes-basics/public/images/module_03_pods.svg

  Containers should only be scheduled together in a single Pod if they are tightly coupled and need to share resources such as disk.

http://kubernetes.io/docs/tutorials/kubernetes-basics/public/images/module_03_nodes.svg

Services和Labels
  上一步我们已经创建了一个应用,并且通过proxy实现了集群外部可以访问,但这种Proxy的方式是不太适用于实际生产环境的。本节我们再介绍一个Kubernetes里面另外一个非常重要的概念———Service。Service是Kubernetes里面抽象出来的一层,它定义了由多个Pods组成的逻辑组(logical set),可以对组内的Pod做一些事情:


[*]  对外暴露流量

[*]  做负载均衡(load balancing)

[*]  服务发现(service-discovery)。

  而且每个Service都有一个集群内唯一的私有IP和对外的端口,用于接收流量。如果我们想将一个Service暴露到集群外,有两种方法:


[*]  LoadBalancer - 提供一个公网的IP

[*]  NodePort - 使用NAT将Service的端口暴露出去。Minikube只支持这种方式。

  A Kubernetes Service is an abstraction layer which defines a logical set of Pods and enables external traffic exposure, load balancing and service discovery for those Pods.

http://kubernetes.io/docs/tutorials/kubernetes-basics/public/images/module_04_services.svg
  我们再来介绍一下Kubernetes里面的第三个比较重要的概念——Label。Service就是靠Label选择器(Label Selectors)来匹配组内的Pod的,而且很多命令都可以操作Label。Label是绑定在对象上(比如Pod)的键值对,主要用来把一些相关的对象组织在一起,并且对于用户来说label是有含义的,比如:


[*]  Production environment (production, test, dev)

[*]  Application version (beta, v1.3)

[*]  Type of service/server (frontend, backend, database)

  当然,Label是随时可以更改的。

  Labels are key/value pairs that are attached to objects

http://kubernetes.io/docs/tutorials/kubernetes-basics/public/images/module_04_labels.svg
  接着上的例子,我们使用Service的方式将我们之前部署的helloworld应用暴露到集群外部。因为Minikube只支持NodePort方式,所以这里我们使用NodePort方式。使用kubectl get service可以查看目前已有的service,Minikube默认创建了一个kubernetes Service。我们使用expose命令再创建一个Service:
  

# 查看已有Service  
➜~ kubectl get service
  
NAME          CLUSTER-IP   EXTERNAL-IP   PORT(S)          AGE
  
hello-nginx   10.0.0.163   <pending>   80:31943/TCP   1d
  
helloworld    10.0.0.114   <nodes>       8090:30350/TCP   1h
  
kubernetes    10.0.0.1   <none>      443/TCP          1d
  

  
# 创建新的Service
  
➜ ~ kubectl expose deployment/helloworld --type="NodePort" --port 8090
  
service "helloworld" exposed
  

  
# 查看某个Service的详细信息
  
➜ ~ kubectl describe service/helloworld
  
Name:            helloworld
  
Namespace:      default
  
Labels:            run=helloworld
  
Selector:      run=helloworld
  
Type:            NodePort
  
IP:            10.0.0.114
  
Port:            <unset>    8090/TCP
  
NodePort:      <unset>    30350/TCP
  
Endpoints:      172.17.0.3:8090
  
Session Affinity:    None
  
No events.
  

  这样内部应用helloworld的8090端口映射到了外部的30350端口。此时我们就可以通过外部访问里面的应用了:
  

➜~ curl 192.168.99.100:30350  
Hello world !
  

  这里的IP是minikube的Docker host的IP,可以通过minikube docker-env命令查看。再看Label的例子,创建Pod的时候默认会生产一个Label和Label Selector,我们可以使用kubectl label命令创建新的Label。
  

➜~ kubectl describe pod helloworld-2080166056-4q88d  
Name:      helloworld-2080166056-4q88d
  
Namespace:    default
  
Node:      minikube/192.168.99.100
  
Start Time:    Tue, 10 Jan 2017 16:36:22 +0800
  
Labels:      pod-template-hash=2080166056    # 默认的Label
  run=helloworld
  
Status:      Running
  
IP:      172.17.0.3
  
Controllers:    ReplicaSet/helloworld-2080166056
  
Containers:
  helloworld:

  Container>  Image:      registry.hnaresearch.com/public/hello-world:v1.0

  Image>  Port:      8090/TCP
  State:      Running
  Started:      Tue, 10 Jan 2017 16:36:32 +0800
  Ready:      True
  Restart Count:    0
  Volume Mounts:
  /var/run/secrets/kubernetes.io/serviceaccount from default-token-zfl0m (ro)
  Environment Variables:    <none>
  
Conditions:
  Type      Status
  Initialized   True
  Ready   True
  PodScheduled   True
  
Volumes:
  default-token-zfl0m:
  Type:    Secret (a volume populated by a Secret)
  SecretName:    default-token-zfl0m

  
QoS>  
Tolerations:    <none>
  
No events.
  

  

  
# 新增一个Label
  
➜~ kubectl label pod helloworld-2080166056-4q88d app=v1
  
pod "helloworld-2080166056-4q88d" labeled
  

  

  
➜~ kubectl describe pod helloworld-2080166056-4q88d
  
Name:      helloworld-2080166056-4q88d
  
Namespace:    default
  
Node:      minikube/192.168.99.100
  
Start Time:    Tue, 10 Jan 2017 16:36:22 +0800
  
Labels:      app=v1      # 新增的Label
  pod-template-hash=2080166056
  run=helloworld
  
Status:      Running
  
IP:      172.17.0.3
  
Controllers:    ReplicaSet/helloworld-2080166056
  
Containers:
  helloworld:

  Container>  Image:      registry.hnaresearch.com/public/hello-world:v1.0

  Image>  Port:      8090/TCP
  State:      Running
  Started:      Tue, 10 Jan 2017 16:36:32 +0800
  Ready:      True
  Restart Count:    0
  Volume Mounts:
  /var/run/secrets/kubernetes.io/serviceaccount from default-token-zfl0m (ro)
  Environment Variables:    <none>
  
Conditions:
  Type      Status
  Initialized   True
  Ready   True
  PodScheduled   True
  
Volumes:
  default-token-zfl0m:
  Type:    Secret (a volume populated by a Secret)
  SecretName:    default-token-zfl0m

  
QoS>  
Tolerations:    <none>
  
No events.
  

  
# 使用Label的例子
  
➜~ kubectl get service -l run=helloworld
  
NAME         CLUSTER-IP   EXTERNAL-IP   PORT(S)          AGE
  
helloworld   10.0.0.114   <nodes>       8090:30350/TCP   5m
  
➜~ kubectl get pod -l app=v1
  
NAME                        READY   STATUS    RESTARTS   AGE
  
helloworld-2080166056-4q88d   1/1       Running   0          1d
  

  删掉一个Service使用kubectl delete service命令:
  

➜~ kubectl delete service helloworld  

  删除Service后,我们就没法通过外部访问到内部应用了,但是Pod内的应用依旧是在正常运行的。

Scale an App
  PS:这个Scale不知道咋翻译才好,就用scale吧。

  Scaling is accomplished by changing the number of replicas in a Deployment.

  刚才我们部署了一个应用,并且增加了Service。但是这个应用只运行在一个Pod上面。随着流量的增加,我们可能需要增加我们应用的规模来满足用户的需求。Kubernetes的Scale功能就可以实现这个需求。

  You can create from the start a Deployment with multiple instances using the --replicas parameter for the kubectl run command

https://kubernetes.io/docs/tutorials/kubernetes-basics/public/images/module_05_scaling1.svg
https://kubernetes.io/docs/tutorials/kubernetes-basics/public/images/module_05_scaling2.svg
  扩大应用的规模时,Kubernetes将会在Nodes上面使用可用的资源来创建新的Pod,并运行新增加的应用,缩小规模时做相反的操作。Kubernetes也支持自动规模化Pod。当然我们也可以将应用的数量变为0,这样就会终止所有部署该应用的Pods。应用数量增加后,Service内的负载均衡就会变得非常有用了,为了表现出这个特性,我修改了一下程序,除了打印“Hello world”以外,还会打印主机名。我们先看一下现有的一些输出字段的含义:
  

➜~ kubectl get deployment  
NAME         DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
  
helloworld   1         1         1            1         2m
  

  可以看到,现在我们只有一个Pod,


[*]  DESIRED字段表示我们配置的replicas的个数,即实例的个数。

[*]  CURRENT字段表示目前处于running状态的replicas的个数。

[*]  UP-TO-DATE字段表示表示和预先配置的期望状态相符的replicas的个数。

[*]  AVAILABLE字段表示目前实际对用户可用的replicas的个数。

  下面我们使用kubectl scale命令将启动4个复制品,语法规则是kubectl scale deployment-type name replicas-number:‘
  

➜~ kubectl scale deployment/helloworld --replicas=4  
deployment "helloworld" scaled
  

  
# 查看应用实例个数
  
➜~ kubectl get deployment
  
NAME         DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
  
helloworld   4         4         4            4         9m
  

  
# 查看Pod个数
  
➜~ kubectl get pod -o wide
  
NAME                        READY   STATUS    RESTARTS   AGE       IP         NODE
  
helloworld-2080166056-fn03c   1/1       Running   0          9m      172.17.0.2   minikube
  
helloworld-2080166056-jlwz1   1/1       Running   0          32s       172.17.0.4   minikube
  
helloworld-2080166056-mmpn4   1/1       Running   0          32s       172.17.0.3   minikube
  
helloworld-2080166056-wh696   1/1       Running   0          32s       172.17.0.5   minikube
  

  可以看到,我们已经有4个应用实例了,而且Pod个数也变成4个了,每个都有自己的IP。当然,日志里面也有相关信息:
  

➜~ kubectl describe deployment/helloworld  
Name:            helloworld
  
Namespace:      default
  
CreationTimestamp:    Thu, 12 Jan 2017 13:37:47 +0800
  
Labels:            run=helloworld
  
Selector:      run=helloworld
  
Replicas:      4 updated | 4 total | 4 available | 0 unavailable
  
StrategyType:      RollingUpdate
  
MinReadySeconds:    0
  
RollingUpdateStrategy:    1 max unavailable, 1 max surge
  
Conditions:
  Type      Status    Reason
  ----      ------    ------
  Available   True    MinimumReplicasAvailable
  
OldReplicaSets:    <none>
  
NewReplicaSet:    helloworld-2080166056 (4/4 replicas created)
  
Events:
  FirstSeen    LastSeen    Count    From                SubObjectPath    Type      Reason            Message
  ---------    --------    -----    ----                -------------    --------    ------            -------
  11m      11m      1    {deployment-controller }            Normal      ScalingReplicaSet    Scaled up replica set helloworld-2080166056 to 1
  2m      2m      1    {deployment-controller }            Normal      ScalingReplicaSet    Scaled up replica set helloworld-2080166056 to 4
  

  然后我们再看下之前我们创建的Service信息:
  

➜~ kubectl describe service/helloworld  
Name:            helloworld
  
Namespace:      default
  
Labels:            run=helloworld
  
Selector:      run=helloworld
  
Type:            NodePort
  
IP:            10.0.0.170
  
Port:            <unset>    8090/TCP
  
NodePort:      <unset>    31030/TCP
  
Endpoints:      172.17.0.2:8090,172.17.0.3:8090,172.17.0.4:8090 + 1 more...
  
Session Affinity:    None
  
No events.
  

  可以看到Service的信息也已经更新了。让我们验证一下这个Service是有负载均衡的:
  

➜~ curl 192.168.99.100:31030  
Hello world !
  
hostname:helloworld-2080166056-jlwz1
  
➜~ curl 192.168.99.100:31030
  
Hello world !
  
hostname:helloworld-2080166056-mmpn4
  
➜~ curl 192.168.99.100:31030
  
Hello world !
  
hostname:helloworld-2080166056-wh696
  
➜~ curl 192.168.99.100:31030
  
Hello world !
  
hostname:helloworld-2080166056-mmpn4
  
➜~ curl 192.168.99.100:31030
  
Hello world !
  
hostname:helloworld-2080166056-wh696
  

  接着我们将实例缩减为2个:
  

➜~ kubectl scale deployment/helloworld --replicas=2  
deployment "helloworld" scaled
  
➜~ kubectl get deployment
  
NAME         DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
  
helloworld   2         2         2            2         18m
  
➜~ kubectl get pod -o wide
  
NAME                        READY   STATUS    RESTARTS   AGE       IP         NODE
  
helloworld-2080166056-fn03c   1/1       Running   0          18m       172.17.0.2   minikube
  
helloworld-2080166056-wh696   1/1       Running   0          9m      172.17.0.5   minikube
  

Update an App
  Kubernetes还提供了一个非常有用的特性——滚动更新(Rolling update),这个特性的好处就是我们不用停止服务就可以实现应用更新。默认更新的时候是一个Pod一个Pod更新的,所以整个过程服务不会中断。当然你也可以设置一次更新的Pod的百分比。而且更新过程中,Service只会将流量转发到可用的节点上面。更加重要的是,我们可以随时回退到旧版本。

  Rolling updates allow Deployments' update to take place with zero downtime by incrementally updating Pods instances with new ones.
  If a Deployment is exposed publicly, the Service will load-balance the traffic only to available Pods during the update.
https://kubernetes.io/docs/tutorials/kubernetes-basics/public/images/module_06_rollingupdates1.svg
https://kubernetes.io/docs/tutorials/kubernetes-basics/public/images/module_06_rollingupdates2.svg
https://kubernetes.io/docs/tutorials/kubernetes-basics/public/images/module_06_rollingupdates3.svg
https://kubernetes.io/docs/tutorials/kubernetes-basics/public/images/module_06_rollingupdates4.svg
  OK,我们来实践一下。我们在原来程序的基础上,多输出一个v2作为新版本,使用set image命令指定新版本镜像。
  

# 使用set image命令执行新版本镜像  
➜~ kubectl set image deployments/helloworld helloworld=registry.hnaresearch.com/public/hello-world:v2.0
  
deployment "helloworld" image updated
  
➜~ kubectl get pod
  
NAME                        READY   STATUS            RESTARTS   AGE
  
helloworld-2080166056-fn03c   1/1       Running             0          28m
  
helloworld-2161692841-8psgp   0/1       ContainerCreating   0          5s
  
helloworld-2161692841-cmzg0   0/1       ContainerCreating   0          5s
  

  
# 更新中
  
➜~ kubectl get pods
  
NAME                        READY   STATUS            RESTARTS   AGE
  
helloworld-2080166056-fn03c   1/1       Running             0          28m
  
helloworld-2161692841-8psgp   0/1       ContainerCreating   0          20s
  
helloworld-2161692841-cmzg0   0/1       ContainerCreating   0          20s
  

  
# 已经更新成功
  
➜~ kubectl get pods
  
NAME                        READY   STATUS    RESTARTS   AGE
  
helloworld-2161692841-8psgp   1/1       Running   0          2m
  
helloworld-2161692841-cmzg0   1/1       Running   0          2m
  
➜~ curl 192.168.99.100:31030
  
Hello world v2!      # 输出以变为v2
  
hostname:helloworld-2161692841-cmzg0
  

  然后我们继续更新到不存在的v3版本:
  

➜~ kubectl set image deployments/helloworld helloworld=registry.hnaresearch.com/public/hello-world:v3.0  
deployment "helloworld" image updated
  

  
# 更新中
  
➜~ kubectl get pods
  
NAME                        READY   STATUS            RESTARTS   AGE
  
helloworld-2161692841-cmzg0   1/1       Running             0          16m
  
helloworld-2243219626-7qhzh   0/1       ContainerCreating   0          4s
  
helloworld-2243219626-rfw64   0/1       ContainerCreating   0          4s
  

  
# 更新时,Service只会讲请求转发到可用节点
  
➜~ curl 192.168.99.100:31030
  
Hello world v2!
  
hostname:helloworld-2161692841-cmzg0
  
➜~ curl 192.168.99.100:31030
  
Hello world v2!
  
hostname:helloworld-2161692841-cmzg0
  

  
# 因为镜像不存在,所以更新失败了。但仍然有一个Pod是可用的
  
➜~ kubectl get pod
  
NAME                        READY   STATUS         RESTARTS   AGE
  
helloworld-2161692841-cmzg0   1/1       Running      0          16m
  
helloworld-2243219626-7qhzh   0/1       ErrImagePull   0          21s
  
helloworld-2243219626-rfw64   0/1       ErrImagePull   0          21s
  

  因为我们指定了一个不存在的镜像,所以更新失败了。现在我们使用kubectl rollout undo命令回滚到之前v2的版本:
  

➜~ kubectl rollout undo deployment/helloworld  
deployment "helloworld" rolled back
  
➜~ kubectl get pod
  
NAME                        READY   STATUS    RESTARTS   AGE
  
helloworld-2161692841-cmzg0   1/1       Running   0          19m
  
helloworld-2161692841-mw9g2   1/1       Running   0          5s
  
➜~ curl 192.168.99.100:31030
  
Hello world v2!
  
hostname:helloworld-2161692841-cmzg0
  
➜~ curl 192.168.99.100:31030
  
Hello world v2!
  
hostname:helloworld-2161692841-mw9g2
  

结束语
  Kubernetes是Google根据他们多年的生产经验以及已有系统Brog等开发的一套全新系统,虽然目前我还只是个初学者,但是能够感觉到Kubernetes在一些结构设计方面相比于其他容器编排系统有着独特的见解。至于Kubernetes是什么,官方也有比较详细的说明:https://kubernetes.io/docs/whatisk8s。后面我抽空会将这篇文章翻译一下,以加深理解。
  哦,对,Kubernetes一词源于希腊语,是舵手(helmsman)、船员(pilot)的意思。因为首字母和最后一个字母中间有8个字母,所以又简称K8s。
页: [1]
查看完整版本: K8S Kubernetes 简单介绍 转自 http://time-track.cn/kubernetes-trial.html Kubernetes初