Наш ΠΎΠΏΡ‹Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π² etcd Kubernetes-кластСра Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ (Π±Π΅Π· K8s API)

ВсС Ρ‡Π°Ρ‰Π΅ ΠΊ Π½Π°ΠΌ ΠΎΠ±Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ с ΠΏΡ€ΠΎΡΡŒΠ±ΠΎΠΉ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ доступ Π² Kubernetes-кластСр для возмоТности обращСния ΠΊ сСрвисам Π²Π½ΡƒΡ‚Ρ€ΠΈ кластСра: Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ ΠΊ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ»ΠΈ сСрвису, для связи локального прилоТСния с прилоТСниями Π²Π½ΡƒΡ‚Ρ€ΠΈ кластСра…

Наш ΠΎΠΏΡ‹Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π² etcd Kubernetes-кластСра Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ (Π±Π΅Π· K8s API)

НапримСр, Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ со своСй локальной ΠΌΠ°ΡˆΠΈΠ½Ρ‹ ΠΊ сСрвису memcached.staging.svc.cluster.local. ΠœΡ‹ прСдоставляСм Ρ‚Π°ΠΊΡƒΡŽ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ VPN Π²Π½ΡƒΡ‚Ρ€ΠΈ кластСра, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΠΊΠ»ΠΈΠ΅Π½Ρ‚. Для этого анонсируСм подсСти pod’ΠΎΠ², сСрвисов ΠΈ push’ΠΈΠΌ кластСрныС DNS ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΊΠΎΠ³Π΄Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚ пытаСтся ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ ΠΊ сСрвису memcached.staging.svc.cluster.local, запрос ΡƒΡ…ΠΎΠ΄ΠΈΡ‚ Π² DNS кластСра ΠΈ Π² ΠΎΡ‚Π²Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ адрСс Π΄Π°Π½Π½ΠΎΠ³ΠΎ сСрвиса ΠΈΠ· сСрвисной сСти кластСра ΠΈΠ»ΠΈ адрСс pod’Π°.

K8s-кластСры ΠΌΡ‹ настраиваСм с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ kubeadm, Π³Π΄Π΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ сСрвисная ΠΏΠΎΠ΄ΡΠ΅Ρ‚ΡŒ β€” 192.168.0.0/16, Π° ΡΠ΅Ρ‚ΡŒ pod’ΠΎΠ² β€” 10.244.0.0/16. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ всё Ρ…ΠΎΡ€ΠΎΡˆΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Π½ΠΎ Π΅ΡΡ‚ΡŒ ΠΏΠ°Ρ€Π° ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΠ²:

  • ΠŸΠΎΠ΄ΡΠ΅Ρ‚ΡŒ 192.168.*.* часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² офисных сСтях ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ², Π° Π΅Ρ‰Π΅ Ρ‡Π°Ρ‰Π΅ β€” Π² Π΄ΠΎΠΌΠ°ΡˆΠ½ΠΈΡ… сСтях Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ². И Ρ‚ΠΎΠ³Π΄Π° Ρƒ нас ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ΡΡ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Ρ‹: домашниС Ρ€ΠΎΡƒΡ‚Π΅Ρ€Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π² этой подсСти ΠΈ VPN push’ΠΈΡ‚ эти подсСти ΠΈΠ· кластСра ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ.
  • Π£ нас Π΅ΡΡ‚ΡŒ нСсколько кластСров (кластСры production, stage ΠΈ/ΠΈΠ»ΠΈ нСсколько dev-кластСров). Π’ΠΎΠ³Π΄Π° Π²ΠΎ всСх Π½ΠΈΡ… ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ подсСти для pod’ΠΎΠ² ΠΈ сСрвисов, Ρ‡Ρ‚ΠΎ создаСт большиС слоТности для ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с сСрвисами Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… кластСрах.

ΠœΡ‹ ΡƒΠΆΠ΅ довольно Π΄Π°Π²Π½ΠΎ приняли ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΡƒ использования Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… подсСтСй для сСрвисов ΠΈ pod’ΠΎΠ² Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° β€” Π² ΠΎΠ±Ρ‰Π΅ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ всС кластСры Π±Ρ‹Π»ΠΈ с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ сСтями. Однако Π΅ΡΡ‚ΡŒ большоС количСство кластСров Π² Ρ€Π°Π±ΠΎΡ‚Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π±Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΊΠ°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ с нуля, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π² Π½ΠΈΡ… Π·Π°ΠΏΡƒΡ‰Π΅Π½Ρ‹ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ сСрвисы, stateful-прилоТСния ΠΈ Ρ‚.ΠΏ.

И Ρ‚ΠΎΠ³Π΄Π° ΠΌΡ‹ задались вопросом: ΠΊΠ°ΠΊ Π±Ρ‹ ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΏΠΎΠ΄ΡΠ΅Ρ‚ΡŒ Π² ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌ кластСрС?

Поиск Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ

НаиболСС распространСнная ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ° β€” ΠΏΠ΅Ρ€Π΅ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ всС сСрвисы с Ρ‚ΠΈΠΏΠΎΠΌ ClusterIP. Как Π²Π°Ρ€ΠΈΠ°Π½Ρ‚, ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΡΠΎΠ²Π΅Ρ‚ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Ρ‚Π°ΠΊΠΎΠ΅:

The following process has a problem: after everything configured, the pods come up with the old IP as a DNS nameserver in /etc/resolv.conf.
Since I still did not find the solution, i had to reset the entire cluster with kubeadm reset and init it again.

Но Π½Π΅ всСм это подходит… Π’ΠΎΡ‚ Π±ΠΎΠ»Π΅Π΅ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Π²Π²ΠΎΠ΄Π½Ρ‹Π΅ для нашСго случая:

  • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Flannel;
  • Π•ΡΡ‚ΡŒ кластСра ΠΊΠ°ΠΊ Π² ΠΎΠ±Π»Π°ΠΊΠ°Ρ…, Ρ‚Π°ΠΊ ΠΈ Π½Π° ΠΆΠ΅Π»Π΅Π·Π΅;
  • Π₯ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ дСплоя всСх сСрвисов Π² кластСрС;
  • Π•ΡΡ‚ΡŒ ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎΡΡ‚ΡŒ Π²ΠΎΠΎΠ±Ρ‰Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ всё с ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ количСством ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ;
  • ВСрсия Kubernetes β€” 1.16.6 (Π²ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, дальнСйшиС дСйствия Π±ΡƒΠ΄ΡƒΡ‚ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ ΠΈ для Π΄Ρ€ΡƒΠ³ΠΈΡ… вСрсий);
  • Основная Π·Π°Π΄Π°Ρ‡Π° сводится ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² кластСрС, Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ΠΎΠΌ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ kubeadm с сСрвисной ΠΏΠΎΠ΄ΡΠ΅Ρ‚ΡŒΡŽ 192.168.0.0/16, Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π΅Ρ‘ Π½Π° 172.24.0.0/16.

И Ρ‚Π°ΠΊ ΡƒΠΆ совпало, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π΄Π°Π²Π½ΠΎ Π±Ρ‹Π»ΠΎ интСрСсно ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΈ ΠΊΠ°ΠΊ Π² Kubernetes хранится Π² etcd, Ρ‡Ρ‚ΠΎ Π²ΠΎΠΎΠ±Ρ‰Π΅ с этим ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒβ€¦ Π’ΠΎΡ‚ ΠΈ ΠΏΠΎΠ΄ΡƒΠΌΠ°Π»ΠΈ: Β«ΠŸΠΎΡ‡Π΅ΠΌΡƒ Π±Ρ‹ просто Π½Π΅ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π² etcd, Π·Π°ΠΌΠ΅Π½ΠΈΠ² старыС IP-адрСса (ΠΏΠΎΠ΄ΡΠ΅Ρ‚ΡŒ) Π½Π° Π½ΠΎΠ²Ρ‹Π΅?Β»

Поискав Π³ΠΎΡ‚ΠΎΠ²Ρ‹Π΅ инструмСнты для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π² etcd, ΠΌΡ‹ Π½Π΅ нашли Π½ΠΈΡ‡Π΅Π³ΠΎ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Ρ€Π΅ΡˆΠ°ΡŽΡ‰Π΅Π³ΠΎ ΠΏΠΎΡΡ‚Π°Π²Π»Π΅Π½Π½ΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ. (ΠšΡΡ‚Π°Ρ‚ΠΈ, Ссли Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅ ΠΎ Π»ΡŽΠ±Ρ‹Ρ… ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π°Ρ… для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ Π² etcd β€” Π±ΡƒΠ΄Π΅ΠΌ ΠΏΡ€ΠΈΠ·Π½Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ Π·Π° ссылки.) Однако Ρ…ΠΎΡ€ΠΎΡˆΠ΅ΠΉ ΠΎΡ‚ΠΏΡ€Π°Π²Π½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ стала etcdhelper ΠΎΡ‚ OpenShift (спасибо Π΅Π³ΠΎ Π°Π²Ρ‚ΠΎΡ€Π°ΠΌ!).

Π­Ρ‚Π° ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° ΡƒΠΌΠ΅Π΅Ρ‚ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ ΠΊ etcd с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ сСртификатов ΠΈ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΡ‚Ρ‚ΡƒΠ΄Π° Π΄Π°Π½Π½Ρ‹Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄ ls, get, dump.

ДописываСм etcdhelper

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ ΠΌΡ‹ΡΠ»ΡŒ Π·Π°ΠΊΠΎΠ½ΠΎΠΌΠ΅Ρ€Π½Π°: Β«Π§Ρ‚ΠΎ ΠΌΠ΅ΡˆΠ°Π΅Ρ‚ Π΄ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ эту ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρƒ, Π΄ΠΎΠ±Π°Π²ΠΈΠ² Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ записи Π΄Π°Π½Π½Ρ‹Ρ… Π² etcd?Β»

Она Π²ΠΎΠΏΠ»ΠΎΡ‚ΠΈΠ»Π°ΡΡŒ Π² ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ etcdhelper с двумя Π½ΠΎΠ²Ρ‹ΠΌΠΈ функциями changeServiceCIDR ΠΈ changePodCIDR. На Π΅Ρ‘ ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ здСсь.

Π§Ρ‚ΠΎ Π΄Π΅Π»Π°ΡŽΡ‚ Π½ΠΎΠ²Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ? Алгоритм changeServiceCIDR:

  • создаСм дСсСриализатор;
  • ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌ рСгулярноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ для Π·Π°ΠΌΠ΅Π½Ρ‹ CIDR;
  • ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΠΌ ΠΏΠΎ всСм сСрвисам с Ρ‚ΠΈΠΏΠΎΠΌ ClusterIP Π² кластСрС:
    • Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΡƒΠ΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· etcd Π² Go-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚;
    • с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ рСгулярного выраТСния замСняСм ΠΏΠ΅Ρ€Π²Ρ‹Π΅ Π΄Π²Π° Π±Π°ΠΉΡ‚Π° адрСса;
    • присваиваСм сСрвису IP-адрСс ΠΈΠ· Π½ΠΎΠ²ΠΎΠΉ подсСти;
    • создаСм сСриализатор, ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅ΠΌ Go-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² protobuf, записываСм Π½ΠΎΠ²Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Π² etcd.

Ѐункция changePodCIDR ΠΏΠΎ сути Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Π° changeServiceCIDR β€” Ρ‚ΠΎΠ»ΡŒΠΊΠΎ вмСсто рСдактирования спСцификации сСрвисов ΠΌΡ‹ Π΄Π΅Π»Π°Π΅ΠΌ это для ΡƒΠ·Π»Π° ΠΈ мСняСм .spec.PodCIDR Π½Π° Π½ΠΎΠ²ΡƒΡŽ ΠΏΠΎΠ΄ΡΠ΅Ρ‚ΡŒ.

ΠŸΡ€Π°ΠΊΡ‚ΠΈΠΊΠ°

Π‘ΠΌΠ΅Π½Π° serviceCIDR

План ΠΏΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ поставлСнной Π·Π°Π΄Π°Ρ‡ΠΈ β€” ΠΎΡ‡Π΅Π½ΡŒ простой, Π½ΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚ Π΄Π°ΡƒΠ½Ρ‚Π°ΠΉΠΌ Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ‚ пСрСсоздания всСх pod’ΠΎΠ² Π² кластСрС. ПослС описания основных шагов ΠΌΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ подСлимся мыслями, ΠΊΠ°ΠΊ Π² Ρ‚Π΅ΠΎΡ€ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ этот простой.

ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ дСйствия:

  • установка Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ³ΠΎ ПО ΠΈ сборка ΠΏΡ€ΠΎΠΏΠ°Ρ‚Ρ‡Π΅Π½Π½ΠΎΠ³ΠΎ etcdhelper;
  • бэкап etcd ΠΈ /etc/kubernetes.

ΠšΡ€Π°Ρ‚ΠΊΠΈΠΉ ΠΏΠ»Π°Π½ дСйствий ΠΏΠΎ смСнС serviceCIDR:

  • ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ манифСстов apiserver’Π° ΠΈ controller-manager’Π°;
  • пСрСвыпуск сСртификатов;
  • ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ClusterIP сСрвисов Π² etcd;
  • рСстарт всСх pod’ΠΎΠ² Π² кластСрС.

Π”Π°Π»Π΅Π΅ прСдставлСна полная ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ дСйствий Π² дСталях.

1. УстанавливаСм etcd-client для Π΄Π°ΠΌΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ…:

apt install etcd-client

2. Π‘ΠΎΠ±ΠΈΡ€Π°Π΅ΠΌ etcdhelper:

  • Π‘Ρ‚Π°Π²ΠΈΠΌ golang:
    GOPATH=/root/golang
    mkdir -p $GOPATH/local
    curl -sSL https://dl.google.com/go/go1.14.1.linux-amd64.tar.gz | tar -xzvC $GOPATH/local
    echo "export GOPATH="$GOPATH"" >> ~/.bashrc
    echo 'export GOROOT="$GOPATH/local/go"' >> ~/.bashrc
    echo 'export PATH="$PATH:$GOPATH/local/go/bin"' >> ~/.bashrc
  • БохраняСм сСбС etcdhelper.go, Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ зависимости, собираСм:
    wget https://raw.githubusercontent.com/flant/examples/master/2020/04-etcdhelper/etcdhelper.go
    go get go.etcd.io/etcd/clientv3 k8s.io/kubectl/pkg/scheme k8s.io/apimachinery/pkg/runtime
    go build -o etcdhelper etcdhelper.go

3. Π”Π΅Π»Π°Π΅ΠΌ бэкап etcd:

backup_dir=/root/backup
mkdir ${backup_dir}
cp -rL /etc/kubernetes ${backup_dir}
ETCDCTL_API=3 etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt --key=/etc/kubernetes/pki/etcd/server.key --cert=/etc/kubernetes/pki/etcd/server.crt --endpoints https://192.168.199.100:2379 snapshot save ${backup_dir}/etcd.snapshot

4. МСняСм ΡΠ΅Ρ€Π²ΠΈΡΠ½ΡƒΡŽ ΠΏΠΎΠ΄ΡΠ΅Ρ‚ΡŒ Π² манифСстах Kubernetes control plane. Π’ Ρ„Π°ΠΉΠ»Π°Ρ… /etc/kubernetes/manifests/kube-apiserver.yaml ΠΈ /etc/kubernetes/manifests/kube-controller-manager.yaml измСняСм ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ --service-cluster-ip-range Π½Π° Π½ΠΎΠ²ΡƒΡŽ ΠΏΠΎΠ΄ΡΠ΅Ρ‚ΡŒ: 172.24.0.0/16 вмСсто 192.168.0.0/16.

5. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ мСняСм ΡΠ΅Ρ€Π²ΠΈΡΠ½ΡƒΡŽ ΠΏΠΎΠ΄ΡΠ΅Ρ‚ΡŒ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ kubeadm выпускаСт сСртификаты для apiserver’а (Π² Ρ‚ΠΎΠΌ числС), ΠΈΡ… Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅Ρ€Π΅Π²Ρ‹ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ:

  1. ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ, Π½Π° ΠΊΠ°ΠΊΠΈΠ΅ Π΄ΠΎΠΌΠ΅Π½Ρ‹ ΠΈ IP-адрСса Π²Ρ‹ΠΏΡƒΡ‰Π΅Π½ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ сСртификат:
    openssl x509 -noout -ext subjectAltName </etc/kubernetes/pki/apiserver.crt
    X509v3 Subject Alternative Name:
        DNS:dev-1-master, DNS:kubernetes, DNS:kubernetes.default, DNS:kubernetes.default.svc, DNS:kubernetes.default.svc.cluster.local, DNS:apiserver, IP Address:192.168.0.1, IP Address:10.0.0.163, IP Address:192.168.199.100
  2. ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΠΌ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ для kubeadm:
    cat kubeadm-config.yaml
    apiVersion: kubeadm.k8s.io/v1beta1
    kind: ClusterConfiguration
    networking:
      podSubnet: "10.244.0.0/16"
      serviceSubnet: "172.24.0.0/16"
    apiServer:
      certSANs:
      - "192.168.199.100" # IP-адрСс мастСр ΡƒΠ·Π»Π°
  3. Π£Π΄Π°Π»ΠΈΠΌ старыС crt ΠΈ key, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π±Π΅Π· этого Π½ΠΎΠ²Ρ‹ΠΉ сСртификат Π½Π΅ выпустится:
    rm /etc/kubernetes/pki/apiserver.{key,crt}
  4. ΠŸΠ΅Ρ€Π΅Π²Ρ‹ΠΏΡƒΡΡ‚ΠΈΠΌ сСртификаты для API-сСрвСра:
    kubeadm init phase certs apiserver --config=kubeadm-config.yaml
  5. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ, Ρ‡Ρ‚ΠΎ сСртификат выпустился для Π½ΠΎΠ²ΠΎΠΉ подсСти:
    openssl x509 -noout -ext subjectAltName </etc/kubernetes/pki/apiserver.crt
    X509v3 Subject Alternative Name:
        DNS:kube-2-master, DNS:kubernetes, DNS:kubernetes.default, DNS:kubernetes.default.svc, DNS:kubernetes.default.svc.cluster.local, IP Address:172.24.0.1, IP Address:10.0.0.163, IP Address:192.168.199.100
  6. ПослС пСрСвыпуска сСртификата API-сСрвСра пСрСзапустим Π΅Π³ΠΎ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€:
    docker ps | grep k8s_kube-apiserver | awk '{print $1}' | xargs docker restart
  7. ΠŸΠ΅Ρ€Π΅Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ ΠΊΠΎΠ½Ρ„ΠΈΠ³ для admin.conf:
    kubeadm alpha certs renew admin.conf
  8. ΠžΡ‚Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΡƒΠ΅ΠΌ Π΄Π°Π½Π½Ρ‹Π΅ Π² etcd:
    ./etcdhelper -cacert /etc/kubernetes/pki/etcd/ca.crt -cert /etc/kubernetes/pki/etcd/server.crt -key /etc/kubernetes/pki/etcd/server.key -endpoint https://127.0.0.1:2379 change-service-cidr 172.24.0.0/16 

    Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅! Π’ этот ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π² кластСрС пСрСстаСт Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ€Π΅Π·ΠΎΠ»Π²ΠΈΠ½Π³ Π΄ΠΎΠΌΠ΅Π½ΠΎΠ², Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π² ΡƒΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… pod’Π°Ρ… Π² /etc/resolv.conf прописан старый адрСс CoreDNS (kube-dns), Π° kube-proxy ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ» ΠΏΡ€Π°Π²ΠΈΠ»Π° iptables со старой подсСти Π½Π° Π½ΠΎΠ²ΡƒΡŽ. Π”Π°Π»Π΅Π΅ Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ написано ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°Ρ… ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ простой.

  9. ΠŸΠΎΠΏΡ€Π°Π²ΠΈΠΌ ConfigMap’Ρ‹ Π² пространствС ΠΈΠΌΠ΅Π½ kube-system:
    kubectl -n kube-system edit cm kubelet-config-1.16

    β€” здСсь Π·Π°ΠΌΠ΅Π½ΠΈΠΌ clusterDNS Π½Π° Π½ΠΎΠ²Ρ‹ΠΉ IP-адрСс сСрвиса kube-dns: kubectl -n kube-system get svc kube-dns.

    kubectl -n kube-system edit cm kubeadm-config

    β€” исправим data.ClusterConfiguration.networking.serviceSubnet Π½Π° Π½ΠΎΠ²ΡƒΡŽ ΠΏΠΎΠ΄ΡΠ΅Ρ‚ΡŒ.

  10. Π’Π°ΠΊ ΠΊΠ°ΠΊ измСнился адрСс kube-dns, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ kubelet Π½Π° всСх ΡƒΠ·Π»Π°Ρ…:
    kubeadm upgrade node phase kubelet-config && systemctl restart kubelet
  11. ΠžΡΡ‚Π°Π»ΠΎΡΡŒ ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ всС pod’Ρ‹ Π² кластСрС:
    kubectl get pods --no-headers=true --all-namespaces |sed -r 's/(S+)s+(S+).*/kubectl --namespace 1 delete pod 2/e'

ΠœΠΈΠ½ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ простоя

ΠœΡ‹ΡΠ»ΠΈ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°ΡƒΠ½Ρ‚Π°ΠΉΠΌ:

  1. ПослС ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ манифСстов control plane’а ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ сСрвис kube-dns, ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, с Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ kube-dns-tmp ΠΈ Π½ΠΎΠ²Ρ‹ΠΌ адрСсом 172.24.0.10.
  2. Π‘Π΄Π΅Π»Π°Ρ‚ΡŒ if Π² etcdhelper, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ сСрвис kube-dns.
  3. Π—Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π²ΠΎ всСх kubelet’Π°Ρ… адрСс ClusterDNS Π½Π° Π½ΠΎΠ²Ρ‹ΠΉ, ΠΏΡ€ΠΈ этом старый сСрвис ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ с Π½ΠΎΠ²Ρ‹ΠΌ.
  4. Π”ΠΎΠΆΠ΄Π°Ρ‚ΡŒΡΡ, ΠΏΠΎΠΊΠ° pod’Ρ‹ с прилоТСниями пСрСкатятся Π»ΠΈΠ±ΠΎ сами ΠΏΠΎ СстСствСнным ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ, Π»ΠΈΠ±ΠΎ Π² согласованноС врСмя.
  5. Π£Π΄Π°Π»ΠΈΡ‚ΡŒ сСрвис kube-dns-tmp ΠΈ ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ serviceSubnetCIDR для сСрвиса kube-dns.

Π­Ρ‚ΠΎΡ‚ ΠΏΠ»Π°Π½ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°ΡƒΠ½Ρ‚Π°ΠΉΠΌ Π΄ΠΎ ~ΠΌΠΈΠ½ΡƒΡ‚Ρ‹ β€” Π½Π° врСмя удалСния сСрвиса kube-dns-tmp ΠΈ Π·Π°ΠΌΠ΅Π½Ρ‹ подсСти для сСрвиса kube-dns.

ΠœΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ podNetwork

Π—Π°ΠΎΠ΄Π½ΠΎ ΠΌΡ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, ΠΊΠ°ΠΊ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ podNetwork с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ²ΡˆΠ΅Π³ΠΎΡΡ etcdhelper’Π°. ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ дСйствий получаСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ:

  • исправляСм ΠΊΠΎΠ½Ρ„ΠΈΠ³ΠΈ Π² kube-system;
  • исправляСм манифСст kube-controller-manager’Π°;
  • измСняСм podCIDR Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ Π² etcd;
  • ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ всС ΡƒΠ·Π»Ρ‹ кластСра.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎΠ± этих дСйствиях:

1. ΠœΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅ΠΌ ConfigMap’Ρ‹ Π² пространствС ΠΈΠΌΠ΅Π½ kube-system:

kubectl -n kube-system edit cm kubeadm-config

β€” исправляСм data.ClusterConfiguration.networking.podSubnet Π½Π° Π½ΠΎΠ²ΡƒΡŽ ΠΏΠΎΠ΄ΡΠ΅Ρ‚ΡŒ 10.55.0.0/16.

kubectl -n kube-system edit cm kube-proxy

β€” исправляСм data.config.conf.clusterCIDR: 10.55.0.0/16.

2. ΠœΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅ΠΌ манифСст controller-manager’Π°:

vim /etc/kubernetes/manifests/kube-controller-manager.yaml

β€” исправляСм --cluster-cidr=10.55.0.0/16.

3. Π‘ΠΌΠΎΡ‚Ρ€ΠΈΠΌ Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠ΅ значСния .spec.podCIDR, .spec.podCIDRs, .InternalIP, .status.addresses для всСх ΡƒΠ·Π»ΠΎΠ² кластСра:

kubectl get no -o json | jq '[.items[] | {"name": .metadata.name, "podCIDR": .spec.podCIDR, "podCIDRs": .spec.podCIDRs, "InternalIP": (.status.addresses[] | select(.type == "InternalIP") | .address)}]'

[
  {
    "name": "kube-2-master",
    "podCIDR": "10.244.0.0/24",
    "podCIDRs": [
      "10.244.0.0/24"
    ],
    "InternalIP": "192.168.199.2"
  },
  {
    "name": "kube-2-master",
    "podCIDR": "10.244.0.0/24",
    "podCIDRs": [
      "10.244.0.0/24"
    ],
    "InternalIP": "10.0.1.239"
  },
  {
    "name": "kube-2-worker-01f438cf-579f9fd987-5l657",
    "podCIDR": "10.244.1.0/24",
    "podCIDRs": [
      "10.244.1.0/24"
    ],
    "InternalIP": "192.168.199.222"
  },
  {
    "name": "kube-2-worker-01f438cf-579f9fd987-5l657",
    "podCIDR": "10.244.1.0/24",
    "podCIDRs": [
      "10.244.1.0/24"
    ],
    "InternalIP": "10.0.4.73"
  }
]

4. Π—Π°ΠΌΠ΅Π½ΠΈΠΌ podCIDR, внСся ΠΏΡ€Π°Π²ΠΊΠΈ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ Π² etcd:

./etcdhelper -cacert /etc/kubernetes/pki/etcd/ca.crt -cert /etc/kubernetes/pki/etcd/server.crt -key /etc/kubernetes/pki/etcd/server.key -endpoint https://127.0.0.1:2379 change-pod-cidr 10.55.0.0/16

5. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ, Ρ‡Ρ‚ΠΎ podCIDR Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ измСнился:

kubectl get no -o json | jq '[.items[] | {"name": .metadata.name, "podCIDR": .spec.podCIDR, "podCIDRs": .spec.podCIDRs, "InternalIP": (.status.addresses[] | select(.type == "InternalIP") | .address)}]'

[
  {
    "name": "kube-2-master",
    "podCIDR": "10.55.0.0/24",
    "podCIDRs": [
      "10.55.0.0/24"
    ],
    "InternalIP": "192.168.199.2"
  },
  {
    "name": "kube-2-master",
    "podCIDR": "10.55.0.0/24",
    "podCIDRs": [
      "10.55.0.0/24"
    ],
    "InternalIP": "10.0.1.239"
  },
  {
    "name": "kube-2-worker-01f438cf-579f9fd987-5l657",
    "podCIDR": "10.55.1.0/24",
    "podCIDRs": [
      "10.55.1.0/24"
    ],
    "InternalIP": "192.168.199.222"
  },
  {
    "name": "kube-2-worker-01f438cf-579f9fd987-5l657",
    "podCIDR": "10.55.1.0/24",
    "podCIDRs": [
      "10.55.1.0/24"
    ],
    "InternalIP": "10.0.4.73"
  }
]

6. По ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΈΠΌ всС ΡƒΠ·Π»Ρ‹ кластСра.

7. Если хотя Π±Ρ‹ Ρƒ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡƒΠ·Π»Π° ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ старый podCIDR, Ρ‚ΠΎ kube-controller-manager Π½Π΅ смоТСт Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒΡΡ, Π° pod’Ρ‹ Π² кластСрС Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ.

На самом Π΄Π΅Π»Π΅, ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ podCIDR ΠΌΠΎΠΆΠ½ΠΎ произвСсти ΠΈ ΠΏΡ€ΠΎΡ‰Π΅ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚Π°ΠΊ). Но вСдь Π½Π°ΠΌ Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π½Π°ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с etcd Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ случаи, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€Π°Π²ΠΊΠ° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Kubernetes Π² etcd β€” СдинствСнный Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚. (НапримСр, нСльзя просто Ρ‚Π°ΠΊ Π±Π΅Π· простоя ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρƒ Service ΠΏΠΎΠ»Π΅ spec.clusterIP.)

Π˜Ρ‚ΠΎΠ³

Π’ ΡΡ‚Π°Ρ‚ΡŒΠ΅ рассмотрСна Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π² etcd Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ, Ρ‚.Π΅. Π² ΠΎΠ±Ρ…ΠΎΠ΄ Kubernetes API. Иногда Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ позволяСт Π΄Π΅Π»Π°Ρ‚ΡŒ Β«Ρ…ΠΈΡ‚Ρ€Ρ‹Π΅ ΡˆΡ‚ΡƒΠΊΠΈΒ». ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ Π² тСкстС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΌΡ‹ тСстировали Π½Π° Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… K8s-кластСрах. Однако ΠΈΡ… статус готовности ΠΊ ΡˆΠΈΡ€ΠΎΠΊΠΎΠΌΡƒ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡŽ β€” PoC (proof of concept). ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ etcdhelper Π½Π° своих кластСрах, Π΄Π΅Π»Π°ΠΉΡ‚Π΅ это Π½Π° свой страх ΠΈ риск.

P.S.

Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅ Π² нашСм Π±Π»ΠΎΠ³Π΅:

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