天天看點

容器服務 kubernetes Deployment實作分批釋出1. 前言2. 配置過程3. 使用多個 Deployment 分批釋出優缺點

1. 前言

 容器服務官網提供的分批釋出基于 StatefulSet 開發,有狀态副本集部署 POD 是按照順序一台一台的釋出重新開機,需要消耗很長的時間,并且控制台不盡人意,存在不少坑。

 StatefulSet 分批釋出不支援任意數目任意批數的釋出,實際操作中往往需要先釋出一台線上服務做灰階,然後逐漸放大。

因而采用無狀态副本集 Deployment 對象分批部署,并通過同一個 labels指向統一一個 Service 暴露給通路者,成為大應用中最合适的分批釋出。

2. 配置過程

  1. 首先建立一個副本數目為1的初始灰階 Deployment,yaml 如下:

apiVersion: apps/v1beta2
kind: Deployment
metadata:
# service 選擇标簽
  labels:
    app: {app_name}-aone
  name: {app_name}-aone-1
  namespace: {app_name}
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: {app_name}-aone
  template:
    metadata:
      labels:
        app: {app_name}-aone
    spec:
      containers:
        - image: >-
            registry-vpc.cn-north-2-gov-1.aliyuncs.com/app-cloud/{app_name}:20190101191052
          imagePullPolicy: Always
# 在應用停止前調用優雅下線腳本,摘除 hsf,lwp 服務
          lifecycle:
            preStop:
              exec:
                command:
                  - sudo
                  - '-u'
                  - admin
                  - /home/admin/appconf/bin/appctl.sh
                  - {app_name}
                  - stop
# 就緒檢查和存活檢查
          livenessProbe:
            failureThreshold: 10
            initialDelaySeconds: 30
            periodSeconds: 10
            successThreshold: 1
            tcpSocket:
              port: 508
            timeoutSeconds: 1
          name: {app_name}-aone
          readinessProbe:
            failureThreshold: 10
            initialDelaySeconds: 30
            periodSeconds: 10
            successThreshold: 1
            tcpSocket:
              port: 508
            timeoutSeconds: 1
          resources:
            limits:
              cpu: '4'
              memory: 8196Mi
            requests:
              cpu: '4'
              memory: 8196Mi
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          volumeMounts:
            - mountPath: /home/admin/logs
              name: volume-1553680362129
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
# 日志統一寫到映射的主控端資料盤日志目錄
      volumes:
        - hostPath:
            path: /var/lib/docker/logs/{app_name}
            type: ''
          name: volume-1553680362129           

  2. 第二批,比如設定為16台,分4次釋出,每次25%,隻需要複制上面腳本,編寫 yaml 的 name 為{app_name}-aone-2, 注意保持labels 一緻,確定 pod 為同一個Service 配置提供服務,并修改副本數為16,增加更新政策配置,同理同法建立第三批,第四批...。

metadata:
# service 選擇标簽
  labels:
    app: {app_name}-aone
  name: {app_name}-aone-2
  namespace: {app_name}
spec:
  progressDeadlineSeconds: 600
  replicas: 16
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: {app_name}-aone
strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate           
  1. 建立 Service 服務,通過 labels 标簽映射指向以上每批 Deployment,使用 NodePort 結合 SLB 方式,解耦 SLB 負載均衡與 k8s service 關系,房子 Cloud controller manager 同步删除 Service 與 SLB 負載均衡。
apiVersion: v1
kind: Service
metadata:
  name: {app_name}-http
  namespace: {app_name}
spec:
  clusterIP: 133.33.33.33
  externalTrafficPolicy: Cluster
  ports:
    - nodePort: 32168
      port: 80
      protocol: TCP
      targetPort: 7001
  selector:
    app: {app_name}-aone
  sessionAffinity: None
  type: NodePort
status:
  loadBalancer: {}           

 配置好後,可以在容器服務的 Service 控制台這裡點選服務名稱,可以看到該服務對應以上4批部署(Deployment)。

至此,使用多個 Deployment 配置分批釋出完成。

3. 使用多個 Deployment 分批釋出優缺點

優點:

無狀态部署速度快,復原,重新開機速度也非常快,可以自己控制重新開機每批多少台機器;

無狀态部署可控性好,容器服務控制台在該類型操作坑少。

缺點:

雲監控按照 Deployment 分組,監控資訊變為在多個組檢視;

雲效,EDAS 都不支援此種分批釋出模式,需要自己二次開發運維釋出來實作。

繼續閱讀