ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ ΠΈ бСзопасный способ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠ°Π½Π°Ρ€Π΅Π΅Ρ‡Π½Ρ‹Ρ… Π΄Π΅ΠΏΠ»ΠΎΠ΅Π² с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Helm

ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ ΠΈ бСзопасный способ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠ°Π½Π°Ρ€Π΅Π΅Ρ‡Π½Ρ‹Ρ… Π΄Π΅ΠΏΠ»ΠΎΠ΅Π² с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Helm

ΠšΠ°Π½Π°Ρ€Π΅Π΅Ρ‡Π½Ρ‹ΠΉ Π΄Π΅ΠΏΠ»ΠΎΠΉ β€” это ΠΎΡ‡Π΅Π½ΡŒ эффСктивный способ тСстирования Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π½Π° ΠΊΠ°ΠΊΠΎΠΌ-Ρ‚ΠΎ подмноТСствС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ. Он Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ сниТаСт Ρ‚Ρ€Π°Ρ„ΠΈΠΊ-Π½Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π² процСссС развСртывания, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ происходит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΠΏΠΎΠ΄Π³Ρ€ΡƒΠΏΠΏΡ‹. Π­Ρ‚Π° Π·Π°ΠΌΠ΅Ρ‚ΠΊΠ° посвящСна Ρ‚ΠΎΠΌΡƒ, ΠΊΠ°ΠΊ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ Π΄Π΅ΠΏΠ»ΠΎΠΉ срСдствами Kubernetes ΠΈ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ дСплоя. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΊΠΎΠ΅-Ρ‡Ρ‚ΠΎ Π·Π½Π°Π΅Ρ‚Π΅ ΠΎ Helm ΠΈ рСсурсах Kubernetes.

ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ ΠΈ бСзопасный способ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠ°Π½Π°Ρ€Π΅Π΅Ρ‡Π½Ρ‹Ρ… Π΄Π΅ΠΏΠ»ΠΎΠ΅Π² с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Helm

ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ ΠΊΠ°Π½Π°Ρ€Π΅Π΅Ρ‡Π½Ρ‹ΠΉ Π΄Π΅ΠΏΠ»ΠΎΠΉ Π² Kubernetes Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя Π΄Π²Π° ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… рСсурса: сам сСрвис ΠΈ инструмСнт развСртывания. ΠšΠ°Π½Π°Ρ€Π΅Π΅Ρ‡Π½Ρ‹ΠΉ Π΄Π΅ΠΏΠ»ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‡Π΅Ρ€Π΅Π· ΠΎΠ΄Π½Ρƒ слуТбу, которая взаимодСйствуСт с двумя Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ рСсурсами, ΠΎΠ±ΡΠ»ΡƒΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠΌΠΈ Ρ‚Ρ€Π°Ρ„ΠΈΠΊ обновлСния. Один ΠΈΠ· этих рСсурсов Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Β«ΠΊΠ°Π½Π°Ρ€Π΅Π΅Ρ‡Π½ΠΎΠΉΒ» вСрсиСй, Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ β€” со ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΠΉ. Π’ этой ситуации ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Ρ€Π΅Π³ΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ количСство ΠΊΠ°Π½Π°Ρ€Π΅Π΅Ρ‡Π½Ρ‹Ρ… вСрсий для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ½ΠΈΠ·ΠΈΡ‚ΡŒ объСм Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ³ΠΎ ΠΊ ΠΎΠ±ΡΠ»ΡƒΠΆΠΈΠ²Π°Π½ΠΈΡŽ Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ°. Если, ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, Π²Ρ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°Π΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Yaml, Ρ‚ΠΎ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Π² Kubernetes это Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

kind: Deployment
metadata:
  name: app-canary
  labels:
    app: app
spec:
  replicas: 1
  ...
    image: myapp:canary
---
kind: Deployment
metadata:
  name: app
  labels:
    app: app
spec:
  replicas: 5
  ...
    image: myapp:stable
---
kind: Service
selector:
  app: app # Selector will route traffic to both deployments.

Π•Ρ‰Π΅ ΠΏΡ€ΠΎΡ‰Π΅ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΌΠΎΠΆΠ½ΠΎ Π½Π° kubectl, Π° Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΏΠΎ Kubernetes Π΄Π°ΠΆΠ΅ Π΅ΡΡ‚ΡŒ ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΉ Ρ‚ΡƒΡ‚ΠΎΡ€ΠΈΠ°Π» ΠΏΠΎ этому сцСнарий. Но Π³Π»Π°Π²Π½Ρ‹ΠΉ вопрос этого поста Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΌΡ‹ собираСмся Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ этот процСсс, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Helm.

Автоматизация ΠΊΠ°Π½Π°Ρ€Π΅Π΅Ρ‡Π½ΠΎΠ³ΠΎ дСплоя

ΠŸΡ€Π΅ΠΆΠ΄Π΅ всСго Π½Π°ΠΌ понадобится ΠΊΠ°Ρ€Ρ‚Π° Ρ‡Π°Ρ€Ρ‚ΠΎΠ² Helm, Π² ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΡƒΠΆΠ΅ внСсСны обсуТдаСмыС Π½Π°ΠΌΠΈ Π²Ρ‹ΡˆΠ΅ рСсурсы. Π’Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΠΎΠ½Π° Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊ:

~/charts/app
β”œβ”€β”€ Chart.yaml
β”œβ”€β”€ README.md
β”œβ”€β”€ templates
β”‚   β”œβ”€β”€ NOTES.txt
β”‚   β”œβ”€β”€ _helpers.tpl
β”‚   β”œβ”€β”€ deployment.yaml
β”‚   └── service.yaml
└── values.yaml

Основа ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ Helm β€” ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠ²Π΅Ρ€ΡΠΈΡΠΌΠΈ Ρ€Π΅Π»ΠΈΠ·ΠΎΠ². Stable-вСрсия β€” это наша основная ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Π°Ρ Π²Π΅Ρ‚ΠΊΠ° ΠΊΠΎΠ΄Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. Но с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Helm ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΊΠ°Π½Π°Ρ€Π΅Π΅Ρ‡Π½Ρ‹ΠΉ Ρ€Π΅Π»ΠΈΠ· с нашим ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΌ ΠΊΠΎΠ΄ΠΎΠΌ. Π“Π»Π°Π²Π½ΠΎΠ΅ β€” ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΎΠ±ΠΌΠ΅Π½ Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠΎΠΌ ΠΌΠ΅ΠΆΠ΄Ρƒ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΠΉ вСрсиСй ΠΈ ΠΊΠ°Π½Π°Ρ€Π΅Π΅Ρ‡Π½Ρ‹ΠΌ Ρ€Π΅Π»ΠΈΠ·ΠΎΠΌ. Π£ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ всСм этим ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ сСлСктора:

selector:
  app.kubernetes.io/name: myapp

Наши ΠΊΠ°ΠΊ Β«ΠΊΠ°Π½Π°Ρ€Π΅Π΅Ρ‡Π½Ρ‹Π΅Β», Ρ‚Π°ΠΊ ΠΈ stable-рСсурсы дСплоя Π±ΡƒΠ΄ΡƒΡ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ эту ΠΌΠ΅Ρ‚ΠΊΡƒ Π½Π° модулях. Если всС Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ, Ρ‚ΠΎ Π²ΠΎ врСмя дСплоя ΠΊΠ°Π½Π°Ρ€Π΅Π΅Ρ‡Π½ΠΎΠΉ вСрсии нашСй ΠΊΠ°Ρ€Ρ‚Ρ‹ Ρ‡Π°Ρ€Ρ‚ΠΎΠ² Helm ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚Ρ€Π°Ρ„ΠΈΠΊ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒΡΡ Π½Π° свСТСразвСрнутыС ΠΌΠΎΠ΄ΡƒΠ»ΠΈ. Π‘Ρ‚Π°Π±ΠΈΠ»ΡŒΠ½Π°Ρ вСрсия этой ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:

helm upgrade
  --install myapp 
  --namespace default 
  --set app.name=myapp       # Goes into app.kubernetes.io/name
  --set app.version=v1       # Goes into app.kubernetes.io/version
  --set image.tag=stable 
  --set replicaCount=5

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ наш ΠΊΠ°Π½Π°Ρ€Π΅Π΅Ρ‡Π½Ρ‹ΠΉ Ρ€Π΅Π»ΠΈΠ·. Π§Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π΄Π΅ΠΏΠ»ΠΎΠΈΡ‚ΡŒ ΠΊΠ°Π½Π°Ρ€Π΅Π΅Ρ‡Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ, Π½Π°ΠΌ Π½Π°Π΄ΠΎ ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ ΠΎ Π΄Π²ΡƒΡ… Π²Π΅Ρ‰Π°Ρ…. НазваниС Ρ€Π΅Π»ΠΈΠ·Π° Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΡ‹ Π½Π΅ Π½Π°ΠΊΠ°Ρ‚ΠΈΠ»ΠΈ Π°ΠΏΠ΄Π΅ΠΉΡ‚ Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ stable-Π²Π΅Ρ€ΡΠΈΡŽ. ВСрсия ΠΈ Ρ‚Π΅Π³ Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΊΠΎΠ΄ ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ различия ΠΏΠΎ ΠΌΠ΅Ρ‚ΠΊΠ°ΠΌ рСсурсов.

helm upgrade
  --install myapp-canary 
  --namespace default 
  --set app.name=myapp       # Goes into app.kubernetes.io/name
  --set app.version=v2       # Goes into app.kubernetes.io/version
  --set image.tag=canary 
  --set replicaCount=1

Π’ΠΎΡ‚, собствСнно, ΠΈ всС! Если ΠΏΠΈΠ½Π³Π°Π½ΡƒΡ‚ΡŒ слуТбу, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΊΠ°Π½Π°Ρ€Π΅Π΅Ρ‡Π½ΠΎΠ΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ‚Ρ€Π°Ρ„ΠΈΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Π°ΡΡ‚ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

Если Π²Ρ‹ ΠΈΡ‰ΠΈΡ‚Π΅ инструмСнты Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ дСплоя, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ Π² сСбя ΠΎΠΏΠΈΡΠ°Π½Π½ΡƒΡŽ Π»ΠΎΠ³ΠΈΠΊΡƒ, Ρ‚ΠΎ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Deliverybot ΠΈ Π½Π° инструмСнты Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ Helm Π½Π° GitHub. Π§Π°Ρ€Ρ‚Ρ‹ Helm, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ описанного Π²Ρ‹ΡˆΠ΅ способа Π»Π΅ΠΆΠ°Ρ‚ Π½Π° Github, Π²ΠΎΡ‚ Ρ‚ΡƒΡ‚. Π’ΠΎΠΎΠ±Ρ‰Π΅, это Π±Ρ‹Π» тСорСтичСский ΠΎΠ±Π·ΠΎΡ€ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΡŽ дСплоя ΠΊΠ°Π½Π°Ρ€Π΅Π΅Ρ‡Π½Ρ‹Ρ… вСрсий Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅, с ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌΠΈ концСпциями ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com