Kubernetes №1 жүйесінде канарларды орналастыру: Gitlab CI

Kubernetes жүйесінде Canary орналастыруды енгізу және пайдалану үшін Gitlab CI және қолмен GitOps пайдаланамыз.

Kubernetes №1 жүйесінде канарларды орналастыру: Gitlab CI

Осы сериядағы мақалалар:

Біз Canary орналастыруын GitOps арқылы қолмен орындаймыз және негізгі Kubernetes ресурстарын жасаймыз/өзгертеміз. Бұл мақала негізінен кіріспеге арналған Kubernetes Canary жүйесінде орналастыру қалай жұмыс істейтіні туралы, өйткені автоматтандырудың тиімді әдістері бар, біз оларды келесі мақалаларда қарастырамыз.


Kubernetes №1 жүйесінде канарларды орналастыру: Gitlab CI

https://www.norberteder.com/canary-deployment/

Canary Deployment

Canary стратегиясымен жаңартулар алдымен пайдаланушылардың ішкі жиынына ғана қолданылады. Бақылау, журнал деректері, қолмен тестілеу немесе басқа кері байланыс арналары арқылы шығарылым барлық пайдаланушыларға шығарылмас бұрын тексеріледі.

Kubernetes Deployment (жылдам жаңарту)

Kubernetes Deployment бағдарламасына арналған әдепкі стратегия жылжымалы жаңарту болып табылады, мұнда кескіндердің жаңа нұсқаларымен бірге қосқыштардың белгілі саны іске қосылады. Егер олар қиындықсыз жасалған болса, кескіндердің ескі нұсқалары бар бөлімшелер тоқтатылады және жаңа подкасттар параллель түрде жасалады.

GitOps

Біз бұл мысалда GitOps пайдаланамыз, өйткені біз:

  • Git-ті шындықтың жалғыз көзі ретінде пайдалану
  • біз құру және орналастыру үшін Git операцияларын қолданамыз (git тегі/біріктіруден басқа командалар қажет емес)

Мысал:

Жақсы тәжірибені алайық - қолданба коды үшін бір репозиторий және инфрақұрылым үшін біреуі болуы керек.

Қолданбалар репозиторийі

Бұл JSON ретінде жауапты қайтаратын өте қарапайым Python+Flask API. Біз пакетті GitlabCI арқылы құрастырамыз және нәтижені Gitlab тізіліміне жібереміз. Тізілімде екі түрлі шығарылым нұсқасы бар:

  • wuestkamp/k8s-deployment-example-app:v1
  • wuestkamp/k8s-deployment-example-app:v2

Олардың арасындағы жалғыз айырмашылық қайтарылған JSON файлындағы өзгеріс болып табылады. Біз бұл қолданбаны қай нұсқамен байланысып жатқанымызды мүмкіндігінше оңай бейнелеу үшін пайдаланамыз.

Инфрақұрылымдық репозиторий

Бұл репада біз GitlabCI арқылы Kubernetes-ке орналастырамыз, .gitlab-ci.yml төмендегідей:

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

Оны өзіңіз іске қосу үшін сізге кластер қажет, Gcloud пайдалануға болады:

gcloud container clusters create canary --num-nodes 3 --zone europe-west3-b

gcloud compute firewall-rules create incoming-80 --allow tcp:80

Сізге айыру керек https://gitlab.com/wuestkamp/k8s-deployment-example-canary-infrastructure және айнымалыны жасаңыз KUBECONFIG GitlabCI жүйесінде, ол кіруге арналған конфигурацияны қамтиды kubectl сіздің кластеріңізге.

Кластер (Gcloud) үшін тіркелгі деректерін алу жолы туралы оқуға болады. мұнда.

Инфрақұрылым Yaml

Инфрақұрылымдық репозиторийде біздің қызметіміз бар:

apiVersion: v1
kind: Service
metadata:
 labels:
   id: app
 name: app
spec:
 ports:
 - port: 80
   protocol: TCP
   targetPort: 5000
 selector:
   id: app
 type: LoadBalancer

Және орналастыру 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

Және тағы бір орналастыру 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

app-deploy қолданбасында әлі анықталған көшірмелер жоқ екенін ескеріңіз.

Бастапқы орналастыруды орындау

Бастапқы орналастыруды бастау үшін GitlabCI құбырын негізгі тармақта қолмен бастауға болады. Осыдан кейін kubectl келесіні шығару керек:

Kubernetes №1 жүйесінде канарларды орналастыру: Gitlab CI

Біз көреміз app 10 репликасы және 0 қолданбасы бар қолдану. Сондай-ақ LoadBalancer бар, ол арқылы біз қол жеткізе аламыз. curl Сыртқы IP арқылы:

while true; do curl -s 35.198.149.232 | grep label; sleep 0.1; done

Kubernetes №1 жүйесінде канарларды орналастыру: Gitlab CI

Біздің сынақ қолданбамыз тек «v1» мәнін қайтаратынын көреміз.

Canary орналастыруды орындау

1-қадам: кейбір пайдаланушылар үшін жаңа нұсқаны шығарыңыз

Біз deploy-canary.yaml файлында және жаңа нұсқа кескінінде репликалар санын 1-ге орнаттық:

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

Файлда deploy.yaml біз көшірмелердің санын 9-ға өзгерттік:

kind: Deployment
metadata:
 name: app
spec:
 replicas: 9
 selector:
   matchLabels:
     id: app
...

Біз бұл өзгерістерді орналастыру басталатын репозиторийге жібереміз (GitlabCI арқылы) және нәтиже ретінде көреміз:

Kubernetes №1 жүйесінде канарларды орналастыру: Gitlab CI

Біздің қызметіміз екі орналастыруға да нұсқайды, өйткені екеуінде де қолданба селекторы бар. Кубернетес әдепкі рандомизациясына байланысты сұраулардың ~10% үшін әртүрлі жауаптарды көруіміз керек:

Kubernetes №1 жүйесінде канарларды орналастыру: Gitlab CI

Қолданбамыздың ағымдағы күйі (GitOps, Git-тен жалғыз ақиқат көзі ретінде алынған) әр нұсқа үшін бір белсенді көшірмелері бар екі орналастырудың болуы болып табылады.

~ Пайдаланушылардың 10% жаңа нұсқамен танысып, оны байқаусызда тексереді. Енді проблемаларды табу үшін журналдар мен бақылау деректеріндегі қателерді тексеру уақыты келді.

2-қадам: Жаңа нұсқаны барлық пайдаланушыларға шығарыңыз

Біз бәрі жақсы болды деп шештік, енді жаңа нұсқаны барлық пайдаланушыларға тарату керек. Мұны істеу үшін біз жай ғана жаңартамыз deploy.yaml суреттің жаңа нұсқасын орнату және көшірмелердің саны 10-ға тең. В deploy-canary.yaml біз көшірмелердің санын 0-ге орнатамыз. Орналастырудан кейін нәтиже келесідей болады:

Kubernetes №1 жүйесінде канарларды орналастыру: Gitlab CI

қорытындылай келе

Мен үшін орналастыруды осылайша қолмен іске қосу оны k8s көмегімен қаншалықты оңай конфигурациялауға болатынын түсінуге көмектеседі. Kubernetes барлығын API арқылы жаңартуға мүмкіндік беретіндіктен, бұл қадамдарды сценарийлер арқылы автоматтандыруға болады.

Іске асыруды қажет ететін тағы бір нәрсе - тек жаңа нұсқаға қол жеткізуге болатын сынаушының кіру нүктесі (LoadBalancer немесе Ingress арқылы). Оны қолмен шолу үшін пайдалануға болады.

Болашақ мақалаларда біз жасаған істеріміздің көпшілігін жүзеге асыратын басқа автоматтандырылған шешімдерді қарастырамыз.

Сондай-ақ біздің блогтағы басқа мақалаларды оқыңыз:

Ақпарат көзі: www.habr.com

пікір қалдыру