kubernets容器編排

1 原理

kubernets中有水平擴展/收縮和滾動更新兩個編排動作,都依賴於ReplicaSet。

Deployment Controller實際操縱的是 ReplicaSet 對象,而不是 Pod 對象。ReplicaSet 通過“控制器模式”,保證系統中Pod的個數永遠等於指定的個數,Deployment Controller同樣通過“控制器模式”,來操作 ReplicaSet 的個數和屬性,進而實現水平擴展 / 收縮”和“滾動更新”這兩個編排動作。

Deployment,與 ReplicaSet,以及Pod 的關係如下圖:在這裏插入圖片描述

2 水平擴展/收縮

deployment要進行“水平擴展 / 收縮”,Deployment Controller 只需要修改它所控制的ReplicaSet 的 Pod 副本個數就可以了。
nginx-deployment文件如下:

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.7.9
        ports:
        - containerPort: 80

執行操作

kubectl create -f nginx-deployment.yaml -n cfd 

# 查看 ReplicaSet
kubectl get rs -n cfd

# replica 擴展爲4
kubectl scale deployment nginx-deployment --replicas=4 -n cfd

# 查看deployment信息,其中event展現了擴展操作
kubectl describe deployment nginx-deployment -n cfd

3 滾動更新

將一個集羣中正在運行的多個 Pod 版本,交替地逐一升級的過程,就是“滾動更新”。
在deployment創建或者更新後,會立即觸發滾動更新。

# --record,記錄下每次操作的命令,方便日後查看
kubectl create -f nginx-deployment.yaml -n cfd --record

# 實時查看 Deployment狀態
kubectl rollout status deployment/nginx-deployment --record -n cfd

kubectl get deployments -n cfd

# 將image 由 1.7.9 升級到 1.9.1
kubectl edit deployment/nginx-deployment -n cfd

# 滾動更新過程
kubectl rollout status deployment/nginx-deployment -n cfd
    Waiting for deployment "nginx-deployment" rollout to finish: 1 out of 3 new replicas have been updated...
    Waiting for deployment "nginx-deployment" rollout to finish: 1 out of 3 new replicas have been updated...
    Waiting for deployment "nginx-deployment" rollout to finish: 1 out of 3 new replicas have been updated...
    Waiting for deployment "nginx-deployment" rollout to finish: 2 out of 3 new replicas have been updated...
    Waiting for deployment "nginx-deployment" rollout to finish: 2 out of 3 new replicas have been updated...
    Waiting for deployment "nginx-deployment" rollout to finish: 2 out of 3 new replicas have been updated...
    Waiting for deployment "nginx-deployment" rollout to finish: 1 old replicas are pending termination...
    Waiting for deployment "nginx-deployment" rollout to finish: 1 old replicas are pending termination...
    deployment "nginx-deployment" successfully rolled out

# 查看event中滾動更新的流程
kubectl describe deployment nginx-deployment -n cfd

滾動更新的好處是保證服務的連續性,在任何窗口時間內,只有指定比例的Pod處於離線狀態,同時也只有指定比例的新Pod被創建出來,這兩個比例的值可以分別通過maxSurge和maxUnavailable配置,默認都是 DESIRED 值的25%

如果滾動更新失敗,可以通過進行回滾,以版本控制爲例

# 更新一個不存在的image
kubectl set image deployment/nginx-deployment nginx=nginx:1.91 -n cfd

# 查看rs,發現有沒有處於READY的rs
kubectl get rs -n cfd

# 回滾到上個版本
kubectl rollout undo deployment/nginx-deployment -n cfd

# 查看回滾歷史
kubectl rollout history deployment/nginx-deployment -n cfd

# 回滾到指定版本
kubectl rollout history deployment/nginx-deployment --revision=2 -n cfd

# 每一次更新操作,都會生成一個新的ReplicaSet,有些多餘,在更新Deployment前執行pause,使Deployment進入pause態,在set或者edit之後,再通過resume恢復,對於在此期間的操作,只生成一個ReplicaSet
kubectl rollout pause deployment/nginx-deployment-n cfd
kubectl rollout resume deployment/nginx-deployment-n cfd
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章