k8s入門-Deployment控制器

Deployment 爲 Pod 和 ReplicaSet(下一代 Replication Controller)提供聲明式更新,有了Deployment之後我們就不再單獨的使用RC和RS了。 您只需要在 Deployment 中描述您想要的目標狀態是什麼,Deployment controller 就會幫您將 Pod 和 ReplicaSet 的實際狀態改變到您的目標狀態。 Deployment集成了上線部署、滾動升級、創建副本、暫停上線任務,恢復上線任務,回滾到以前某一版本(成功/穩定)的Deployment等功能,在某種程度上,Deployment可以幫我們實現無人值守的上線,大大降低我們的上線過程的複雜溝通、操作風險。

一、創建Deployment

Deployment對象的創建同樣是一開YAML的配置文件。

[root@k8s-01 ~]# cat nginx-deployment.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.13.12
        ports:
        - containerPort: 80

可以發現,這裏我特意在鏡像中指定了一下nginx的版本,以方便後面升級的時候做對比。

使用kubectl創建Deployment

[root@k8s-01 ~]# kubectl create -f nginx-deployment.yaml
deployment.apps/nginx-deployment created

查看Deployment

[root@k8s-01 ~]# kubectl get deployment
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           16s
  • UP-TO-DATE 的 replica 的數目已經達到了配置中要求的數目。
  • CURRENT 的 replica 數表示 Deployment 管理的 replica 數量
  • AVAILABLE 的 replica 數是當前可用的 replica 數量。

查看RS和pod

[root@k8s-01 ~]# kubectl get rs
NAME                          DESIRED   CURRENT   READY   AGE
nginx-deployment-56689dc4b8   3         3         3       29s

[root@k8s-01 ~]# kubectl get pod
NAME                                READY   STATUS             RESTARTS   AGE
nginx-deployment-56689dc4b8-9v72r   1/1     Running            1          26m
nginx-deployment-56689dc4b8-mt4n2   1/1     Running            1          26m
nginx-deployment-56689dc4b8-twlx2   1/1     Running            1          26m

查看Deployment擴展信息

[root@k8s-01 ~]# kubectl get deployment -o wide
NAME               READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES          SELECTOR
nginx-deployment   3/3     3            3           28m   nginx        nginx:1.13.12   app=nginx

查看pod的lables

[root@k8s-01 ~]# kubectl get pods --show-labels
NAME                                READY   STATUS             RESTARTS   AGE   LABELS
nginx-deployment-56689dc4b8-9v72r   1/1     Running            1          30m   app=nginx,pod-template-hash=56689dc4b8
nginx-deployment-56689dc4b8-mt4n2   1/1     Running            1          30m   app=nginx,pod-template-hash=56689dc4b8
nginx-deployment-56689dc4b8-twlx2   1/1     Running            1          30m   app=nginx,pod-template-hash=56689dc4b8

注意: pod-template-has這個 label 不是用戶指定的!

注意上面示例輸出中的 pod label 裏的 pod-template-hash label。當 Deployment 創建或者接管 ReplicaSet 時,Deployment controller 會自動爲 Pod 添加 pod-template-hash label。這樣做的目的是防止 Deployment 的子ReplicaSet 的 pod 名字重複。通過將 ReplicaSet 的 PodTemplate 進行哈希散列,使用生成的哈希值作爲 label 的值,並添加到 ReplicaSet selector 裏、 pod template label 和 ReplicaSet 管理中的 Pod 上。

二、更新Deployment

更新Deployment,並增加–recode參數

[root@k8s-01 ~]# kubectl set image deployment nginx-deployment nginx=nginx:1.14.2 --record
deployment.apps/nginx-deployment image updated

查看更新狀態

[root@k8s-01 ~]# kubectl rollout status deployment nginx-deployment
deployment "nginx-deployment" successfully rolled out

查看更新後的Deploymnet

[root@k8s-01 ~]# kubectl get deployment -o wide
NAME               READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES         SELECTOR
nginx-deployment   3/3     3            3           49m   nginx        nginx:1.14.2   app=nginx

可以看到,一開始定義的nginx版本是1.13.12,現在已經變成了1.14.2 。

三、Deployment升級歷史

查看升級歷史

[root@k8s-01 ~]# kubectl rollout history deployment nginx-deployment
deployment.apps/nginx-deployment 
REVISION  CHANGE-CAUSE
1         <none>
2         kubectl set image deployment nginx-deployment nginx=nginx:1.14.2 --record=true

因爲我們創建 Deployment 的時候使用了–record參數可以記錄命令,我們可以很方便的查看每次 revision 的變化。可以看到有兩次的歷史記錄。

查看單個revision 的詳細信息:

[root@k8s-01 ~]# kubectl rollout history deployment nginx-deployment --revision=1 
deployment.apps/nginx-deployment with revision #1
Pod Template:
  Labels:       app=nginx
        pod-template-hash=56689dc4b8
  Containers:
   nginx:
    Image:      nginx:1.13.12
    Port:       80/TCP
    Host Port:  0/TCP
    Environment:        <none>
    Mounts:     <none>
  Volumes:      <none>

四、Deployment版本回滾

回滾到上一個版本

[root@k8s-01 ~]# kubectl rollout undo deployment nginx-deployment
deployment.apps/nginx-deployment rolled back

[root@k8s-01 ~]# kubectl get deployment -o wide
NAME               READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES          SELECTOR
nginx-deployment   3/3     3            3           54m   nginx        nginx:1.13.12   app=nginx

很神奇吧,可以直接進行回滾,真是太舒服了。

還可以使用--revision參數指定某個歷史版本:

[root@k8s-01 ~]# kubectl rollout undo deployment nginx-deployment --to-revision=2 
deployment.apps/nginx-deployment rolled back

[root@k8s-01 ~]# kubectl get deployment -o wide                                  
NAME               READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES         SELECTOR
nginx-deployment   3/3     3            3           57m   nginx        nginx:1.14.2   app=nginx

注意:版本號在Deployment的升級歷史中查找

五、Deployment擴容

[root@k8s-01 ~]# kubectl scale deployment nginx-deployment --replicas 2
deployment.apps/nginx-deployment scaled

[root@k8s-01 ~]# kubectl get pod
NAME                                READY   STATUS             RESTARTS   AGE
nginx-deployment-574b87c764-b6jhm   1/1     Running            0          3m25s
nginx-deployment-574b87c764-tgsb8   1/1     Running            0          3m24s

[root@k8s-01 ~]# kubectl get deployment
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   2/2     2            2           63m


[root@k8s-01 ~]# kubectl scale deployment nginx-deployment --replicas 4
deployment.apps/nginx-deployment scaled

[root@k8s-01 ~]# kubectl get pod
NAME                                READY   STATUS             RESTARTS   AGE
nginx-deployment-574b87c764-7sw2x   1/1     Running            0          3s
nginx-deployment-574b87c764-9mnmn   1/1     Running            0          3s
nginx-deployment-574b87c764-b6jhm   1/1     Running            0          3m36s
nginx-deployment-574b87c764-tgsb8   1/1     Running            0          3m35s

[root@k8s-01 ~]# kubectl get deployment
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   4/4     4            4           64m

參考文章:
http://k8s.unixhot.com/kubernetes/deployment.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章