Kubernetes ์ฐ์ฐ์ ๋ฌธ์ ํด๊ฒฐํ๊ธฐ
์ด ํ์ด์ง์ ๋ด์ฉ
- ๋ฐฐํฌ๋ ๋ฆฌ์์ค์ ์ํ ๊ฐ์ ธ์ค๊ธฐ
- ๋ก๊ทธ ๊ฒํ
- ์ ํจ์ฑ ๊ฒ์ฌ Webhook์ ๋ฉ์์ง ํ์ธ
MongoDB
๋ฆฌ์์ค ์ฌ์ ๋ชจ๋ ๋ณด๊ธฐ- ๋ฐฐํฌ์ ์คํจํ StatefulSet ๋ณต์ํ๊ธฐ
- ConfigMap์ ๊ต์ฒดํ์ฌ ๋ณ๊ฒฝ ์ฌํญ ๋ฐ์
- Kubernetes ๊ตฌ์ฑ ์์ ์ ๊ฑฐ
- ํ๋ ์ญ์ ํ ์ ์๊ตฌ ๋ณผ๋ฅจ ํด๋ ์ ์์ฑ
- Ops Manager ๊ธฐ๋ฅ ์ ์ด ๋นํ์ฑํ
- Kubernetes Operator ์คํจ ์ ๋ฆฌ์์ค ์ ๊ฑฐ
- ์คํจํ ์ปจํ ์ด๋ ๋๋ฒ๊ทธ
- TLS ์ธ์ฆ์์์ ๋๋ฉ์ธ ์ด๋ฆ์ ์ ํ์ฑ ํ์ธ
- ๋ก์ปฌ ๋ชจ๋์์ ์คํํ ๋ MongoDB ๋ฒ์ ํ์ธ
kubectl
๋๋oc
์ฌ์ฉ ์ ์ ๊ทธ๋ ์ด๋ ์คํจ- Helm Charts๋ฅผ ์ฌ์ฉํ ์ ๊ทธ๋ ์ด๋ ์คํจ
- ์ ๊ทธ๋ ์ด๋ ํ ๋ ๊ฐ์ ์ฐ์ฐ์ ์ธ์คํด์ค
- ์์๋ ์๋ํ ๊ตฌ์ฑ์ผ๋ก ์ธํ ๋ฆฌ์์ค ๋ณต๊ตฌ
์ค์
์ด ์น์ ์ ๋จ์ผ 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 ์ปจํธ๋กค๋ฌ๋ ๋ค์ ์ค์ ์ ์ ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฆฌ์์ค๋ฅผ ๊ฐ์ํฉ๋๋ค.
spec.backup.s3Stores
MongoDB ๋ฆฌ์์ค ๋ฐฐํฌ์ฉ:
kubectl get mdb <resource-name> -n <metadata.namespace> -o yaml status.phase
ํ๋๋ MongoDB ๋ฆฌ์์ค ๋ฐฐํฌ ์ํ๋ฅผ ํ์ํฉ๋๋ค.
๋ค์ ํค-๊ฐ ์์ ๋ฆฌ์์ค ๋ฐฐํฌ ์ํ๋ฅผ ์ค๋ช ํฉ๋๋ค.
ํค | ๊ฐ | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
| ๋ฆฌ์์ค๊ฐ | ||||||||||
|
| ||||||||||
| ISO ์ ํ์์คํฌํ ๋ง์ง๋ง ์กฐ์ ์ด ๋ฐ์ํUTC์ ๋ ์ง ๋ฐ ์๊ฐ 8601 ํ์์ ๋๋ค. | ||||||||||
| MongoDB Ops Manager URL์ ๋ฐฐํฌ . | ||||||||||
| MongoDB ๋ฆฌ์์ค์ ๋ํด Kubernetes์์ | ||||||||||
๋ฆฌ์์ค๋ณ ํ๋ | ์ด๋ฌํ ํ๋์ ๋ํ ์ค๋ช ์ 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์ ๋ก๊ทธ ๊ฒํ ํ๊ธฐ
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>
ํน์ Pod์ ๋ก๊ทธ ๊ฒํ
ํน์ ํ๋๋ก ๋ฆฌ๋ทฐ ๋ฒ์๋ฅผ ์ขํ๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ ์คํํฉ๋๋ค.
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
์ ํจ์ฑ ๊ฒ์ฌ Webhook์ ๋ฉ์์ง ํ์ธ
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
๋ฆฌ์์ค ์ฌ์ ๋ชจ๋ ๋ณด๊ธฐ
์ ๊ณต๋ ๋ค์์คํ์ด์ค์์ 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 ๋ณต์ํ๊ธฐ
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 ์ฐธ์กฐํ์ธ์.
ConfigMap์ ๊ต์ฒดํ์ฌ ๋ณ๊ฒฝ ์ฌํญ ๋ฐ์
kubectl apply ๋ช
๋ น์ ์ฌ์ฉํ์ฌ ์ด๋ฏธ ๋ฐฐํฌ๋ ๋ฆฌ์์ค ConfigMap
ํ์ผ์ ์์ ํ๊ฑฐ๋ ์ฌ๋ฐฐํฌํ ์ ์๋ ๊ฒฝ์ฐ์๋ ๋ค์์ ์คํํฉ๋๋ค.
kubectl replace -f <my-config-map>.yaml
์ด๋ ๊ฒ ํ๋ฉด ConfigMap
๋ฆฌ์์ค ํ์ผ์ด ์ญ์ ๋๊ณ ๋ค์ ๋ง๋ค์ด์ง๋๋ค.
์ด ๋ช ๋ น์ ์ฆ๊ฐ์ ์ธ ์ฌ๊ท์ ๋ณ๊ฒฝ์ ์ํํ๊ฑฐ๋ ํ ๋ฒ ์ด๊ธฐํํ๋ฉด ์ ๋ฐ์ดํธํ ์ ์๋ ๋ฆฌ์์ค ํ์ผ์ ์ ๋ฐ์ดํธํด์ผ ํ๋ ๊ฒฝ์ฐ์ ์ ์ฉํฉ๋๋ค.
Kubernetes ๊ตฌ์ฑ ์์ ์ ๊ฑฐ
์ค์
๊ตฌ์ฑ ์์๋ฅผ ์ ๊ฑฐํ๋ ค๋ฉด ๋ค์ ๊ถํ์ด ํ์ํฉ๋๋ค:
| |
|
๋ฆฌ์์ค ์ ๊ฑฐ MongoDB
Kubernetes๊ฐ ๋ฐฐํฌํ ์ธ์คํด์ค๋ฅผ ์ ๊ฑฐํ๋ ค๋ฉด Kubernetes๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
์ค์
Kubernetes Operator๋ง ์ฌ์ฉํ์ฌ Kubernetes ๋ฐฐํฌ ์ธ์คํด์ค๋ฅผ ์ ๊ฑฐํ ์ ์์ต๋๋ค. MongoDB Ops Manager ๋ฅผ ์ฌ์ฉํ์ฌ ์ธ์คํด์ค๋ฅผ ์ ๊ฑฐํ๋ฉด MongoDB Ops Manager ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
MongoDB ๋ฆฌ์์ค๋ฅผ ์ญ์ ํด๋ MongoDB Ops Manager UI์์๋ ์ ๊ฑฐ๋์ง ์์ต๋๋ค. MongoDB Ops Manager์์ ๋ฆฌ์์ค๋ฅผ ์๋์ผ๋ก ์ ๊ฑฐํด์ผ ํฉ๋๋ค. ์์ธํ ๋ด์ฉ ์ ๋ชจ๋ํฐ๋ง์์ ํ๋ก์ธ์ค ์ ๊ฑฐ๋ฅผ ์ฐธ์กฐํ์ธ์.
๋ฐฑ์ ์ ํ์ฑํํ MongoDB ๋ฆฌ์์ค๋ฅผ ์ญ์ ํด๋ ๋ฆฌ์์ค์ ์ค๋ ์ท์ ์ญ์ ๋์ง ์์ต๋๋ค. MongoDB Ops Manager์์ ์ค๋ ์ท์ ์ญ์ ํด์ผ ํฉ๋๋ค.
์์
Kubernetes๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑํ ๋จ์ผ MongoDB ์ธ์คํด์ค๋ฅผ ์ ๊ฑฐํ๋ ค๋ฉด ๋ค์์ ์ํํฉ๋๋ค.
kubectl delete mdb <name> -n <metadata.namespace>
Kubernetes๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑํ ๋ชจ๋ MongoDB ์ธ์คํด์ค๋ฅผ ์ ๊ฑฐํ๋ ค๋ฉด ๋ค์์ ์ํํฉ๋๋ค.
kubectl delete mdb --all -n <metadata.namespace>
Kubernetes Operator ์ ๊ฑฐ
Kubernetes Operator๋ฅผ ์ ๊ฑฐํ๋ ค๋ฉด ๋ค์์ ์ํํฉ๋๋ค.
๋ชจ๋ Kubernetes ๋ฆฌ์์ค๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
kubectl delete mdb --all -n <metadata.namespace> ์ฟ ๋ฒ๋คํฐ์ค ์คํผ๋ ์ดํฐ ์ ๊ฑฐ:
kubectl delete deployment mongodb-enterprise-operator -n <metadata.namespace>
CustomResourceDefinitions ์ ๊ฑฐ
CustomResourceDefinitions ๋ฅผ ์ ๊ฑฐํ๋ ค๋ฉด :
๋ชจ๋ Kubernetes ๋ฆฌ์์ค๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
kubectl delete mdb --all -n <metadata.namespace> CustomResourceDefinitions ์ ๊ฑฐ:
kubectl delete crd mongodb.mongodb.com kubectl delete crd mongodbusers.mongodb.com kubectl delete crd opsmanagers.mongodb.com
๋ค์์คํ์ด์ค ์ ๊ฑฐ
๋ค์์คํ์ด์ค ๋ฅผ ์ ๊ฑฐํ๋ ค๋ฉด :
๋ชจ๋ Kubernetes ๋ฆฌ์์ค๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
kubectl delete mdb --all -n <metadata.namespace> ๋ค์์คํ์ด์ค ์ ๊ฑฐ :
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>
์ผ๋ก ๋ณ๊ฒฝํฉ๋๋ค.
Ops Manager ๊ธฐ๋ฅ ์ ์ด ๋นํ์ฑํ
Kubernetes Operator๋ฅผ ํตํด MongoDB Ops Manager ํ๋ก์ ํธ๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒฝ์ฐ, Kubernetes Operator๋ ํ๋ก์ ํธ์ EXTERNALLY_MANAGED_LOCK
๊ธฐ๋ฅ ์ ์ด ์ ์ฑ
์ ๋ฐฐ์นํฉ๋๋ค. ์ด ์ ์ฑ
์ Kubernetes Operator ๊ตฌ์ฑ์ ์์์ํฌ ์ ์๋ MongoDB Ops Manager ์ ํ๋ฆฌ์ผ์ด์
์ ํน์ ๊ธฐ๋ฅ์ ๋นํ์ฑํํฉ๋๋ค. ์ด๋ฌํ ์ฐจ๋จ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ ๊ธฐ๋ฅ ์ ์ด API ๋ฅผ ํตํด ์ ์ฑ
์ ์ ๊ฑฐํ๊ณ MongoDB Ops Manager ์ ํ๋ฆฌ์ผ์ด์
์์ ๋ณ๊ฒฝํ ๋ค์ API ๋ฅผ ํตํด ์๋ ์ ์ฑ
์ ๋ณต์ํ ์ ์์ต๋๋ค.
๊ฒฝ๊ณ
๋ค์ ์ ์ฐจ๋ฅผ ํตํด Kubernetes ์ฐ์ฐ์์ ์ํด ์ฐจ๋จ๋๋ Ops Manager ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
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" } 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 ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Ops Manager ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ณ๊ฒฝ์ ์ํํฉ๋๋ค.
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 ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ณ๊ฒฝํ ๋ด์ฉ์ ๊ทธ๋๋ก ์ ์งํฉ๋๋ค.
Kubernetes Operator ์คํจ ์ ๋ฆฌ์์ค ์ ๊ฑฐ
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 ๋ฆฌ์์ค๋ฅผ ์๋์ผ๋ก ์ ๊ฑฐํ๋ ค๋ฉด ๋ค์์ ์ํํฉ๋๋ค.
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 ์์ ์ค๋ ์ท์ ์ญ์ ํด์ผ ํฉ๋๋ค.
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๊ฐ ๋ฃจํ์์ ํด๋น ์ปจํ ์ด๋๋ฅผ ๋ค์ ์์ํ๋ ์ค๋ฅ๋ก ์ธํด ์ปจํ ์ด๋๊ฐ ์คํจํ ์ ์์ต๋๋ค.
ํ์ผ์ ๊ฒ์ฌํ๊ฑฐ๋ ๋ช ๋ น์ ์คํํ๊ธฐ ์ํด ํด๋น ์ปจํ ์ด๋์ ์ํธ ์์ฉํด์ผ ํ ์๋ ์์ต๋๋ค. ์ด๋ฅผ ์ํด์๋ ์ปจํ ์ด๋๊ฐ ๋ค์ ์์๋๋ ๊ฒ์ ๋ฐฉ์งํด์ผ ํฉ๋๋ค.
์ํ๋ ํ ์คํธ ํธ์ง๊ธฐ์์ ๋ณต๊ตฌํด์ผ ํ๋ MongoDB ๋ฆฌ์์ค๋ฅผ ์ฝ๋๋ค.
์ด ๋ฆฌ์์ค์ ๋ค์๊ณผ ์ ์ฌํ
podSpec
์ปฌ๋ ์ ์ ์ถ๊ฐํฉ๋๋ค.podSpec: podTemplate: spec: containers: - name: mongodb-enterprise-database command: ['sh', '-c', 'echo "Hello!" && sleep 3600' ] ์๋ฉด ์ ๋ช ๋ น์ ์ปจํ ์ด๋๊ฐ ์ง์ ํ ์๊ฐ(์ด)
spec.podSpec.podTemplate.spec
๋์ ๋๊ธฐํ๋๋ก ์ง์ํฉ๋๋ค. ์ด ์์ ์์ ์ปจํ ์ด๋๋ 1 ์๊ฐ ๋์ ๋๊ธฐํฉ๋๋ค.์ด ๋ณ๊ฒฝ ์ฌํญ์ ๋ฆฌ์์ค์ ์ ์ฉํฉ๋๋ค.
kubectl apply -f <resource>.yaml ์ปจํ ์ด๋ ๋ด๋ถ์์ ์ ธ์ ํธ์ถํฉ๋๋ค.
kubectl exec -it <pod-name> bash
TLS ์ธ์ฆ์์์ ๋๋ฉ์ธ ์ด๋ฆ์ ์ ํ์ฑ ํ์ธ
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 ์ธ์ฆ์๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌ์ฑํ๋์ง ํ์ธํ๋ ค๋ฉด ๋ค์์ ์ํํฉ๋๋ค.
์คํ:
kubectl logs -f <pod_name> Kubernetes ์ฐ์ฐ์ ๋ก๊ทธ ํ์ผ์์ TLS ๊ด๋ จ ๋ฉ์์ง๋ฅผ ํ์ธํฉ๋๋ค.
TLS ์ธ์ฆ์ ์๊ตฌ ์ฌํญ์ ๋ํ ์์ธํ ๋ด์ฉ์ ๋ณต์ ๋ณธ ์ธํธ ๋ฐฐํฌ์ TLS-Encrypted Connections ํญ ๋๋ ์ค๋ฉ๋ ํด๋ฌ์คํฐ ๋ฐฐํฌ์ ์ฌ์ ์๊ตฌ ์ฌํญ์ ์ฐธ์กฐํ์ธ์.
๋ก์ปฌ ๋ชจ๋์์ ์คํํ ๋ MongoDB ๋ฒ์ ํ์ธ
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 ๋ฐ์ด๋๋ฆฌ ํด๋๊ฐ ์๋์ง ํ์ธํ๋ ค๋ฉด ๋ค์์ ์ํํ์ธ์.
์ด ๋ช ๋ น์ ํ๋์ ์ด๋ฆ์ ์ง์ ํฉ๋๋ค.
kubectl exec --stdin --tty $<pod_name> /bin/sh /var/lib/mongodb-mms-automation
๋๋ ํ ๋ฆฌ์ MongoDB ๋ฐ์ด๋๋ฆฌ ํด๋๊ฐ ์๋์ง ํ์ธํฉ๋๋ค.MongoDB ๋ฐ์ด๋๋ฆฌ ํด๋๋ฅผ ์ฐพ์ ์ ์๋ ๊ฒฝ์ฐ, ๋ฐฐํฌ๋ ๊ฐ Ops Manager ๋ณต์ ๋ณธ ์ธํธ์ ๋ํ Ops Manager ์๊ตฌ ๋ณผ๋ฅจ์ MongoDB ์์นด์ด๋ธ๋ฅผ ๋ณต์ฌํ์ธ์.
๋๋ ๋ฅผ ์ฌ์ฉํ ์
๊ทธ๋ ์ด๋ ์คํจ kubectl
oc
Kubernetes ์ฐ์ฐ์๋ฅผ ์ ๊ทธ๋ ์ด๋ํ ๋ ๋ค์๊ณผ ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
Forbidden: updates to statefulset spec for fields other than 'replicas', 'template', and 'updateStrategy' are forbidden
์ด ์ค๋ฅ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ๋ค์์ ์ํํฉ๋๋ค.
์ด์ Kubernetes ์ฐ์ฐ์ ๋ฐฐํฌ๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
kubectl delete deployment/mongodb-enterprise-operator -n <metadata.namespace> ์ฐธ๊ณ
Kubernetes ์ฐ์ฐ์ ๋ฐฐํฌ์๋ฒ๋ฅผ ์ ๊ฑฐํด๋ MongoDB ๋ฆฌ์์ค์ ๋ผ์ดํ์ฌ์ดํด์๋ ์ํฅ์ ์ฃผ์ง ์์ต๋๋ค.
kubectl apply
๋ช ๋ น์ ๋ฐ๋ณตํ์ฌ ์ ๋ฒ์ ์ Kubernetes ์ฐ์ฐ์๋ก ์ ๊ทธ๋ ์ด๋ํฉ๋๋ค.
Helm Charts๋ฅผ ์ฌ์ฉํ ์ ๊ทธ๋ ์ด๋ ์คํจ
Kubernetes ์ฐ์ฐ์๋ฅผ ์ ๊ทธ๋ ์ด๋ํ ๋ ๋ค์๊ณผ ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
Error: UPGRADE FAILED: cannot patch "mongodb-enterprise-operator" with kind Deployment: Deployment.apps "mongodb-enterprise-operator" is invalid: ... field is immutable
์ด ์ค๋ฅ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ๋ค์์ ์ํํฉ๋๋ค.
์ด์ Kubernetes ์ฐ์ฐ์ ๋ฐฐํฌ๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
kubectl delete deployment/mongodb-enterprise-operator -n <metadata.namespace> ์ฐธ๊ณ
Kubernetes ์ฐ์ฐ์ ๋ฐฐํฌ์๋ฒ๋ฅผ ์ ๊ฑฐํด๋ MongoDB ๋ฆฌ์์ค์ ๋ผ์ดํ์ฌ์ดํด์๋ ์ํฅ์ ์ฃผ์ง ์์ต๋๋ค.
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๋ฅผ ์ค์ ํฉ๋๋ค.
์์
1 spec: 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
ํ๊ฒฝ ๋ณ์๋ฅผ ์ ์ํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด๋ ค๋ฉด ์ปจํ ์ด๋์ ๋ํ ํ๊ฒฝ ๋ณ์ ์ ์๋ฅผ ์ฐธ์กฐํ์ธ์.