過去,可憐的金絲雀會作為試驗品,用來測試煤礦中甲烷的含量。用繩子將裝有金絲雀的籠子放入礦井一段時間,再拉上來,如果金絲雀還活著,礦井就可以安全開採;如果金絲雀死亡,則不能開採。現在,這種方法早已棄用,因為這對動物太不人道了。
金絲雀總是在礦工身邊徘徊,如果它停止鳴叫,則表示礦工必須離開礦井。
金絲雀部署是指兩個版本的應用共存,新版本在開始時規模較小,處理的負載流量也較少。隨著對新部署的分析,所有請求逐漸切換到新版本,而舊版本應用被移除。
人們普遍認為,管理這些部署的流量需要使用一個 Service Mesh,然而,要管理入站流量,你只需在 nginx ingress controller 上設定 annotations 即可:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-weight: <num>
這種方法的缺點是必須手動管理。為了實現自動化,我們可以使用 Argo Rollouts (https://argoproj.github.io/ar...)。
執行Argo Rollouts
新增 helm-repo: https://argoproj.github.io/ar...
argo-rollouts chart:
Helm-values:
installCRDs: true
修改 Deployment 並執行 Rollouts CRD
ScaleDown deployment,設定 Replicas 0:
執行 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
執行 Rollouts CRD
由於我們不想更改Deployment,因此在Rollout manifest中引用它:workloadRef.kind: Deployment, workloadRef.name
執行 manifest 將建立額外 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 審批:
結 論
金絲雀部署或綠/藍部署一點都不難 - 它將提高生產環境的可靠性,並在出現任何設計錯誤時減少受影響的區域。將來,我會在伺服器上新增 RAM,而且有可能啟用Prometheus 監控和 Istio,並嘗試執行分析和實驗階段,以實現 Argo Rollouts。