Docker & Kubenetes 系列四:集群,擴容,升級,回滾


本篇將會講解應用部署到Kubenetes集群,集群副本集查看,集群自愈能力演示,集群擴容,滾動升級,以及回滾。

本篇是Docker&Kubenetes系列的第四篇,在前面的篇幅中,我們向Kubenetes中部署了單個應用實例。如果單個節點故障了,那么服務就不可用了,這在實際環境中是不能接受的。在實際的正式環境中,我們不僅要避免單點,還要根據負載變化動態的調整節點數量。為了實現這個目的,我們可以借助於Kubenetes的Deployment,Deployment可以創建指定數量的Pod,並有自愈能力,還能完成升級更新及回滾操作。

向Kubenetes中部署一個3節點的集群

和之前介紹的一樣部署集群也由過yml配置文件開始的,本例我們依然使用前面篇幅中創建的docker鏡像來部署集群。Deployment配置文件內容如下,這個配置文件是從Kubenetes官網復制的,手寫yml文件太容易出錯了,yml格式挺煩的。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-first-demo-dep
  labels:
    app: my-first-demo
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-first-demo
  template:
    metadata:
      labels:
        app: my-first-demo
    spec:
      containers:
      - name: my-first-demo
        image: hellodm/my-first-demo:v1.0
        ports:
        - containerPort: 80

配置文件中,replicas=3表示要啟動3個副本,使用的鏡像是hellodm/my-first-demo:v1.0。配置完了之后,我們來啟動集群,命令如下:

$ kubectl create -f dep.yml       
deployment.apps/my-first-demo-dep created

我們來看查看副本集情況:

$ kubectl get rs                     
NAME                          DESIRED   CURRENT   READY   AGE
my-first-demo-dep-5647fd55f   3         3         3       3m15s

在查看一下pod:

$ kubectl get pods
NAME                                READY   STATUS    RESTARTS   AGE
my-first-demo-dep-5647fd55f-4wzxs   1/1     Running   0          22s
my-first-demo-dep-5647fd55f-c9lwx   1/1     Running   0          22s
my-first-demo-dep-5647fd55f-nnwt6   1/1     Running   0          22s

暴露集群,使得我們可以在訪問集群內部的應用。

$ kubectl apply -f svc.yml                  
service/my-first-demo-svc created

訪問:

$ curl 'http://localhost:30000/'
<h1>Hello world! <h1>

OK,成功了。

Kubenetes 擴容演示

上面我們部署了3個節點的集群,假設現在3個節點已經有點吃力了,我們准備擴展到4個節點。編輯上面的Deployment文件,修改的地方如下:

spec:
  replicas: 4

其他的不變,只是replicas為4了。重新啟動一下看看:

$ kubectl apply -f dep.yml --record=true             
deployment.apps/my-first-demo-dep configured

看下副本集,如下,變成4個了。

$ kubectl get rs 
NAME                           DESIRED   CURRENT   READY   AGE
my-first-demo-dep-5647fd55f    4         4         4       10h

檢查Kubenetes集群的自愈性

我們來刪掉2個Pod,模擬宕機情況,執行kubectl delete pod命令,如下:

$ kubectl delete pod my-first-demo-dep-5647fd55f-4wzxs my-first-demo-dep-5647fd55f-c9lwx

立馬查看Pod是否恢復:

$ kubectl get pods                                                                      
NAME                                READY   STATUS    RESTARTS   AGE
my-first-demo-dep-5647fd55f-bxpn7   1/1     Running   0          25s
my-first-demo-dep-5647fd55f-nnwt6   1/1     Running   0          5m8s
my-first-demo-dep-5647fd55f-vwxgz   1/1     Running   0          25s

可以看到還是3台,從NAME和AGE可以看出,多了兩個新的。OK,至此,我們演示了擴容和自愈性。

Kubenetes滾動升級

為了演示滾動升級,我們先制作v2.0版本的鏡像,修改index的內容為:

<h1>Hello worldls , this is Version 2.</h1>

這里我故意拼錯了一個單詞,別急,后面有妙用。下面我們來

制作v2.0的鏡像:

$ docker build . -t my-frist-demo:v2.0  
Sending build context to Docker daemon  6.144kB
Step 1/2 : FROM nginx
 ---> 602e111c06b6
Step 2/2 : COPY index.html /usr/share/nginx/html
 ---> 7484909c0df2
Successfully built 7484909c0df2
Successfully tagged my-frist-demo:v2.0

發布鏡像:

$ docker tag my-frist-demo:v2.0 hellodm/my-first-demo:v2.0

$ docker push hellodm/my-first-demo:v2.0                  
The push refers to repository [docker.io/hellodm/my-first-demo]
a3e37d09f192: Preparing 
b3003aac411c: Preparing 
216cf33c0a28: Preparing 
c2adabaecedb: Layer already exists 
denied: requested access to the resource is denied

修改deployment的配置文件,改用v2.0的鏡像,如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-first-demo-dep
  labels:
    app: my-first-demo
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-first-demo
  template:
    metadata:
      labels:
        app: my-first-demo
    spec:
      containers:
      - name: my-first-demo
        image: hellodm/my-first-demo:v2.0
        ports:
        - containerPort: 80

執行發布,這次附帶了一個參數--record=true讓 Kubernetes 把這行命令記到發布歷史中方便后面查看。

$ kubectl apply -f dep.yml --record=true
deployment.apps/my-first-demo-dep configured

趕緊查看一下pod狀態如下,可以發現已經在滾動發布了,ContainerCreating狀態的表示新版本的容器正在啟動,Running的是新版本的已經運行起來了,Terminating的這個是老版本正在停止。

$ kubectl get pods
NAME                                 READY   STATUS              RESTARTS   AGE
my-first-demo-dep-54596847d8-6m4n9   0/1     ContainerCreating   0          2s
my-first-demo-dep-54596847d8-jrm8g   1/1     Running             0          4s
my-first-demo-dep-5647fd55f-cbcrz    1/1     Running             0          56s
my-first-demo-dep-5647fd55f-ll7tt    0/1     Terminating         0          56s
my-first-demo-dep-5647fd55f-s8d6l    1/1     Running             0          56s

再趕快查看一下滾動發布的狀態:

$ kubectl rollout status deployment my-first-demo-dep
Waiting for rollout to finish: 1 old replicas are pending termination...
deployment "my-first-demo-dep" successfully rolled out

如上命令所表示,隨着最后一個old replicas 終止,新版本的deployment成功發布了successfully rolled out

簡直是太激動了,驗證一下是不是3個pod,如下,沒問題,3個Running狀態。

$ kubectl get pods
NAME                                 READY   STATUS    RESTARTS   AGE
my-first-demo-dep-54596847d8-6m4n9   1/1     Running   0          36s
my-first-demo-dep-54596847d8-jrm8g   1/1     Running   0          38s
my-first-demo-dep-54596847d8-nqgmn   1/1     Running   0          34s

訪問一下看看:

$ curl 'http://localhost:30000/'
<h1>Hello worldls , this is Version 2.</h1>

已經是新版本了,可惜啊,新版本有問題啊!單詞拼錯了,world寫成了worldls,我們來趕緊回滾一下。

Kubenetes應用集群回滾

上面我們使用滾動發布,將網站升級為version2了。但是有錯誤,我們來查看一下發布歷史:

$ kubectl rollout history deployment my-first-demo-dep
deployment.extensions/my-first-demo-dep 
REVISION  CHANGE-CAUSE
1         kubectl apply --filename=dep.yml --record=true
2         kubectl apply --filename=dep.yml --record=true

可以看到,有兩個版本,我們回滾到版本1,執行如下命令:

$ kubectl rollout undo deployment my-first-demo-dep --to-revision=1
deployment.extensions/my-first-demo-dep rolled back

查看回滾過程狀態:

$ kubectl rollout status deployment my-first-demo-dep
Waiting for deployment "my-first-demo-dep" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment "my-first-demo-dep" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment "my-first-demo-dep" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment "my-first-demo-dep" rollout to finish: 1 old replicas are pending termination...
Waiting for deployment "my-first-demo-dep" rollout to finish: 1 old replicas are pending termination...
deployment "my-first-demo-dep" successfully rolled out

上面的日志顯示了完整的回滾過程,看到最后一行successfully rolled out輸出的時候,說明回滾完成了。這時候響應的應該就是 Hello world!,我們來驗證一下回滾效果:

$ curl 'http://localhost:30000/'
<h1>Hello world! <h1>

OK,成功了,回滾到了沒有錯誤的原始版本。

總結

本篇演示了Kubenetes集群發布,集群副本集查看,集群自愈能力演示,集群擴容,滾動升級,以及回滾。然而這一切來得是如此的簡單,我們只需要修改一下配置,執行一個命令,剩下的工作Kubenetes都幫我們做了。當我在回顧我幾年前所在的某家公司的時候,程序升級上線都是由運維手工完成,雖然也完成了任務,但是那種原始的操作方式,在時下如果還有人用的話,那簡直是不敢想象。

Docker & k8s 系列一:快速上手docker
Docker & k8s 系列二:本機k8s環境搭建
Docker & k8s 系列三:在k8s中部署單個服務實例
alt 逃離沙漠公眾號


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM