A yoo lo Gitlab CI ati Afowoyi GitOps lati ṣe ati lo imuṣiṣẹ Canary ni Kubernetes

Awọn nkan lati inu jara yii:
- (Arokọ yi)
- Canary imuṣiṣẹ lilo Istio
- Canary imuṣiṣẹ lilo Jenkins-X Istio Flagger
A yoo ṣe imuṣiṣẹ Canary pẹlu ọwọ nipasẹ GitOps ati ṣiṣẹda / ṣatunṣe awọn orisun Kubernetes akọkọ. Nkan yii jẹ ipinnu nipataki fun ifihan pẹlu bii imuṣiṣẹ ṣiṣẹ ni Kubernetes Canary, nitori awọn ọna adaṣe ti o munadoko diẹ sii wa, eyiti a yoo gbero ninu awọn nkan atẹle.

Canary imuṣiṣẹ
Pẹlu ilana Canary, awọn imudojuiwọn ni a kọkọ lo si ipin awọn olumulo nikan. Nipasẹ ibojuwo, data log, idanwo afọwọṣe, tabi awọn ikanni esi miiran, idasilẹ jẹ idanwo ṣaaju ki o to tu silẹ si gbogbo awọn olumulo.
Ifilọlẹ Kubernetes (imudojuiwọn yiyi)
Ilana aiyipada fun Imuṣiṣẹ Kubernetes jẹ imudojuiwọn-yiyi, nibiti nọmba kan ti awọn adarọ-ese ti ṣe ifilọlẹ pẹlu awọn ẹya tuntun ti awọn aworan. Ti wọn ba ṣẹda laisi awọn iṣoro, awọn adarọ-ese pẹlu awọn ẹya atijọ ti awọn aworan ti pari, ati pe awọn adarọ-ese tuntun ti ṣẹda ni afiwe.
GitOps
A lo GitOps ni apẹẹrẹ yii nitori awa:
- lilo Git gẹgẹbi orisun otitọ kan
- a lo Awọn iṣẹ Git fun kikọ ati imuṣiṣẹ (ko si awọn aṣẹ miiran ju git tag/dapọ ni a nilo)
Apeere:
Jẹ ki a ṣe adaṣe to dara - lati ni ibi ipamọ kan fun koodu ohun elo ati ọkan fun awọn amayederun.
Ibi ipamọ ohun elo
Eyi jẹ Python + Flask API ti o rọrun pupọ ti o da esi pada bi JSON. A yoo kọ package nipasẹ GitlabCI ati Titari abajade si Iforukọsilẹ Gitlab. Ninu iforukọsilẹ a ni awọn ẹya itusilẹ oriṣiriṣi meji:
wuestkamp/k8s-deployment-example-app:v1wuestkamp/k8s-deployment-example-app:v2
Iyatọ laarin wọn nikan ni iyipada ninu faili JSON ti o pada. A lo ohun elo yii lati wo ni irọrun bi o ti ṣee ṣe iru ẹya ti a n ba sọrọ.
Ibi ipamọ ohun elo
Ninu turnip yii a yoo ran lọ nipasẹ GitlabCI si Kubernetes, .gitlab-ci.yml dabi eleyi:
image: traherom/kustomize-docker
before_script:
- printenv
- kubectl version
stages:
- deploy
deploy test:
stage: deploy
before_script:
- echo $KUBECONFIG
script:
- kubectl get all
- kubectl apply -f i/k8s
only:
- master
Lati ṣiṣẹ funrararẹ iwọ yoo nilo iṣupọ kan, o le lo Gcloud:
gcloud container clusters create canary --num-nodes 3 --zone europe-west3-b
gcloud compute firewall-rules create incoming-80 --allow tcp:80
O nilo lati orita ki o si ṣẹda oniyipada KUBECONFIG ni GitlabCI, eyiti yoo ni atunto fun iraye si kubectl si iṣupọ rẹ.
O le ka nipa bi o ṣe le gba awọn iwe-ẹri fun iṣupọ kan (Gcloud) .
Amayederun Yaml
Ninu ibi ipamọ amayederun a ni iṣẹ:
apiVersion: v1
kind: Service
metadata:
labels:
id: app
name: app
spec:
ports:
- port: 80
protocol: TCP
targetPort: 5000
selector:
id: app
type: LoadBalancer
Ati imuṣiṣẹ ni deploy.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: app
spec:
replicas: 10
selector:
matchLabels:
id: app
type: main
template:
metadata:
labels:
id: app
type: main
spec:
containers:
- image: registry.gitlab.com/wuestkamp/k8s-deployment-example-app:v1
name: app
resources:
limits:
cpu: 100m
memory: 100Mi
Ati imuṣiṣẹ miiran ni deploy-canary.yaml:
kind: Deployment
metadata:
name: app-canary
spec:
replicas: 0
selector:
matchLabels:
id: app
type: canary
template:
metadata:
labels:
id: app
type: canary
spec:
containers:
- image: registry.gitlab.com/wuestkamp/k8s-deployment-example-app:v2
name: app
resources:
limits:
cpu: 100m
memory: 100Mi
Ṣe akiyesi pe app-fifiranṣẹ ko ni awọn ẹda ti a ti ṣalaye sibẹsibẹ.
Ṣiṣe imuṣiṣẹ akọkọ
Lati bẹrẹ imuṣiṣẹ akọkọ, o le bẹrẹ opo gigun ti epo GitlabCI pẹlu ọwọ lori ẹka titunto si. Lẹhinna kubectl yẹ ki o jade awọn wọnyi:

A ri app imuṣiṣẹ pẹlu awọn ẹda 10 ati app-canary pẹlu 0. LoadBalancer tun wa lati eyiti a le wọle si nipasẹ curl nipasẹ IP ita:
while true; do curl -s 35.198.149.232 | grep label; sleep 0.1; done

A rii pe ohun elo idanwo wa nikan pada “v1”.
Ṣiṣe imuṣiṣẹ Canary
Igbesẹ 1: tu ẹya tuntun silẹ fun diẹ ninu awọn olumulo
A ṣeto nọmba awọn ẹda si 1 ninu faili deploy-canary.yaml ati aworan ẹya tuntun:
kind: Deployment
metadata:
name: app-canary
spec:
replicas: 1
selector:
matchLabels:
id: app
type: canary
template:
metadata:
labels:
id: app
type: canary
spec:
containers:
- image: registry.gitlab.com/wuestkamp/k8s-deployment-example-app:v2
name: app
resources:
limits:
cpu: 100m
memory: 100Mi
Ninu faili deploy.yaml a yipada nọmba awọn ẹda si 9:
kind: Deployment
metadata:
name: app
spec:
replicas: 9
selector:
matchLabels:
id: app
...
A Titari awọn ayipada wọnyi si ibi ipamọ lati eyiti imuṣiṣẹ yoo bẹrẹ (nipasẹ GitlabCI) ati rii bi abajade:

Iṣẹ wa yoo tọka si awọn imuṣiṣẹ mejeeji, nitori awọn mejeeji ni yiyan ohun elo. Nitori aileto aiyipada Kubernetes, a yẹ ki o rii awọn idahun oriṣiriṣi fun ~ 10% ti awọn ibeere:

Ipo lọwọlọwọ ti ohun elo wa (GitOps, ti a mu lati Git bi Orisun Otitọ Nikan) jẹ niwaju awọn imuṣiṣẹ meji pẹlu awọn ẹda ti nṣiṣe lọwọ, ọkan fun ẹya kọọkan.
~ 10% ti awọn olumulo di faramọ pẹlu ẹya tuntun ati idanwo aimọkan. Bayi ni akoko lati ṣayẹwo fun awọn aṣiṣe ninu awọn àkọọlẹ ati ibojuwo data lati wa isoro.
Igbesẹ 2: Tu ẹya tuntun si gbogbo awọn olumulo
A pinnu pe ohun gbogbo lọ daradara ati bayi a nilo lati yi ẹya tuntun jade si gbogbo awọn olumulo. Lati ṣe eyi a nìkan imudojuiwọn deploy.yaml fifi titun kan ti ikede ti awọn aworan ati awọn nọmba ti replicas dogba si 10. Ni deploy-canary.yaml a ṣeto nọmba awọn ẹda pada si 0. Lẹhin imuṣiṣẹ, abajade yoo jẹ bi atẹle:

Summing soke
Fun mi, ṣiṣe imuṣiṣẹ pẹlu ọwọ ni ọna yii ṣe iranlọwọ lati ni oye bi o ṣe le ni irọrun ti o le tunto nipa lilo k8s. Niwọn igba ti Kubernetes gba ọ laaye lati ṣe imudojuiwọn ohun gbogbo nipasẹ API, awọn igbesẹ wọnyi le ṣe adaṣe nipasẹ awọn iwe afọwọkọ.
Ohun miiran ti o nilo lati ṣe imuse ni aaye titẹsi oluyẹwo (LoadBalancer tabi nipasẹ Ingress) nipasẹ eyiti ẹya tuntun nikan le wọle si. O le ṣee lo fun lilọ kiri ayelujara pẹlu ọwọ.
Ninu awọn nkan iwaju, a yoo ṣayẹwo awọn ojutu adaṣe adaṣe miiran ti o ṣe pupọ julọ ohun ti a ti ṣe.
Tun ka awọn nkan miiran lori bulọọgi wa:
orisun: www.habr.com
