K8s藍(lán)綠部署:優(yōu)雅應(yīng)對(duì)應(yīng)用程序更新挑戰(zhàn)
Kubernetes 是一個(gè)開源容器編排系統(tǒng),可簡(jiǎn)化軟件部署、擴(kuò)展和管理。藍(lán)綠部署是一種部署模式,通過同時(shí)運(yùn)行兩個(gè)相同的生產(chǎn)環(huán)境來最大限度地減少停機(jī)時(shí)間。通過創(chuàng)建藍(lán)色和綠色部署,設(shè)置服務(wù)和路由規(guī)則,以及執(zhí)行藍(lán)綠部署來更新應(yīng)用程序版本,可以輕松管理和更新應(yīng)用程序。

Kubernetes 是一個(gè)開源容器編排系統(tǒng),可簡(jiǎn)化軟件部署、擴(kuò)展和管理。它最初由 Google 設(shè)計(jì),現(xiàn)在由云原生計(jì)算基金會(huì)監(jiān)管。
藍(lán)綠部署是一種部署模式,通過運(yùn)行兩個(gè)相同的生產(chǎn)環(huán)境(藍(lán)色和綠色)來最大限度地減少停機(jī)時(shí)間。一次只有一個(gè)環(huán)境運(yùn)行,確保更改既向前又向后兼容。該方法包括設(shè)置并行基礎(chǔ)設(shè)施、將新版本部署到新環(huán)境、驗(yàn)證,然后將所有流量切換到綠色環(huán)境。確認(rèn)后,舊的基礎(chǔ)設(shè)施(藍(lán)色)可以移除或停止。
先決條件:- Kubernetes集群
- kubectl 命令行工具
- 待部署應(yīng)用程序的 Docker 鏡像
kubectl create namespace blue-green-deployment
第2步:創(chuàng)建部署
創(chuàng)建藍(lán)色部署清單 (blue-deployment.yaml):
# blue-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: demoapp-blue
labels:
app: demoapp
env: blue
spec:
replicas: 3
selector:
matchLabels:
app: demoapp
env: blue
template:
metadata:
labels:
app: demoapp
env: blue
spec:
containers:
- name: demo
image: demoapp:v1.0
ports:
- containerPort: 80
應(yīng)用部署:
kubectl apply -f blue-deployment.yaml -n blue-green-deployment
創(chuàng)建類似的綠色部署清單 (green-deployment.yaml) 并應(yīng)用它。
第3步:創(chuàng)建服務(wù)創(chuàng)建服務(wù)清單(service.yaml):selector: app: demoapp
# service.yaml
apiVersion: v1
kind: Service
metadata:
name: demoapp-service
spec:
selector:
app: demoapp
ports:
- name: http
port: 80
targetPort: 80
type: LoadBalancer
申請(qǐng)服務(wù):
kubectl apply -f service.yaml -n blue-green-deployment
獲取服務(wù)的外部IP地址:
kubectl get service demoapp-service -n blue-green-deployment
第4步:路由規(guī)則
在服務(wù)清單 (service.yaml) 中定義路由規(guī)則,將流量路由到藍(lán)色或綠色部署:
# service.yaml
apiVersion: v1
kind: Service
metadata:
name: demoapp-service
spec:
selector:
app: demoapp
ports:
- name: http
port: 80
targetPort: 80
type: LoadBalancer
sessionAffinity: ClientIP
externalTrafficPolicy: Local
loadBalancerSourceRanges:
- 0.0.0.0/0
應(yīng)用更新后的服務(wù):
kubectl apply -f service.yaml -n blue-green-deployment
第5步:基于主機(jī)和路徑的路由
擴(kuò)展服務(wù)清單 (service.yaml) 以包含基于主機(jī)和路徑的路由規(guī)則:
# service.yaml
apiVersion: v1
kind: Service
metadata:
name: demoapp-service
spec:
selector:
app: demoapp
ports:
- name: http
port: 80
targetPort: 80
type: LoadBalancer
sessionAffinity: ClientIP
externalTrafficPolicy: Local
loadBalancerSourceRanges:
- 0.0.0.0/0
externalIPs:
- <external_ip_address>
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: demoapp-ingress
spec:
rules:
- host: "demoapp.example.com"
http:
paths:
- path: /blue
backend:
serviceName: demoapp-blue
servicePort: 80
- path: /green
backend:
serviceName: demoapp-green
servicePort: 80
應(yīng)用更新后的服務(wù):
kubectl apply -f service.yaml -n blue-green-deployment
第6步:執(zhí)行藍(lán)綠部署
在藍(lán)色和綠色部署同時(shí)運(yùn)行的情況下,將流量從藍(lán)色部署路由到綠色部署。
第7步:更新綠色部署使用新版本的應(yīng)用程序更新綠色部署 (green-deployment-v2.yaml):
# green-deployment-v2.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: demoapp-green
labels:
app: demoapp
env: green
spec:
replicas: 3
selector:
matchLabels:
app: demoapp
env: green
template:
metadata:
labels:
app: demoapp
env: green
spec:
containers:
- name: myapp
image: myapp:v2.0
ports:
- containerPort: 80
應(yīng)用更新的綠色部署:
kubectl apply -f green-deployment-v2.yaml -n blue-green-deployment
第8步:更新服務(wù)
更新服務(wù)以將流量路由到綠色部署 (service.yaml)。
# service.yaml
apiVersion: v1
kind: Service
metadata:
name: demoapp-service
spec:
selector:
app: demoapp
env: green
ports:
- name: http
port: 80
targetPort: 80
type: LoadBalancer
sessionAffinity: ClientIP
externalTrafficPolicy: Local
loadBalancerSourceRanges:
- 0.0.0.0/0
externalIPs:
- <external_ip_address>
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: demoapp-ingress
spec:
rules:
- host: "demoapp.example.com"
http:
paths:
- path: /blue
backend:
serviceName: demoapp-blue
servicePort: 80
- path: /green
backend:
serviceName: demoapp-green
servicePort: 80
應(yīng)用更新后的服務(wù):
kubectl apply -f service.yaml -n blue-green-deployment
第9步:驗(yàn)證部署成功
通過使用外部 IP 地址在 Web 瀏覽器中訪問應(yīng)用程序來驗(yàn)證部署是否成功。
第10步:回滾(如果需要)如果出現(xiàn)問題,請(qǐng)通過更新服務(wù)清單中的標(biāo)簽選擇器以選擇藍(lán)色部署并重新應(yīng)用服務(wù)清單來回滾到以前的版本。
# service.yaml
apiVersion: v1
kind: Service
metadata:
name: demoapp-service
spec:
selector:
app: demoapp
env: blue
ports:
- name: http
port: 80
targetPort: 80
type: LoadBalancer
sessionAffinity: ClientIP
externalTrafficPolicy: Local
本文轉(zhuǎn)載自:「DevOps云學(xué)堂」,原文:https://reurl.cc/g4og4X,版權(quán)歸原作者所有。
推薦閱讀:
Meetup武漢站議題揭曉~趁現(xiàn)在!速速報(bào)名...
Go區(qū)不大,創(chuàng)造神話,科目三殺進(jìn)來了
想要了解Go更多內(nèi)容,歡迎掃描下方??關(guān)注公眾號(hào), 回復(fù)關(guān)鍵詞 [實(shí)戰(zhàn)群] ,就有機(jī)會(huì)進(jìn)群和我們進(jìn)行交流
分享、在看與點(diǎn)贊Go
