過去刺桃,可憐的金絲雀會作為試驗(yàn)品粹淋,用來測試煤礦中甲烷的含量。用繩子將裝有金絲雀的籠子放入礦井一段時間虏肾,再拉上來廓啊,如果金絲雀還活著,礦井就可以安全開采封豪;如果金絲雀死亡谴轮,則不能開采。現(xiàn)在吹埠,這種方法早已棄用第步,因?yàn)檫@對動物太不人道了。
金絲雀總是在礦工身邊徘徊缘琅,如果它停止鳴叫粘都,則表示礦工必須離開礦井。
金絲雀部署是指兩個版本的應(yīng)用共存刷袍,新版本在開始時規(guī)模較小翩隧,處理的負(fù)載流量也較少。隨著對新部署的分析呻纹,所有請求逐漸切換到新版本堆生,而舊版本應(yīng)用被移除专缠。
人們普遍認(rèn)為,管理這些部署的流量需要使用一個 Service Mesh淑仆,然而涝婉,要管理入站流量,你只需在 nginx ingress controller 上設(shè)置 annotations 即可:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-weight: <num>
這種方法的缺點(diǎn)是必須手動管理蔗怠。為了實(shí)現(xiàn)自動化墩弯,我們可以使用 Argo Rollouts (https://argoproj.github.io/argo-rollouts/)。
運(yùn)行Argo Rollouts
添加 helm-repo: https://argoproj.github.io/argo-helm
argo-rollouts chart:
Helm-values:
installCRDs: true
修改 Deployment 并運(yùn)行 Rollouts CRD
ScaleDown deployment寞射,設(shè)置 Replicas 0:
運(yùn)行 service
apiVersion: v1
kind: Service
metadata:
annotations:
argo-rollouts.argoproj.io/managed-by-rollouts: rollout-pregap
name: rollouts-pregap-canary
namespace: pregap
spec:
clusterIP: 10.43.139.197
ports:
- name: http
port: 8080
protocol: TCP
targetPort: 8080
selector:
app: test2-pregap
sessionAffinity: None
type: ClusterIP
apiVersion: v1
kind: Service
metadata:
annotations:
argo-rollouts.argoproj.io/managed-by-rollouts: rollout-pregap
spec:
clusterIP: 10.43.61.221
ports:
- name: http
port: 8080
protocol: TCP
targetPort: 8080
selector:
app: test2-pregap
sessionAffinity: None
type: ClusterIP
運(yùn)行 Rollouts CRD
由于我們不想更改Deployment渔工,因此在Rollout manifest中引用它:workloadRef.kind: Deployment, workloadRef.name
運(yùn)行 manifest 將創(chuàng)建額外 ingress:
Argo Rollouts 儀表板
CD-pipeline 中的其他步驟
在.drone.yml 中添加提升步驟:
- name: promote-release-dr
image: plugins/docker
settings:
repo: 172.16.77.115:5000/pregap
registry: 172.16.77.115:5000
insecure: true
dockerfile: Dockerfile.multistage
tags:
- latest
- ${DRONE_TAG##v}
when:
event:
- promote
target:
- production
- name: promote-release-prod
image: plugins/webhook
settings:
username: admin
password: admin
urls: http://172.16.77.118:9300/v1/webhooks/native
debug: true
content_type: application/json
template: |
{ "name": "172.16.77.115:5000/pregap",
"tag": "${DRONE_TAG##v}" }
when:
event:
- promote
target:
- production
添加 Keel 審批:
結(jié) 論
金絲雀部署或綠/藍(lán)部署一點(diǎn)都不難 - 它將提高生產(chǎn)環(huán)境的可靠性,并在出現(xiàn)任何設(shè)計錯誤時減少受影響的區(qū)域怠惶。將來涨缚,我會在服務(wù)器上添加 RAM,而且有可能啟用Prometheus 監(jiān)控和 Istio策治,并嘗試執(zhí)行分析和實(shí)驗(yàn)階段脓魏,以實(shí)現(xiàn) Argo Rollouts。