БСспростойная миграция MongoDB Π² Kubernetes

БСспростойная миграция MongoDB Π² Kubernetes

Π­Ρ‚Π° ΡΡ‚Π°Ρ‚ΡŒΡ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ наш Π½Π΅Π΄Π°Π²Π½ΠΈΠΉ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» ΠΏΡ€ΠΎ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΡŽ RabbitMQ ΠΈ посвящСна MongoDB. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ обслуТиваСм мноТСство кластСров Kubernetes ΠΈ MongoDB, ΠΏΡ€ΠΈΡˆΠ»ΠΈ ΠΊ СстСствСнной нСобходимости ΠΌΠΈΠ³Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠΉ инсталляции Π² Π΄Ρ€ΡƒΠ³ΡƒΡŽ ΠΈ Π΄Π΅Π»Π°Ρ‚ΡŒ это Π±Π΅Π· простоя. ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ сцСнарии ΠΏΡ€Π΅ΠΆΠ½ΠΈΠ΅: пСрСнос MongoDB ΠΈΠ· Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ/ΠΆΠ΅Π»Π΅Π·Π½ΠΎΠ³ΠΎ сСрвСра Π² Kubernetes ΠΈΠ»ΠΈ ΠΆΠ΅ пСрСнос MongoDB Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΎΠ΄Π½ΠΎΠ³ΠΎ кластСра Kubernetes (ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ пространства ΠΈΠΌΡ‘Π½ Π² Π΄Ρ€ΡƒΠ³ΠΎΠ΅).

Наш Ρ€Π΅Ρ†Π΅ΠΏΡ‚ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для случаСв, ΠΊΠΎΠ³Π΄Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€ΡƒΠ΅Ρ‚ старый кластСр MongoDB (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΠ· 3 ΡƒΠ·Π»ΠΎΠ² ΠΈ находящийся Π»ΠΈΠ±ΠΎ ΡƒΠΆΠ΅ Π² K8s, Π»ΠΈΠ±ΠΎ Π½Π° старых сСрвСрах), с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Ρ€Π°Π·ΠΌΠ΅Ρ‰Ρ‘Π½Π½ΠΎΠ΅ Π² Kubernetes:

БСспростойная миграция MongoDB Π² Kubernetes

Как ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ кластСр Π² Π½ΠΎΠ²Ρ‹ΠΉ production Π² Kubernetes?

ВСория

ΠžΠ±Ρ‰ΠΈΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π΅Π½ описанному Π² ситуации с RabbitMQ.

Π’Π°ΠΆΠ½ΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ для возмоТности ΠΏΠ΅Ρ€Π΅Π΅Π·Π΄Π° трСбуСтся, Ρ‡Ρ‚ΠΎΠ±Ρ‹ сСрвСры с MongoDB ΠΈ Kubernetes Π½Π°Ρ…ΠΎΠ΄ΠΈΠ»ΠΈΡΡŒ Π² ΠΎΠ΄Π½ΠΎΠΉ сСти. Π£Π·Π»Ρ‹ кластСра MongoDB Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠ±Ρ‰Π°Ρ‚ΡŒΡΡ ΠΌΠ΅ΠΆΠ΄Ρƒ собой ΠΏΠΎ IP старых сСрвСров (Π³Π΄Π΅ находятся старыС инсталляции MongoDB) ΠΈ ΠΏΠΎ DNS-ΠΈΠΌΠ΅Π½Π°ΠΌ pod’ов с MongoDB Π² K8s. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π½Π° ΠΆΠ΅Π»Π΅Π·Π½Ρ‹Ρ… сСрвСрах (со старыми инсталляциями) потрСбуСтся ΠΏΡ€ΠΎΠ±Ρ€ΠΎΡΠΈΡ‚ΡŒ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Ρ‹ Π΄ΠΎ pod’ов, Π° Π·Π°Ρ‚Π΅ΠΌ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΈΡ… Π½Π° использованиС DNS-сСрвСра, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π΅Π³ΠΎ Π² Kubernetes (ΠΈΠ»ΠΈ ΠΆΠ΅ ΠΏΡ€ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ Π½ΡƒΠΆΠ½Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π° Π² /etc/hosts, хотя Π² ΠΎΠ±Ρ‰Π΅ΠΌ случаС Ρ‚Π°ΠΊΠΎΠΉ возмоТности Π»ΡƒΡ‡ΡˆΠ΅ ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ).

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ шаг β€” ΠΏΠΎΠ΄Π½ΡΡ‚ΡŒ кластСр MongoDB Π² pod’ах Kubernetes. Π’ нашСм случаС кластСр Π‘Π” состоит ΠΈΠ· 3 ΡƒΠ·Π»ΠΎΠ² ΠΈ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΡƒΠ·Π΅Π» располагаСтся Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ pod’С K8s β€” Π²ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, ΠΈΡ… число ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌ. Π’ ConfigMap’С Π½Π°Π΄ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ адрСс мастСра MongoDB ΠΈΠ· старой инсталляции: Ρ‚ΠΎΠ³Π΄Π° ΡƒΠ·Π»Ρ‹ MongoDB, находящиСся Π² pod’ах Π² K8s, сразу Π½Π°Ρ‡Π½ΡƒΡ‚ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·Π°Ρ†ΠΈΡŽ с Π½ΠΈΠΌ.

ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ всС pod’ы поднимутся, образуСтся кластСр MongoDB ΠΈΠ· 6 ΡƒΠ·Π»ΠΎΠ²:

БСспростойная миграция MongoDB Π² Kubernetes

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ pod’ы Π±ΡƒΠ΄ΡƒΡ‚ Π΄ΠΎΠ»Π³ΠΎ ΠΏΠΎΠ΄Π½ΠΈΠΌΠ°Ρ‚ΡŒΡΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ pod запускаСтся ΠΏΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ, Π° Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ запуска синхронизируСт Π΄Π°Π½Π½Ρ‹Π΅ с мастСра.

ПослС этого ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° использованиС Π½ΠΎΠ²Ρ‹Ρ… сСрвСров MongoDB:

БСспростойная миграция MongoDB Π² Kubernetes

И останСтся лишь ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ старыС ΡƒΠ·Π»Ρ‹ ΠΈΠ· кластСра MongoDB, послС Ρ‡Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π΅Π΅Π·Π΄ ΠΌΠΎΠΆΠ½ΠΎ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π·Π°Π²Π΅Ρ€ΡˆΡ‘Π½Π½Ρ‹ΠΌ:

БСспростойная миграция MongoDB Π² Kubernetes

Π’Π°ΠΊΡƒΡŽ схСму ΠΌΡ‹ часто примСняСм Π² production ΠΈ для удобства Π΅Ρ‘ использования Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π»ΠΈ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… модуля ΠΊ addon-operator (эту ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρƒ ΠΌΡ‹ Π½Π΅Π΄Π°Π²Π½ΠΎ анонсировали), Ρ‡Ρ‚ΠΎ позволяСт Ρ€Π°ΡΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡ‚ΡŒ Ρ‚ΠΈΠΏΠΎΠ²Ρ‹Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ MongoDB ΠΏΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠΌ кластСрам. ΠŸΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΡŽ своих ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ ΠΌΡ‹ ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΠ΅ΠΌ провСсти Π² скором Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Π° ΠΏΠΎΠΊΠ° прСдставляСм ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ инструкции, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π² дСйствии ΠΈ Π±Π΅Π· использования addon-operator.

ΠŸΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅

ВрСбования

Π Π΅ΠΊΠ²ΠΈΠ·ΠΈΡ‚Ρ‹:

  • ΠšΠ»Π°ΡΡ‚Π΅Ρ€ Kubernetes (ΠΏΠΎΠ΄ΠΎΠΉΠ΄Π΅Ρ‚ ΠΈ minikube);
  • ΠšΠ»Π°ΡΡ‚Π΅Ρ€ MongoDB (ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈ Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ Π½Π° bare metal, ΠΈ сдСлан ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ кластСр Π² Kubernetes ΠΈΠ· ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ Helm-Ρ‡Π°Ρ€Ρ‚Π°).

Π’ описанном Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ старый кластСр с MongoDB Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Π·Π²Π°Π½ mongo-old ΠΈ установлСн Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ кластСрС Kubernetes, Π³Π΄Π΅ Π² дальнСйшСм ΠΌΡ‹ установим ΠΈ Π½ΠΎΠ²Ρ‹ΠΉ (mongo-new).

Π“ΠΎΡ‚ΠΎΠ²ΠΈΠΌ старый кластСр

1. Для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΎΠΏΠΈΡΠ°Π½Π½ΡƒΡŽ схСму Π² дСйствии, создадим «старый» (Ρ‚.Π΅. ΠΏΠΎΠ΄Π»Π΅ΠΆΠ°Ρ‰ΠΈΠΉ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ) кластСр MongoDB прямо Π² Kubernetes (Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ ΠΈ Π½Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… сСрвСрах Π²Π½Π΅ K8s). Для этого скачаСм Helm-Ρ‡Π°Ρ€Ρ‚:

helm fetch --untar stable/mongodb-replicaset

… ΠΈ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΡ‚Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΡƒΠ΅ΠΌ Π΅Π³ΠΎ, настроив Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΡŽ:

auth:
  enabled: true
  adminUser: mongo
  adminPassword: pa33w0rd
  # metricsUser: metrics
  # metricsPassword: password
  # key: keycontent
  # existingKeySecret:
  # existingAdminSecret:
  # exisitingMetricsSecret:

Π’Π°ΠΊΠΆΠ΅ Π² values.yaml ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ сСртификаты ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠ΅.

2. Установим Ρ‡Π°Ρ€Ρ‚:

helm install . --name mongo-old --namespace mongo-old

ПослС этого Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΏΡƒΡ‰Π΅Π½Π° тСстовая «старая» инсталляция MongoDB:

kubectl --namespace=mongo-old get pods

БСспростойная миграция MongoDB Π² Kubernetes

Π—Π°ΠΉΠ΄Π΅ΠΌ Π² pod с Π΅Ρ‘ мастСром ΠΈ создадим Ρ‚Π΅ΡΡ‚ΠΎΠ²ΡƒΡŽ Π±Π°Π·Ρƒ:

kubectl --namespace=mongo-old exec -ti mongo-old-mongodb-replicaset-0 mongo
use admin
db.auth('mongo','password')
use music
db.artists.insert({ artistname: "The Tea Party" })
show dbs

БСспростойная миграция MongoDB Π² Kubernetes

Заходя Π² Ρ€Π°Π·Π½Ρ‹Π΅ pod’Ρ‹, я выяснил, Ρ‡Ρ‚ΠΎ мастСром являСтся mongo-old-mongodb-replicaset-0. Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, для Π±ΠΎΠ»Π΅Π΅ ΡƒΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ этого вопроса послС установки Helm-Ρ‡Π°Ρ€Ρ‚Π° выводится ΠΊΠΎΠΌΠ°Π½Π΄Π°, ΠΊΠ°ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ MASTER_POD. Π’ ΠΌΠΎΠ΅ΠΌ случаС (для mongo-old ΠΈΠ· 3 ΡƒΠ·Π»ΠΎΠ²) ΠΎΠ½Π° выглядит Π²ΠΎΡ‚ Ρ‚Π°ΠΊ:

for ((i = 0; i < 3; ++i)); do kubectl exec --namespace mongo-old mongo-old-mongodb-replicaset-$i -- sh -c 'mongo --eval="printjson(rs.isMaster())"'; done

На этом ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° старой инсталляции MongoDB, Π΄Π°Π½Π½Ρ‹Π΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅Π½ΠΎΡΠΈΡ‚ΡŒΡΡ, Π³ΠΎΡ‚ΠΎΠ²Π°.

ΠœΠΈΠ³Ρ€Π°Ρ†ΠΈΡ кластСра MongoDB

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ρ€Π°Π·Π²Π΅Ρ€Π½Ρ‘ΠΌ Π½ΠΎΠ²ΡƒΡŽ ΠΈΠ½ΡΡ‚Π°Π»Π»ΡΡ†ΠΈΡŽ MongoDB, которая Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² Kubernetes ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π² production.

NB: ΠžΠ±Ρ€Π°Ρ‰Π°ΡŽ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ такая ΠΆΠ΅ вСрсия MongoDB, Ρ‡Ρ‚ΠΎ ΠΈ Ρ€Π°Π½ΡŒΡˆΠ΅. Π’ ΠΈΠ½ΠΎΠΌ случаС Π΅ΡΡ‚ΡŒ риск ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ совмСстимости.

По Π°Π½Π°Π»ΠΎΠ³ΠΈΠΈ с ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΌ Ρ€Π°Π·Π΄Π΅Π»ΠΎΠΌ (Π³Π΄Π΅ ΠΌΡ‹ ΠΈΠΌΠΈΡ‚ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ Β«ΡΡ‚Π°Ρ€ΡƒΡŽΒ» инсталляции MongoDB), возьмСм ΡƒΠΆΠ΅ упомянутый Helm-Ρ‡Π°Ρ€Ρ‚ (ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ helm fetch) ΠΈ настроим Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΡŽ, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, Ссли ΠΎΠ½ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, исправим Ρ„Π°ΠΉΠ» init/on-start.sh, Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΠ² Π² Π½Π΅Π³ΠΎ Π½Π° 165 строкС адрСс мастСра, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ Π½Π° ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ этапС (ΠΈΠ»ΠΈ ΠΆΠ΅ извСстный Π²Π°ΠΌ ΠΏΠΎ инсталляции MongoDB Π½Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… сСрвСрах):

peers='mongo-old-mongodb-replicaset-0.mongo-old-mongodb-replicaset.mongo-old.svc.cluster.local:27017'

ΠœΡ‹ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ ΠΊ созданию Π½ΠΎΠ²ΠΎΠΉ инсталляции MongoDB:

helm install . --name mongo-new --namespace mongo-new

ДоТидаСмся, ΠΏΠΎΠΊΠ° ΡΡ‚Π°Ρ€Ρ‚ΡƒΡŽΡ‚ всС pod’ы (Ссли Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠ½ΠΎΠ³ΠΎ, Ρ‚ΠΎ ΠΈΡ… запуск ΠΌΠΎΠΆΠ΅Ρ‚ Π΄Π»ΠΈΡ‚ΡŒΡΡ часами):

БСспростойная миграция MongoDB Π² Kubernetes

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π΅Π»Π°Π΅ΠΌ exec Π² Π½ΠΎΠ²Ρ‹ΠΉ pod ΠΈ смотрим список Π±Π°Π·:

kubectl --namespace=mongo-new exec -ti mongo-new-mongodb-replicaset-0 mongo

БСспростойная миграция MongoDB Π² Kubernetes

Π”Π²Π° кластСра MongoDB ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½Π΅Π½Ρ‹ Π² ΠΎΠ΄ΠΈΠ½, состоящий ΠΈΠ· 6 ΡƒΠ·Π»ΠΎΠ².

На Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΡƒΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° Π½ΠΎΠ²Ρ‹ΠΉ кластСр, Π½ΠΎ для Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ нСсколько шагов.

Из Ρ„Π°ΠΉΠ»Π° init/on-start.sh Π² Π½ΠΎΠ²ΠΎΠΉ инсталляции ΡƒΠ±ΠΈΡ€Π°Π΅ΠΌ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½ΡƒΡŽ Π½Π°ΠΌΠΈ строку:

peers='mongo-old-mongodb-replicaset-0.mongo-old-mongodb-replicaset.mongo-old.svc.cluster.local:27017'

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π·Π°ΠΉΠ΄Π΅ΠΌ Π² старый мастСр кластСра ΠΈ «свСргнСм» Π΅Π³ΠΎ β€” Ρ‚ΠΎΠ³Π΄Π° Π² кластСрС Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Π·Π½Π°Ρ‡Π΅Π½ Π½ΠΎΠ²Ρ‹ΠΉ мастСр. Π—Π°Ρ…ΠΎΠ΄ΠΈΠΌ Π² pod с мастСром MongoDB:

kubectl --namespace=mongo-old exec -ti mongo-old-mongodb-replicaset-0 mongo
use admin
db.auth('mongo','password')

ПослС этого мСняСм ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Ρ‹ Ρƒ ΡƒΠ·Π»ΠΎΠ² ΠΈ мСняСм мастСра:

cfg = rs.conf()
cfg.members[5].priority = 2
rs.reconfig(cfg)
rs.stepDown(120)

Π’Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΡƒΠ·Π΅Π» пСрСстал Π±Ρ‹Ρ‚ΡŒ мастСром β€” ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄ΡƒΡ‚ Π²Ρ‹Π±ΠΎΡ€Ρ‹ Π½ΠΎΠ²ΠΎΠ³ΠΎ. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ помСняли ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Ρ‹, мастСром станСт Π½ΡƒΠΆΠ½Ρ‹ΠΉ Π½Π°ΠΌ ΡƒΠ·Π΅Π».

NB: По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρƒ всСх ΡƒΠ·Π»ΠΎΠ² MongoDB ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ Ρ€Π°Π²Π΅Π½ 1. Π’Ρ‹ΡˆΠ΅ ΠΌΡ‹ ΠΏΠΎΠ΄Π½ΠΈΠΌΠ°Π΅ΠΌ Π΄ΠΎ 2 ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ Ρƒ Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ Π½Π°ΠΌ ΡƒΠ·Π»Π°. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΎΠ±Ρ‰ΠΈΠΌ мастСром Ρ‚ΠΎΡ‡Π½ΠΎ становится Ρ‡Π»Π΅Π½ Π½ΠΎΠ²ΠΎΠ³ΠΎ кластСра. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ устроСны эти ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ Π² MongoDB, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ.

ΠžΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΠΌ ΡΡ‚Π°Ρ€ΡƒΡŽ ΠΈΠ½ΡΡ‚Π°Π»Π»ΡΡ†ΠΈΡŽ MongoDB, послС Ρ‡Π΅Π³ΠΎ Π·Π°ΠΉΠ΄Π΅ΠΌ Π² мастСр Π½ΠΎΠ²ΠΎΠΉ ΠΈ ΡƒΠ΄Π°Π»ΠΈΠΌ старыС ΡƒΠ·Π»Ρ‹:

rs.remove("mongo-old-mongodb-replicaset-0.mongo-old-mongodb-replicaset.mongo-old.svc.cluster.local:27017")
rs.remove("mongo-old-mongodb-replicaset-1.mongo-old-mongodb-replicaset.mongo-old.svc.cluster.local:27017")
rs.remove("mongo-old-mongodb-replicaset-2.mongo-old-mongodb-replicaset.mongo-old.svc.cluster.local:27017")

ПослС этого ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π·Π°ΠΊΠΎΠ½Ρ‡Π΅Π½Π½ΠΎΠΉ: ΠΌΡ‹ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡ΠΈΠ»ΠΈΡΡŒ со старого кластСра MongoDB Π½Π° Π½ΠΎΠ²Ρ‹ΠΉ!

Π˜Ρ‚ΠΎΠ³ΠΈ

Описанная схСма ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ практичСски для всСх случаСв, ΠΊΠΎΠ³Π΄Π° Π½ΡƒΠΆΠ½ΠΎ пСрСнСсти MongoDB ΠΈΠ»ΠΈ просто ΠΏΠ΅Ρ€Π΅Π΅Ρ…Π°Ρ‚ΡŒ Π² Π½ΠΎΠ²Ρ‹ΠΉ кластСр.

ΠŸΠΎΠΆΠ°Π»ΡƒΠΉ, Π³Π»Π°Π²Π½Ρ‹ΠΉ нюанс ΠΏΡ€ΠΈ пСрСносС β€” это Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ проброса IP-адрСсов Π½ΠΎΠ²Ρ‹Ρ… pod’ΠΎΠ² Π½Π° сСрвСры старой инсталляции MongoDB, Ссли ΠΎΠ½Π° находится Π²Π½Π΅ K8s, ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ ΠΈΡ… наимСнования Π² DNS (ΠΈΠ»ΠΈ /etc/hosts). Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ эти шаги Π½Π΅ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΈΡΡŒ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ миграция происходила ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ пространствами ΠΈΠΌΡ‘Π½ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Kubernetes-кластСра.

P.S.

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

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