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
- 建立 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 都不支援此種分批釋出模式,需要自己二次開發運維釋出來實作。