1. 程式人生 > >K8S Kubernetes 簡單介紹 轉自 http://time-track.cn/kubernetes-trial.html Kubernetes初體驗

K8S Kubernetes 簡單介紹 轉自 http://time-track.cn/kubernetes-trial.html Kubernetes初體驗

layer k8s 中國 sched ati 轉發 orm initial curl

這段時間學習了一下 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節點:運行應用的工作節點。

如下圖:

技術分享

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

技術分享

這裏我們依舊使用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.

技術分享

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

技術分享

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.

技術分享

我們再來介紹一下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

技術分享

接著上的例子,我們使用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 ID:    docker://a45e88e7cb9fdb193a2ed62539918e293aa381d5c8fedb57ed78e54df9ea502a
    Image:        registry.hnaresearch.com/public/hello-world:v1.0
    Image ID:        docker://sha256:b3737bd8b3af68017bdf932671212be7211f4cdc47cd63b2300fbd71057ecf83
    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 Class:    BestEffort
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 ID:    docker://a45e88e7cb9fdb193a2ed62539918e293aa381d5c8fedb57ed78e54df9ea502a
    Image:        registry.hnaresearch.com/public/hello-world:v1.0
    Image ID:        docker://sha256:b3737bd8b3af68017bdf932671212be7211f4cdc47cd63b2300fbd71057ecf83
    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 Class:    BestEffort
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

技術分享

技術分享

擴大應用的規模時,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.

技術分享

技術分享

技術分享

技術分享

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。

K8S Kubernetes 簡單介紹 轉自 http://time-track.cn/kubernetes-trial.html Kubernetes初體驗