Docs Menu

Kubernetes ์—ฐ์‚ฐ์ž ๋ฌธ์ œ ํ•ด๊ฒฐํ•˜๊ธฐ

์ด ํŽ˜์ด์ง€์˜ ๋‚ด์šฉ

์ค‘์š”

์ด ์„น์…˜์€ ๋‹จ์ผ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ ๋ฐฐํฌ์—๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋‹ค์ค‘ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ MongoDB ๋ฐฐํฌ์˜ ๊ฒฝ์šฐ ๋‹ค์ค‘ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์‚ฌ์šฉํ•œ ๋ฐฐํฌ ๋ฌธ์ œ ํ•ด๊ฒฐ ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

Kubernetes Operator์™€ ํ•จ๊ป˜ ๋ฐฐํฌ๋œ ๋ฆฌ์†Œ์Šค์˜ ์ƒํƒœ๋ฅผ ์ฐพ์œผ๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น ์ค‘ ํ•˜๋‚˜๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

  • Ops Manager ๋ฆฌ์†Œ์Šค ๋ฐฐํฌ์˜ ๊ฒฝ์šฐ:

    kubectl get <resource-name> -n <metadata.namespace> -o yaml
    • status.applicationDatabase.phase ํ•„๋“œ์—๋Š” Application Database ๋ฆฌ์†Œ์Šค ๋ฐฐํฌ ์ƒํƒœ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

    • status.backup.phase๋Š” ๋ฐฑ์—… ๋ฐ๋ชฌ ๋ฆฌ์†Œ์Šค ๋ฐฐํฌ ์ƒํƒœ๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

    • status.opsManager.phase ํ•„๋“œ๋Š” Ops Manager ๋ฆฌ์†Œ์Šค ๋ฐฐํฌ ์ƒํƒœ๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

    ์ฐธ๊ณ 

    Cloud Manager ๋˜๋Š” Ops Manager ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋‹ค์Œ ์„ค์ •์— ์ •์˜๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ์‹œํ•ฉ๋‹ˆ๋‹ค.

  • MongoDB ๋ฆฌ์†Œ์Šค ๋ฐฐํฌ์šฉ:

    kubectl get mdb <resource-name> -n <metadata.namespace> -o yaml

    status.phase ํ•„๋“œ๋Š” MongoDB ๋ฆฌ์†Œ์Šค ๋ฐฐํฌ ์ƒํƒœ๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ํ‚ค-๊ฐ’ ์Œ์€ ๋ฆฌ์†Œ์Šค ๋ฐฐํฌ ์ƒํƒœ๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

ํ‚ค
๊ฐ’

message

๋ฆฌ์†Œ์Šค๊ฐ€ Pending ๋˜๋Š” Failed ์ƒํƒœ์ธ ์ด์œ ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๋ฉ”์‹œ์ง€์ž…๋‹ˆ๋‹ค.

phase

์ƒํƒœ
์˜๋ฏธ

Pending

Kubernetes Operator๊ฐ€ ๋ฆฌ์†Œ์Šค ๋ฐฐํฌ ์ƒํƒœ๋ฅผ ์กฐ์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์กฐ์ • ์‹œ๊ฐ„์ด ์ดˆ๊ณผ๋˜๊ฑฐ๋‚˜ Kubernetes Operator์—์„œ ๋ฆฌ์†Œ์Šค๋ฅผ ์‹คํ–‰ ์ƒํƒœ๋กœ ์ „ํ™˜ํ•˜๊ธฐ ์œ„ํ•œ ์กฐ์น˜๋ฅผ ์ทจํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์กฐ์ • ์‹œ๊ฐ„์ด ์ดˆ๊ณผ๋˜์–ด ๋ฆฌ์†Œ์Šค๊ฐ€ ๋ณด๋ฅ˜ ์ค‘์ธ ๊ฒฝ์šฐ Kubernetes Operator๋Š” 10์ดˆ ๋‚ด์— ๋ฆฌ์†Œ์Šค ์ƒํƒœ ์กฐ์ •์„ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.

Pending

Kubernetes Operator๊ฐ€ ๋ฆฌ์†Œ์Šค ์ƒํƒœ๋ฅผ ์กฐ์ •ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธํ•œ ํ›„ ๋˜๋Š” Kubernetes Operator๊ฐ€ ์ด์ „์— Failed ์ƒํƒœ์˜€๋˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์กฐ์ •ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๋Š” ๊ฒฝ์šฐ, ๋ฆฌ์†Œ์Šค๊ฐ€ ํ•ด๋‹น ์ƒํƒœ์— ๋Œ์ž…ํ•ฉ๋‹ˆ๋‹ค.

Kubernetes Operator๋Š” 10์ดˆ ์— ๋ฆฌ์†Œ์Šค ์ƒํƒœ ์กฐ์ •์„ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.

Running

๋ฆฌ์†Œ์Šค๊ฐ€ ์ œ๋Œ€๋กœ ์‹คํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค.

Failed

๋ฆฌ์†Œ์Šค๊ฐ€ ์ œ๋Œ€๋กœ ์‹คํ–‰๋˜๊ณ  ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. message ํ•„๋“œ๋Š” ์ถ”๊ฐ€ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Kubernetes Operator๋Š” 10์ดˆ ์— ๋ฆฌ์†Œ์Šค ์ƒํƒœ ์กฐ์ •์„ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.

lastTransition

ISO ์˜ ํƒ€์ž„์Šคํƒฌํ”„ ๋งˆ์ง€๋ง‰ ์กฐ์ •์ด ๋ฐœ์ƒํ•œUTC์˜ ๋‚ ์งœ ๋ฐ ์‹œ๊ฐ„ 8601 ํ˜•์‹์ž…๋‹ˆ๋‹ค.

link

MongoDB Ops Manager URL์˜ ๋ฐฐํฌ .

backup.statusName

MongoDB ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•ด Kubernetes์—์„œ spec.backup.mode๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฐ์† ๋ฐฑ์—…์„ ํ™œ์„ฑํ™”ํ•œ ๊ฒฝ์šฐ ์ด ํ•„๋“œ๋Š” ๋ฐฑ์—… ์ƒํƒœ(์˜ˆ: backup.statusName:"STARTED")๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ํ‘œ์‹œ๋  ์ˆ˜ ์žˆ๋Š” ๊ฐ’์€ STARTED, STOPPED, TERMINATED ๋“ฑ์ž…๋‹ˆ๋‹ค.

๋ฆฌ์†Œ์Šค๋ณ„ ํ•„๋“œ

์ด๋Ÿฌํ•œ ํ•„๋“œ์— ๋Œ€ํ•œ ์„ค๋ช…์€ MongoDB ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฆฌ์†Œ์Šค ์‚ฌ์–‘์„ ์ฐธ์กฐํ•˜์„ธ์š”.

์˜ˆ์‹œ

developer ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์žˆ๋Š” my-replica-set๋กœ ๋ช…๋ช…๋œ ๋ณต์ œ๋ณธ ์„ธํŠธ์˜ ์ƒํƒœ๋ฅผ ๋ณด๋ ค๋ฉด ๋‹ค์Œ์„ ์‹คํ–‰ํ•˜์„ธ์š”:

kubectl get mdb my-replica-set -n developer -o yaml

my-replica-set ์ด ์‹คํ–‰ ์ค‘์ด๋ฉด ๋‹ค์Œ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

status:
lastTransition: "2019-01-30T10:51:40Z"
link: http://ec2-3-84-128-187.compute-1.amazonaws.com:9080/v2/5c503a8a1b90141cbdc60a77
members: 1
phase: Running
version: 4.2.2-ent

my-replica-set๊ฐ€ ์‹คํ–‰ ์ค‘์ด ์•„๋‹Œ ๊ฒฝ์šฐ ๋‹ค์Œ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค:

status:
lastTransition: 2019-02-01T13:00:24Z
link: http://ec2-34-204-36-217.compute-1.amazonaws.com:9080/v2/5c51c040d6853d1f50a51678
members: 1
message: 'Failed to create/update replica set in Ops Manager: Status: 400 (Bad Request),
Detail: Something went wrong validating your Automation Config. Sorry!'
phase: Failed
version: 4.2.2-ent

๋ฌธ์ œ๋ฅผ ๋””๋ฒ„๊น…ํ•˜๊ณ  ํด๋Ÿฌ์Šคํ„ฐ ํ™œ๋™์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋„๋ก ์ถฉ๋ถ„ํ•œ ๋กœ๊ทธ๋ฅผ ๋ณด๊ด€ํ•˜๊ณ  ๊ฒ€ํ† ํ•ฉ๋‹ˆ๋‹ค. ๊ถŒ์žฅ ๋กœ๊น… ์•„ํ‚คํ…์ฒ˜ ์‚ฌ์šฉ Pod ์œ ์ง€ Pod๊ฐ€ ์‚ญ์ œ๋œ ํ›„์—๋„ ๋กœ๊ทธ๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

Kubernetes Operator๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐฐํฌ ํŒŒ๋“œ์˜ MongoDB Agent ๋ฐ mongod ์ปดํฌ๋„ŒํŠธ์˜ ๋กœ๊ทธ๋ฅผ ๋‹ค์Œ JSON ํ˜•์‹์˜ ๊ตฌ์กฐํ™”๋œ ๋กœ๊น… ํ•ญ๋ชฉ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ž˜ํผ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ๋“œ ๋กœ๊ทธ์— ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

{ "logType": "<log-type>", "contents": "<log line from a log file>" }

Kubernetes Operator๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋กœ๊ทธ ์œ ํ˜•์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค:

  • automation-agent-verbose

  • automation-agent-stderr

  • mongodb

  • mongodb-audit

  • agent-launcher-script

  • automation-agent

  • monitoring-agent

  • backup-agent

Kubernetes Operator๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋กœ๊ทธ๋ฅผ ์ฝ์„ ๋•Œ ๋‹ค์–‘ํ•œ ์†Œ์Šค์˜ ๋กœ๊ทธ๋ฅผ ํฌํ•จํ•˜๋Š” ๊ตฌ์กฐํ™”๋œ JSON ํ•ญ๋ชฉ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

Kubernetes Operator ๋กœ๊ทธ๋ฅผ ๊ฒ€ํ† ํ•˜๋ ค๋ฉด ์ด ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

kubectl logs -f deployment/mongodb-enterprise-operator -n <metadata.namespace>

MongoDB Ops Manager ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•˜์—ฌ MongoDB Ops Manager ์— ๋ณด๊ณ ๋œ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ pods๋ฅผ ์ฐพ์œผ๋ ค๋ฉด ๋จผ์ € ์ด ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์„ธ์š”:

kubectl get pods -n <metadata.namespace>

ํŒ

๋‹ค์Œ๋„ ์ฐธ์กฐํ•˜์„ธ์š”.

kubectl get์—๋Œ€ํ•œ Kubernetes ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

ํŠน์ • ํŒŒ๋“œ๋กœ ๋ฆฌ๋ทฐ ๋ฒ”์œ„๋ฅผ ์ขํžˆ๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

kubectl logs <podName> -n <metadata.namespace>

์˜ˆ์‹œ

๋ณต์ œ๋ณธ ์„ธํŠธ ์— myrs ๋ ˆ์ด๋ธ”์ด ์ง€์ •๋˜์–ด ์žˆ์œผ๋ฉด ๋‹ค์Œ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

kubectl logs myrs-0 -n <metadata.namespace>

๊ทธ๋Ÿฌ๋ฉด ์ด ๋ณต์ œ๋ณธ ์„ธํŠธ์— ๋Œ€ํ•œ ์ž๋™ํ™” ์—์ด์ „ํŠธ ๋กœ๊ทธ๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

ํŠน์ • ๋กœ๊ทธ ์œ ํ˜•์œผ๋กœ ๊ฒ€ํ†  ๋ฒ”์œ„๋ฅผ ์ขํž ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ ๋ช…๋ น์–ด๋Š” mongodb-audit ๋กœ๊ทธ ์œ ํ˜•์„ ์ง€์ •ํ•˜์—ฌ ์ง€์ •๋œ Pod์˜ Kubernetes ๋กœ๊ทธ์—์„œ ๊ฐ์‚ฌ ๋กœ๊ทธ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

kubectl logs -c mongodb-enterprise-database replica-set-0 | jq -r 'select(.logType == "mongodb-audit") | .contents'

์ด ๋ช…๋ น์€ ๋‹ค์Œ ์ถœ๋ ฅ๊ณผ ์œ ์‚ฌํ•œ ํ•ญ๋ชฉ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

{{{ "atype":"startup","ts":{"$date":"2023-08-30T20:43:54.649+00:00"},"uuid":{"$binary":"oDcPEY69R1yiUtpMupaXOQ==","$type":"04"},"local":{"isSystemUser":true},"remote":{"isSystemUser":true},"users":[],"roles":[],"param":{"options":{"auditLog":{"destination":"file","format":"JSON","path":"/var/log/mongodb-mms-automation/mongodb-audit.log"},"config":"/data/automation-mongod.conf","net":{"bindIp":"0.0.0.0","port":27017,"tls":{"mode":"disabled"}},"processManagement":{"fork":true},"replication":{"replSetName":"replica-set"},"storage":{"dbPath":"/data","engine":"wiredTiger"},"systemLog":{"destination":"file","path":"/var/log/mongodb-mms-automation/mongodb.log"}}},"result":0}
{"atype":"startup","ts":{"$date":"2023-08-30T20:44:05.466+00:00"},"uuid":{"$binary":"OUbUWC1DQM6k/Ih4hKZq4g==","$type":"04"},"local":{"isSystemUser":true},"remote":{"isSystemUser":true},"users":[],"roles":[],"param":{"options":{"auditLog":{"destination":"file","format":"JSON","path":"/var/log/mongodb-mms-automation/mongodb-audit.log"},"config":"/data/automation-mongod.conf","net":{"bindIp":"0.0.0.0","port":27017,"tls":{"mode":"disabled"}},"processManagement":{"fork":true},"replication":{"replSetName":"replica-set"},"storage":{"dbPath":"/data","engine":"wiredTiger"},"systemLog":{"destination":"file","path":"/var/log/mongodb-mms-automation/mongodb.log"}}},"result":0}}}

Kubernetes Pod์˜ ๋กœ๊ทธ์— ๊ฐ์‚ฌ ๋กœ๊ทธ๋ฅผ ํฌํ•จํ•˜๋ ค๋ฉด ๋ฆฌ์†Œ์Šค ์ •์˜์— ๋‹ค์Œ additionalMongodConfig.auditLog ๊ตฌ์„ฑ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ œ๊ณต๋œ ํŒŒ์ผ ์ด๋ฆ„์€ ํ•„์š”์— ๋”ฐ๋ผ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

spec:
additionalMongodConfig:
auditLog:
destination: file
format: JSON
path: /var/log/mongodb-mms-automation/mongodb-audit.log

Kubernetes Operator๋Š” ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์›นํ›„ํฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ์ž˜๋ชป๋œ ๋ฆฌ์†Œ์Šค ์ •์˜๋ฅผ ์ ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์›นํ›„ํฌ๋Š” ์œ ํšจํ•˜์ง€ ์•Š์€ ์š”์ฒญ์„ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค.

ClusterRole ๋ฐ ClusterRoleBinding ์›นํ›…์šฉ ์€ ์„ค์น˜ ์ค‘์— ์ ์šฉํ•˜๋Š” ๊ธฐ๋ณธ ๊ตฌ์„ฑ ํŒŒ์ผ์— ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์—ญํ•  ๋ฐ ๋ฐ”์ธ๋”ฉ์„ ๋งŒ๋“ค๋ ค๋ฉด ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ์ž ๊ถŒํ•œ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ž˜๋ชป๋œ ๋ฆฌ์†Œ์Šค ์ •์˜๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ์›นํ›„ํฌ๋Š” ์˜ค๋ฅ˜๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ์…ธ์— ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

error when creating "my-ops-manager.yaml":
admission webhook "ompolicy.mongodb.com" denied the request:
shardPodSpec field is not configurable for application databases as
it is for sharded clusters and appdb replica sets

Kubernetes Operator๋Š” ๊ฐ ๋ฆฌ์†Œ์Šค๋ฅผ ์กฐ์ •ํ•  ๋•Œ ํ•ด๋‹น ๋ฆฌ์†Œ์Šค์˜ ์œ ํšจ์„ฑ๋„ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค. Kubernetes Operator๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์›น ํ›„ํฌ๋ฅผ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์›นํ›„ํฌ๋ฅผ ์ƒ๋žตํ•˜๊ฑฐ๋‚˜, ๊ธฐ๋ณธ ๊ตฌ์„ฑ์—์„œ ์›นํ›„ํฌ์˜ ์—ญํ• ๊ณผ ๋ฐ”์ธ๋”ฉ์„ ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ ๊ตฌ์„ฑ์„ ์‹คํ–‰ํ•  ๊ถŒํ•œ์ด ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ด๋Š” ์‹ฌ๊ฐํ•œ ์˜ค๋ฅ˜๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ Kubernetes Operator๊ฐ€ ๊ฒฝ๊ณ ๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. Kubernetes Operator์— ์‹ฌ๊ฐํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋ฆฌ์†Œ์Šค๋ฅผ Failed๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ 

GKE(Google Kubernetes Engine) ๋ฐฐํฌ

GKE(Google Kubernetes Engine) ๋น„๊ณต๊ฐœ ํด๋Ÿฌ์Šคํ„ฐ์— ๋ฐฐํฌํ•  ๋•Œ ์›นํ›…์— ์•Œ๋ ค์ง„ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ Google ๋ฐฉํ™”๋ฒฝ ๊ทœ์น™์„ ์—…๋ฐ์ดํŠธํ•˜์—ฌ WebHook ๋ฌธ์ œ ํ•ด๊ฒฐ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

์ œ๊ณต๋œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ MongoDB ๋ฆฌ์†Œ์Šค ์‚ฌ์–‘์„ ๋ชจ๋‘ ๋ณด๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

kubectl get mdb -n <metadata.namespace>

์˜ˆ์‹œ

dublin ๋…๋ฆฝํ˜• ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์„ ๋ณด๋ ค๋ฉด ์ด ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์„ธ์š”:

kubectl get mdb dublin -n <metadata.namespace> -o yaml

๊ทธ๋Ÿฌ๋ฉด ๋‹ค์Œ ์‘๋‹ต์ด ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

apiVersion: mongodb.com/v1
kind: MongoDB
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"mongodb.com/v1","kind":"MongoDB","metadata":{"annotations":{},"name":"dublin","namespace":"mongodb"},"spec":{"credentials":"credentials","persistent":false,"podSpec":{"memory":"1Gi"},"project":"my-om-config","type":"Standalone","version":"4.0.0-ent"}}
clusterDomain: ""
creationTimestamp: 2018-09-12T17:15:32Z
generation: 1
name: dublin
namespace: mongodb
resourceVersion: "337269"
selfLink: /apis/mongodb.com/v1/namespaces/mongodb/mongodbstandalones/dublin
uid: 7442095b-b6af-11e8-87df-0800271b001d
spec:
credentials: my-credentials
type: Standalone
persistent: false
project: my-om-config
version: 4.2.2-ent

StatefulSet ํŒŒ๋“œ Pending ๋ฐฐํฌ ์ค‘์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ƒํƒœ๋กœ ์ค‘๋‹จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Pending Pods ์˜ค๋ฅ˜๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๊ตฌ์„ฑ์„ ๋ณ€๊ฒฝ ํ•˜๊ณ  ์ ์šฉ ํ•˜๋”๋ผ๋„ ์ž๋™์œผ๋กœ ์ข…๋ฃŒ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

StatefulSet๋ฅผ ์ •์ƒ ์ƒํƒœ๋กœ ๋˜๋Œ๋ฆฌ๋ ค๋ฉด Pending ์ƒํƒœ์˜ MongoDB ๋ฆฌ์†Œ์Šค์— ๊ตฌ์„ฑ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ ์šฉํ•œ ๋‹ค์Œ ํ•ด๋‹น pods๋ฅผ ์‚ญ์ œํ•˜์„ธ์š”.

์˜ˆ์‹œ

ํ˜ธ์ŠคํŠธ ์‹œ์Šคํ…œ์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํŒŒ๋“œ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

kubectl get pods
my-replica-set-0 1/1 Running 2 2h
my-replica-set-1 1/1 Running 2 2h
my-replica-set-2 0/1 Pending 0 2h

my-replica-set-2 Pending ๋‹จ๊ณ„์—์„œ ๋ฉˆ์ท„์Šต๋‹ˆ๋‹ค. ์˜ค๋ฅ˜์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

kubectl describe pod my-replica-set-2
<describe output omitted>
Warning FailedScheduling 15s (x3691 over 3h) default-scheduler
0/3 nodes are available: 1 node(s) had taints that the pod
didn't tolerate, 2 Insufficient memory.

์ถœ๋ ฅ์— ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ์˜ค๋ฅ˜๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

๊ตฌ์„ฑ ์—…๋ฐ์ดํŠธ๋ฅผ ์ ์šฉํ•œ ํ›„์—๋„ pod๊ฐ€ ์ž๋™์œผ๋กœ ์ข…๋ฃŒ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— MongoDB ๋ฆฌ์†Œ์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ์—…๋ฐ์ดํŠธ๊ฐ€ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ๊ตฌ์„ฑ์„ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ๊ตฌ์„ฑ์„ ์ ์šฉํ•œ ๋‹ค์Œ ์ค‘๋‹จ๋œ ํŒŒ๋“œ๋ฅผ ์‚ญ์ œํ•˜์„ธ์š”.

vi <my-replica-set>.yaml
kubectl apply -f <my-replica-set>.yaml
kubectl delete pod my-replica-set-2

์ •์ง€๋œ Pod๊ฐ€ ์‚ญ์ œ๋˜๋ฉด Statefulset ๋กค๋ง ์—…๊ทธ๋ ˆ์ด๋“œ์˜ ์ผ๋ถ€๋กœ ๋‹ค๋ฅธ Pod๊ฐ€ ์ƒˆ ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•ด ๋‹ค์‹œ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ 

์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด๋ ค๋ฉด Kubernetes ๋ฌธ์ œ ๋ฅผ 67250 ์ฐธ์กฐํ•˜์„ธ์š”.

kubectl apply ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฏธ ๋ฐฐํฌ๋œ ๋ฆฌ์†Œ์Šค ConfigMap ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์žฌ๋ฐฐํฌํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ๋‹ค์Œ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

kubectl replace -f <my-config-map>.yaml

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ConfigMap ๋ฆฌ์†Œ์Šค ํŒŒ์ผ์ด ์‚ญ์ œ๋˜๊ณ  ๋‹ค์‹œ ๋งŒ๋“ค์–ด์ง‘๋‹ˆ๋‹ค.

์ด ๋ช…๋ น์€ ์ฆ‰๊ฐ์ ์ธ ์žฌ๊ท€์  ๋ณ€๊ฒฝ์„ ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜ ํ•œ ๋ฒˆ ์ดˆ๊ธฐํ™”ํ•˜๋ฉด ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์—†๋Š” ๋ฆฌ์†Œ์Šค ํŒŒ์ผ์„ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ค‘์š”

๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•˜๋ ค๋ฉด ๋‹ค์Œ ๊ถŒํ•œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค:

  • mongodb-enterprise-operator-mongodb-webhook

  • mongodb-enterprise-operator-mongodb-certs

  • mongodb-enterprise-operator-mongodb-webhook-binding

  • mongodb-enterprise-operator-mongodb-certs

Kubernetes๊ฐ€ ๋ฐฐํฌํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ œ๊ฑฐํ•˜๋ ค๋ฉด Kubernetes๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ค‘์š”

์˜ˆ์‹œ

Kubernetes๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑํ•œ ๋‹จ์ผ MongoDB ์ธ์Šคํ„ด์Šค๋ฅผ ์ œ๊ฑฐํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

kubectl delete mdb <name> -n <metadata.namespace>

Kubernetes๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑํ•œ ๋ชจ๋“  MongoDB ์ธ์Šคํ„ด์Šค๋ฅผ ์ œ๊ฑฐํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

kubectl delete mdb --all -n <metadata.namespace>

Kubernetes Operator๋ฅผ ์ œ๊ฑฐํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ๋ชจ๋“  Kubernetes ๋ฆฌ์†Œ์Šค๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

    kubectl delete mdb --all -n <metadata.namespace>
  2. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜คํผ๋ ˆ์ดํ„ฐ ์ œ๊ฑฐ:

    kubectl delete deployment mongodb-enterprise-operator -n <metadata.namespace>

CustomResourceDefinitions ๋ฅผ ์ œ๊ฑฐํ•˜๋ ค๋ฉด :

  1. ๋ชจ๋“  Kubernetes ๋ฆฌ์†Œ์Šค๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

    kubectl delete mdb --all -n <metadata.namespace>
  2. CustomResourceDefinitions ์ œ๊ฑฐ:

    kubectl delete crd mongodb.mongodb.com
    kubectl delete crd mongodbusers.mongodb.com
    kubectl delete crd opsmanagers.mongodb.com

๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋ฅผ ์ œ๊ฑฐํ•˜๋ ค๋ฉด :

  1. ๋ชจ๋“  Kubernetes ๋ฆฌ์†Œ์Šค๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

    kubectl delete mdb --all -n <metadata.namespace>
  2. ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ œ๊ฑฐ :

    kubectl delete namespace <metadata.namespace>

์‹ค์ˆ˜๋กœ MongoDB ๋ณต์ œ๋ณธ ์„ธํŠธ ํŒŒ๋“œ ๋ฐ ํ•ด๋‹น ์˜๊ตฌ ๋ณผ๋ฅจ ํด๋ ˆ์ž„์„ ์‚ญ์ œํ•œ ๊ฒฝ์šฐ Kubernetes Operator๋Š” MongoDB ํŒŒ๋“œ๋ฅผ ๋‹ค์‹œ ์˜ˆ์•ฝํ•˜์ง€ ๋ชปํ•˜๊ณ  ๋‹ค์Œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐœํ–‰ํ•ฉ๋‹ˆ๋‹ค.

scheduler error: pvc not found to schedule the pod

์ด ์˜ค๋ฅ˜๋ฅผ ๋ณต๊ตฌํ•˜๋ ค๋ฉด ์ƒˆ PVC๋ฅผ ์ˆ˜๋™์œผ๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ณต์ œ๋ณธ ์„ธํŠธ Pod์— ํ•ด๋‹นํ•˜๋Š” PVC ๊ฐ์ฒด์˜ ์ด๋ฆ„(์˜ˆ:data-<replicaset-pod-name> ์œผ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

Kubernetes Operator๋ฅผ ํ†ตํ•ด MongoDB Ops Manager ํ”„๋กœ์ ํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒฝ์šฐ, Kubernetes Operator๋Š” ํ”„๋กœ์ ํŠธ์— EXTERNALLY_MANAGED_LOCK ๊ธฐ๋Šฅ ์ œ์–ด ์ •์ฑ… ์„ ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ •์ฑ…์€ Kubernetes Operator ๊ตฌ์„ฑ์„ ์†์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” MongoDB Ops Manager ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํŠน์ • ๊ธฐ๋Šฅ์„ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ฐจ๋‹จ๋œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ๊ธฐ๋Šฅ ์ œ์–ด API ๋ฅผ ํ†ตํ•ด ์ •์ฑ…์„ ์ œ๊ฑฐํ•˜๊ณ  MongoDB Ops Manager ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ณ€๊ฒฝํ•œ ๋‹ค์Œ API ๋ฅผ ํ†ตํ•ด ์›๋ž˜ ์ •์ฑ…์„ ๋ณต์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒฝ๊ณ 

๋‹ค์Œ ์ ˆ์ฐจ๋ฅผ ํ†ตํ•ด Kubernetes ์—ฐ์‚ฐ์ž์— ์˜ํ•ด ์ฐจ๋‹จ๋˜๋Š” Ops Manager ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. MongoDB Ops Manager ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ๊ธฐ๋Šฅ ์ œ์–ด ์ •์ฑ… ์„ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.

    curl --user "{USERNAME}:{APIKEY}" --digest \
    --header "Accept: application/json" \
    --header "Content-Type: application/json" \
    --include \
    --request GET "https://{OPSMANAGER-HOST}:{PORT}/api/public/v1.0/groups/{PROJECT-ID}/controlledFeature?pretty=true"

    API๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ์‘๋‹ต์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. Ops Manager ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ณ€๊ฒฝํ•œ ํ›„์—๋Š” ์ด๋Ÿฌํ•œ ์ •์ฑ…์„ ํ”„๋กœ์ ํŠธ์— ๋‹ค์‹œ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    ์ค‘์š”

    ๋‹ค์Œ ์ƒ˜ํ”Œ ์‘๋‹ต์—์„œ ๊ฐ•์กฐ ํ‘œ์‹œ๋œ ํ•„๋“œ์™€ ๊ฐ’์— ์ฃผ๋ชฉํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ ์ œ์–ด ์ •์ฑ…์„ ์ œ๊ฑฐํ•˜๊ณ  ์ถ”๊ฐ€ํ•  ๋•Œ ์ดํ›„ ๋‹จ๊ณ„์—์„œ ์ด์™€ ๋™์ผํ•œ ํ•„๋“œ์™€ ๊ฐ’์„ ๋ณด๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    externalManagementSystem.version ํ•„๋“œ๋Š” Kubernetes ์—ฐ์‚ฐ์ž ๋ฒ„์ „์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ์ด ์ž‘์—…์˜ ๋’ท๋ถ€๋ถ„์—์„œ ์š”์ฒญ์— ์ •ํ™•ํžˆ ๋™์ผํ•œ ํ•„๋“œ ๊ฐ’์„ ๋ณด๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    ์‘๋‹ต์€ ๋‹ค์Œ๊ณผ ๋น„์Šทํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    {
    "created": "2020-02-25T04:09:42Z",
    "externalManagementSystem": {
    "name": "mongodb-enterprise-operator",
    "systemId": null,
    "version": "1.4.2"
    },
    "policies": [
    {
    "disabledParams": [],
    "policy": "EXTERNALLY_MANAGED_LOCK"
    },
    {
    "disabledParams": [],
    "policy": "DISABLE_AUTHENTICATION_MECHANISMS"
    }
    ],
    "updated": "2020-02-25T04:10:12Z"
    }
  2. policies ๋ฐฐ์—ด์„ ๋นˆ ๋ชฉ๋ก์œผ๋กœ ์—…๋ฐ์ดํŠธ ํ•ฉ๋‹ˆ๋‹ค.

    ์ฐธ๊ณ 

    externalManagementSystem.version ํ•„๋“œ์™€ ๊ฐ™์ด externalManagementSystem ๊ฐ์ฒด์— ์ œ๊ณตํ•˜๋Š” ๊ฐ’์€ 1๋‹จ๊ณ„์˜ ์‘๋‹ต์—์„œ ๋ฐ›์€ ๊ฐ’๊ณผ ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    curl --user "{USERNAME}:{APIKEY}" --digest \
    --header "Accept: application/json" \
    --header "Content-Type: application/json" \
    --include \
    --request PUT "https://{OPSMANAGER-HOST}:{PORT}/api/public/v1.0/groups/{PROJECT-ID}/controlledFeature?pretty=true" \
    --data
    '{
    "externalManagementSystem": {
    "name": "mongodb-enterprise-operator",
    "systemId": null,
    "version": "1.4.2"
    },
    "policies": []
    }'

    ์ด์ „์— ์ฐจ๋‹จ๋˜์—ˆ๋˜ ๊ธฐ๋Šฅ์„ ์ด์ œ Ops Manager ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  3. Ops Manager ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ณ€๊ฒฝ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  4. policies ๋ฐฐ์—ด์„ ์›๋ž˜ ๊ธฐ๋Šฅ ์ œ์–ด ์ •์ฑ…์œผ๋กœ ์—…๋ฐ์ดํŠธ ํ•ฉ๋‹ˆ๋‹ค.

    ์ฐธ๊ณ 

    externalManagementSystem.version ํ•„๋“œ์™€ ๊ฐ™์ด externalManagementSystem ๊ฐ์ฒด์— ์ œ๊ณตํ•˜๋Š” ๊ฐ’์€ 1๋‹จ๊ณ„์˜ ์‘๋‹ต์—์„œ ๋ฐ›์€ ๊ฐ’๊ณผ ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    curl --user "{USERNAME}:{APIKEY}" --digest \
    --header "Accept: application/json" \
    --header "Content-Type: application/json" \
    --include \
    --request PUT "https://{OPSMANAGER-HOST}:{PORT}/api/public/v1.0/groups/{PROJECT-ID}/controlledFeature?pretty=true" \
    --data
    '{
    "externalManagementSystem": {
    "name": "mongodb-enterprise-operator",
    "systemId": null,
    "version": "1.4.2"
    },
    "policies": [
    {
    "disabledParams": [],
    "policy": "EXTERNALLY_MANAGED_LOCK"
    },
    {
    "disabledParams": [],
    "policy": "DISABLE_AUTHENTICATION_MECHANISMS"
    }
    ]
    }'

    ์ด์ œ ๊ธฐ๋Šฅ์ด ๋‹ค์‹œ ์ฐจ๋‹จ๋˜์–ด Ops Manager ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ†ตํ•ด ๋” ์ด์ƒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Kubernetes Operator๋Š” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋™์•ˆ Ops Manager ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ณ€๊ฒฝํ•œ ๋‚ด์šฉ์„ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

Operator๋ฅผ ํ†ตํ•ด MongoDB ์‚ฌ์šฉ์ž ์ง€์ • ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ญ์ œํ•˜๋ฉด Kubernetes Kubernetes Operator๊ฐ€ Cloud Manager ๋˜๋Š” MongoDB Ops Manager์—์„œ ๋ฐฐํฌ ์ œ๊ฑฐ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ ์€ MongoDB ๋ฆฌ์†Œ์Šค ์ œ๊ฑฐ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๊ทธ๋Ÿฌ๋‚˜ Kubernetes ์—์„œ๋Š” ๋ฆฌ์†Œ์Šค ์ œ๊ฑฐ๊ฐ€ ์‹คํŒจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ์˜ˆ์‹œ ,Kubernetes MongoDB ๋ฆฌ์†Œ์Šค ๋ฅผ ์‚ญ์ œ ํ•˜๊ธฐ ์ „์— Operator๊ฐ€ ์‹คํŒจํ•˜๋ฉด Cloud Manager ๋˜๋Š” ์—์„œ ์ˆ˜๋™์œผ๋กœ ๋ฐฐํฌ์„œ๋ฒ„๋ฅผ ์ œ๊ฑฐ ํ•˜๊ณ  ํ•ด๋‹น ํ”„๋กœ์ ํŠธ๋ฅผ ์‚ญ์ œ ํ•ด์•ผ MongoDB Ops Manager ํ•ฉ๋‹ˆ๋‹ค.

MongoDB Ops Manager ๋˜๋Š” Cloud Manager ๋ฆฌ์†Œ์Šค๋ฅผ ์ˆ˜๋™์œผ๋กœ ์ œ๊ฑฐํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. MongoDB Ops Manager ๊ธฐ๋Šฅ ์ œ์–ด๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.

  2. UI ๋˜๋Š” ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์ ํŠธ์˜ MongoDB Ops Manager ๋˜๋Š” ์—์„œ ๋ฐฐํฌ์„œ๋ฒ„๋ฅผ Cloud Manager API ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

    MongoDB Ops Manager ๋˜๋Š” Cloud Manager UI์—์„œ ๋ฐฐํฌ์„œ๋ฒ„๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. MongoDB Ops Manager ์˜ Automation์—์„œ ๋ฐฐํฌ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  Monitoring์—์„œ ๋ฐฐํฌ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

    Cloud Manager ์˜ Automation์—์„œ ๋ฐฐํฌ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  Monitoring์—์„œ ๋ฐฐํฌ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

    ๋˜๋Š” API MongoDB Ops Manager ๋˜๋Š” ์—์„œ MongoDB Cloud Manager Ops Manager API ์š”์ฒญ ๋˜๋Š” ์š”์ฒญ์„ ํ†ตํ•ด ๋นˆ ๊ตฌ์„ฑ์œผ๋กœ ์ž๋™ํ™” Cloud Manager API ๊ตฌ์„ฑ์„ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ์œ„ํ•œ ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐํฌ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

    ๋‹ค์Œ MongoDB Ops Manager ์˜ˆ์‹œ์™€ ์œ ์‚ฌํ•œ ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    curl --user "{USERNAME}:{APIKEY}" --digest \
    --header "Content-Type: application/json" \
    --include \
    --request PUT "https://{OPSMANAGER-HOST}/api/public/v1.0/groups/{PROJECT-ID}/automationConfig" \
    --data '{}'

    ์ฐธ๊ณ 

    ๋ฐฑ์—…์„ ํ™œ์„ฑํ™”ํ•œ MongoDB ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ญ์ œํ•ด๋„ ๋ฆฌ์†Œ์Šค์˜ ์Šค๋ƒ…์ƒท์€ ์‚ญ์ œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. MongoDB Ops Manager ์—์„œ ์Šค๋ƒ…์ƒท์„ ์‚ญ์ œํ•˜๊ฑฐ๋‚˜ Cloud Manager ์—์„œ ์Šค๋ƒ…์ƒท์„ ์‚ญ์ œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  3. UI ๋˜๋Š” ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ MongoDB Ops Manager ๋˜๋Š” ์—์„œ ํ”„๋กœ์ ํŠธ๋ฅผ Cloud Manager API ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. MongoDB Ops Manager์—์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ์‚ญ์ œํ•˜๊ฑฐ๋‚˜ Cloud Manager ์—์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

    ๋˜๋Š” MongoDB Ops Manager API ์š”์ฒญ ๋˜๋Š” Cloud Manager API ์š”์ฒญ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์ ํŠธ๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

    ๋‹ค์Œ MongoDB Ops Manager ์˜ˆ์‹œ์™€ ์œ ์‚ฌํ•œ ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    curl --user "{USERNAME}:{APIKEY}" --digest \
    --request DELETE "{OPSMANAGER-HOST}/api/public/v1.0/groups/${PROJECT-ID}"

Kubernetes๊ฐ€ ๋ฃจํ”„์—์„œ ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๋Š” ์˜ค๋ฅ˜๋กœ ์ธํ•ด ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํŒจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŒŒ์ผ์„ ๊ฒ€์‚ฌํ•˜๊ฑฐ๋‚˜ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ์™€ ์ƒํ˜ธ ์ž‘์šฉํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋‹ค์‹œ ์‹œ์ž‘๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  1. ์›ํ•˜๋Š” ํ…์ŠคํŠธ ํŽธ์ง‘๊ธฐ์—์„œ ๋ณต๊ตฌํ•ด์•ผ ํ•˜๋Š” MongoDB ๋ฆฌ์†Œ์Šค๋ฅผ ์—ฝ๋‹ˆ๋‹ค.

  2. ์ด ๋ฆฌ์†Œ์Šค์— ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ podSpec ์ปฌ๋ ‰์…˜์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    podSpec:
    podTemplate:
    spec:
    containers:
    - name: mongodb-enterprise-database
    command: ['sh', '-c', 'echo "Hello!" && sleep 3600' ]

    ์ˆ˜๋ฉด ์˜ ๋ช…๋ น์€ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ง€์ •ํ•œ ์‹œ๊ฐ„(์ดˆ)spec.podSpec.podTemplate.spec ๋™์•ˆ ๋Œ€๊ธฐํ•˜๋„๋ก ์ง€์‹œํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ˆ์ œ์—์„œ ์ปจํ…Œ์ด๋„ˆ๋Š” 1 ์‹œ๊ฐ„ ๋™์•ˆ ๋Œ€๊ธฐํ•ฉ๋‹ˆ๋‹ค.

  3. ์ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ฆฌ์†Œ์Šค์— ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

    kubectl apply -f <resource>.yaml
  4. ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ ์…ธ์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

    kubectl exec -it <pod-name> bash

TLS ์ธ์ฆ์„œ๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ MongoDB ๋ณต์ œ๋ณธ ์„ธํŠธ ๋˜๋Š” ์ƒค๋”ฉ๋œ ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ READY ์ƒํƒœ์— ๋„๋‹ฌํ•˜์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

MongoDB ๋ณต์ œ๋ณธ ์„ธํŠธ ๋˜๋Š” ์ƒค๋”ฉ๋œ ํด๋Ÿฌ์Šคํ„ฐ์— ๋Œ€ํ•ด TLS๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ์œ ํšจํ•œ ์ธ์ฆ์„œ๋ฅผ ์ง€์ •ํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

๊ฐ TLS ์ธ์ฆ์„œ์— ๋Œ€ํ•ด ์˜ฌ๋ฐ”๋ฅธ ๋„๋ฉ”์ธ ์ด๋ฆ„์„ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด Kubernetes Operator ๋กœ๊ทธ ์— ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์—ฌ๊ธฐ์„œ foo.svc.local์€(๋Š”) cluster ๋ฉค๋ฒ„์˜ Pod์— ๋Œ€ํ•ด ์ž˜๋ชป ์ง€์ •๋œ ๋„๋ฉ”์ธ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.

TLS attempt failed : x509: certificate is valid for foo.svc.local,
not mongo-0-0.mongo-0.mongodb.svc.cluster.local

๊ฐ ์ธ์ฆ์„œ์—๋Š” ์œ ํšจํ•œ ๋„๋ฉ”์ธ ์ด๋ฆ„์ด ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ ๋ณต์ œ๋ณธ ์„ธํŠธ ๋˜๋Š” ์ƒค๋”ฉ๋œ ํด๋Ÿฌ์Šคํ„ฐ ๋ฉค๋ฒ„์˜ ๊ฒฝ์šฐ, ํ•ด๋‹น ๋ฉค๋ฒ„์˜ ์ธ์ฆ์„œ์— ๋Œ€ํ•œ ์ผ๋ฐ˜ ์ด๋ฆ„(๋„๋ฉ”์ธ ์ด๋ฆ„์ด๋ผ๊ณ ๋„ ํ•จ)์€ ์ด ํด๋Ÿฌ์Šคํ„ฐ ๋ฉค๋ฒ„๊ฐ€ ๋ฐฐํฌ๋œ ํŒŒ๋“œ์˜ FQDN๊ณผ ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ ์ธ์ฆ์„œ์˜ FQDN ์ด๋ฆ„์—๋Š” pod-name.service-name.namespace.svc.cluster.local ๊ตฌ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ด๋ฆ„์€ ๋ณต์ œ๋ณธ ์„ธํŠธ ๋˜๋Š” ์ƒค๋”ฉ๋œ ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ฉค๋ฒ„๋ฅผ ํ˜ธ์ŠคํŒ…ํ•˜๋Š” ๊ฐ Pod๋งˆ๋‹ค ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, rs-mongos-0-0์ด๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ํŒŒ๋“œ์— ๋ฐฐํฌ๋œ ๋ณต์ œ๋ณธ ์„ธํŠธ์˜ ๋ฉค๋ฒ„์˜ ๊ฒฝ์šฐ, ๊ธฐ๋ณธ mongodb ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์ƒ์„ฑ๋œ mongo-0์ด๋ผ๋Š” ์ด๋ฆ„์˜ Kubernetes ์—ฐ์‚ฐ์ž ์„œ๋น„์Šค์—์„œ FQDN์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

rs-mongos-0-0.mongo-0.mongodb.svc.cluster.local

TLS ์ธ์ฆ์„œ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌ์„ฑํ–ˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ์‹คํ–‰:

    kubectl logs -f <pod_name>
  2. Kubernetes ์—ฐ์‚ฐ์ž ๋กœ๊ทธ ํŒŒ์ผ์—์„œ TLS ๊ด€๋ จ ๋ฉ”์‹œ์ง€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

TLS ์ธ์ฆ์„œ ์š”๊ตฌ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ณต์ œ๋ณธ ์„ธํŠธ ๋ฐฐํฌ์˜ TLS-Encrypted Connections ํƒญ ๋˜๋Š” ์ƒค๋”ฉ๋œ ํด๋Ÿฌ์Šคํ„ฐ ๋ฐฐํฌ์˜ ์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

Ops Manager๊ฐ€ ๋กœ์ปฌ ๋ชจ๋“œ์—์„œ ์‹คํ–‰ ์ค‘์ด๊ณ  ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋ฒ„์ „์˜ MongoDB๋ฅผ ์ง€์ •ํ•˜๊ฑฐ๋‚˜ ๋กœ์ปฌ ๋ชจ๋“œ๋กœ ๋ฐฐํฌ๋œ Ops Manager๊ฐ€ ํ•ด๋‹น MongoDB ์•„์นด์ด๋ธŒ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜์ง€ ์•Š์€ ์œ ํšจํ•œ ๋ฒ„์ „์˜ MongoDB๋ฅผ ์ง€์ •ํ•œ ๊ฒฝ์šฐ MongoDB CustomResource๊ฐ€ Running ์ƒํƒœ์— ๋„๋‹ฌํ•˜์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์กด์žฌํ•˜์ง€ ์•Š๋Š” MongoDB ๋ฒ„์ „์„ ์ง€์ •ํ•˜๊ฑฐ๋‚˜ Ops Manager๊ฐ€ MongoDB ์•„์นด์ด๋ธŒ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์—†๋Š” ์œ ํšจํ•œ MongoDB ๋ฒ„์ „์„ ์ง€์ •ํ•˜๋ฉด, ํŒŒ๋“œ๊ฐ€ READY ์ƒํƒœ์— ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋”๋ผ๋„ Kubernetes ์—ฐ์‚ฐ์ž ๋กœ๊ทธ์— ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

Failed to create/update (Ops Manager reconciliation phase):
Status: 400 (Bad Request), Detail:
Invalid config: MongoDB <version> is not available.

์ด๋Š” MongoDB Agent๊ฐ€ /var/lib/mongodb-mms-automation ๋””๋ ‰ํ† ๋ฆฌ์— ํ•ด๋‹น MongoDB ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ๋‹ค์šด๋กœ๋“œํ•˜์ง€ ๋ชปํ–ˆ์Œ์„ ์˜๋ฏธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. MongoDB Agent๊ฐ€ ์ง€์ •๋œ MongoDB ๋ฒ„์ „์— ๋Œ€ํ•œ MongoDB ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ์ด ๋””๋ ‰ํ† ๋ฆฌ์—๋Š” mongodb-linux-x86_64-4.4.0 ๋“ฑ์˜ MongoDB ๋ฐ”์ด๋„ˆ๋ฆฌ ํด๋”๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

MongoDB ๋ฐ”์ด๋„ˆ๋ฆฌ ํด๋”๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜์„ธ์š”.

  1. ์ด ๋ช…๋ น์— ํŒŒ๋“œ์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

    kubectl exec --stdin --tty $<pod_name> /bin/sh
  2. /var/lib/mongodb-mms-automation ๋””๋ ‰ํ† ๋ฆฌ์— MongoDB ๋ฐ”์ด๋„ˆ๋ฆฌ ํด๋”๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

  3. MongoDB ๋ฐ”์ด๋„ˆ๋ฆฌ ํด๋”๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ, ๋ฐฐํฌ๋œ ๊ฐ Ops Manager ๋ณต์ œ๋ณธ ์„ธํŠธ์— ๋Œ€ํ•œ Ops Manager ์˜๊ตฌ ๋ณผ๋ฅจ์— MongoDB ์•„์นด์ด๋ธŒ๋ฅผ ๋ณต์‚ฌํ•˜์„ธ์š”.

Kubernetes ์—ฐ์‚ฐ์ž๋ฅผ ์—…๊ทธ๋ ˆ์ด๋“œํ•  ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Forbidden: updates to statefulset spec for fields other than
'replicas', 'template', and 'updateStrategy' are forbidden

์ด ์˜ค๋ฅ˜๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ์ด์ „ Kubernetes ์—ฐ์‚ฐ์ž ๋ฐฐํฌ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

    kubectl delete deployment/mongodb-enterprise-operator -n <metadata.namespace>

    ์ฐธ๊ณ 

    Kubernetes ์—ฐ์‚ฐ์ž ๋ฐฐํฌ์„œ๋ฒ„๋ฅผ ์ œ๊ฑฐํ•ด๋„ MongoDB ๋ฆฌ์†Œ์Šค์˜ ๋ผ์ดํ”„์‚ฌ์ดํด์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  2. kubectl apply ๋ช…๋ น์„ ๋ฐ˜๋ณตํ•˜์—ฌ ์ƒˆ ๋ฒ„์ „์˜ Kubernetes ์—ฐ์‚ฐ์ž๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•ฉ๋‹ˆ๋‹ค.

Kubernetes ์—ฐ์‚ฐ์ž๋ฅผ ์—…๊ทธ๋ ˆ์ด๋“œํ•  ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Error: UPGRADE FAILED: cannot patch "mongodb-enterprise-operator"
with kind Deployment: Deployment.apps "mongodb-enterprise-operator"
is invalid: ... field is immutable

์ด ์˜ค๋ฅ˜๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ์ด์ „ Kubernetes ์—ฐ์‚ฐ์ž ๋ฐฐํฌ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

    kubectl delete deployment/mongodb-enterprise-operator -n <metadata.namespace>

    ์ฐธ๊ณ 

    Kubernetes ์—ฐ์‚ฐ์ž ๋ฐฐํฌ์„œ๋ฒ„๋ฅผ ์ œ๊ฑฐํ•ด๋„ MongoDB ๋ฆฌ์†Œ์Šค์˜ ๋ผ์ดํ”„์‚ฌ์ดํด์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  2. helm ๋ช…๋ น์„ ๋ฐ˜๋ณตํ•˜์—ฌ ์ƒˆ ๋ฒ„์ „์˜ Kubernetes ์—ฐ์‚ฐ์ž๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•ฉ๋‹ˆ๋‹ค.

Kubernetes Operator ๋ฒ„์ „ 1.10 ์ดํ•˜์—์„œ ๋ฒ„์ „ 1.11 ์ด์ƒ์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•œ ํ›„, Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์— ๋‘ ๊ฐœ์˜ Kubernetes Operato ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฐฐํฌ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

get pods ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ Kubernetes ์—ฐ์‚ฐ์ž ํŒŒ๋“œ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ 

Kubernetes Operator๋ฅผ OpenShift์— ๋ฐฐํฌํ•œ ๊ฒฝ์šฐ ์ด ์„น์…˜์˜ kubectl ๋ช…๋ น์„ oc ๋ช…๋ น์œผ๋กœ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค.

kubectl get pods

์‘๋‹ต์— enterprise-operator ๋ฐ mongodb-enterprise-operator ํŒŒ๋“œ๊ฐ€ ๋ชจ๋‘ ํฌํ•จ๋œ ๊ฒฝ์šฐ ํด๋Ÿฌ์Šคํ„ฐ์—๋Š” ๋‘ ๊ฐœ์˜ Kubernetes ์—ฐ์‚ฐ์ž ์ธ์Šคํ„ด์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

NAME READY STATUS RESTARTS AGE
enterprise-operator-767884c9b4-ltkln 1/1 Running 0 122m
mongodb-enterprise-operator-6d69686679-9fzs7 1/1 Running 0 68m

enterprise-operator ๋ฐฐํฌ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

kubectl delete deployment/enterprise-operator

์‚ฌ์šฉ์ž ์ง€์ • ๋ฆฌ์†Œ์Šค๊ฐ€ ์žฅ๊ธฐ๊ฐ„ Pending ๋˜๋Š” Failed ์ƒํƒœ๋กœ ์œ ์ง€๋˜๋Š” ๊ฒฝ์šฐ, Kubernetes Operator๋Š” ์ž๋™ํ™” ๊ตฌ์„ฑ ์„ MongoDB Ops Manager๋กœ ํ‘ธ์‹œํ•˜์—ฌ MongoDB ๋ฆฌ์†Œ์Šค๋ฅผ ์ž๋™์œผ๋กœ ๋ณต๊ตฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ด์ „์— ์ž˜๋ชป๋œ ์ž๋™ํ™” ๊ตฌ์„ฑ์„ ํ‘ธ์‹œํ•˜์—ฌ StatefulSet๊ฐ€ Pending ์ƒํƒœ๋กœ ๋ฉˆ์ถฐ MongoDB Agent๊ฐ€ ์—…๋ฐ์ดํŠธ๋œ ์ž๋™ํ™” ๊ตฌ์„ฑ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ‘ธ์‹œํ•  ์ˆ˜ ์—†๋Š” ๊ต์ฐฉ ์ƒํƒœ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž๋™ ๋ณต๊ตฌ๋ฅผ ๊ตฌ์„ฑํ•˜๋ ค๋ฉด mongodb-enterprise.yaml ํŒŒ์ผ์—์„œ ๋‹ค์Œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

  • ํŒŒ๋“œ๋‹น MongoDB ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์ž๋™ ๋ณต๊ตฌ๋ฅผ ํ™œ์„ฑํ™” ๋˜๋Š” ๋น„ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด MDB_AUTOMATIC_RECOVERY_ENABLE์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • Kubernetes Operator๊ฐ€ MongoDB ๋ฆฌ์†Œ์Šค๋ฅผ ์ž๋™์œผ๋กœ ๋ณต๊ตฌํ•˜๊ธฐ ์ „์— ์‚ฌ์šฉ์ž ์ง€์ • ๋ฆฌ์†Œ์Šค๊ฐ€ Pending ๋˜๋Š” Failed ์ƒํƒœ๋กœ ์œ ์ง€๋  ์ˆ˜ ์žˆ๋Š” ์‹œ๊ฐ„(์ดˆ)์œผ๋กœ MDB_AUTOMATIC_RECOVERY_BACKOFF_TIME_S๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ

1spec:
2 template:
3 spec:
4 serviceAccountName: mongodb-enterprise-operator
5 containers:
6 - name: mongodb-enterprise-operator
7 image: <operatorVersionUrl>
8 imagePullPolicy: <policyChoice>
9 env:
10 - name: MDB_AUTOMATIC_RECOVERY_ENABLE
11 value: true
12 - name: MDB_AUTOMATIC_RECOVERY_BACKOFF_TIME_S
13 value: 1200

ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด๋ ค๋ฉด ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์ •์˜๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์ด ํŽ˜์ด์ง€์˜ ๋‚ด์šฉ