Percona Operator for MongoDB - 옵션 변경
따라하실분은 아래 URL로 클러스터 생성 후 진행해 주시면 됩니다.
https://www.percona.com/doc/kubernetes-operator-for-psmongodb/kubernetes.html#operator-kubernetes
도전과제 URL: https://www.percona.com/doc/kubernetes-operator-for-psmongodb/options.html
MongoDB의 Config 변경하는 방법은 3가지 있습니다.
아래 3가지 방법을 사용해보겠습니다.
- "deploy/cr.yaml" 파일 변경
- ConfigMap 사용
- Secret object 사용
"deploy/cr.yaml" 파일 변경
cr.yaml 파일
apiVersion: psmdb.percona.com/v1-12-0
kind: PerconaServerMongoDB
metadata:
name: my-cluster-name-db
finalizers:
- delete-psmdb-pods-in-order
spec:
crVersion: 1.12.0
image: percona/percona-server-mongodb:5.0.7-6
imagePullPolicy: Always
allowUnsafeConfigurations: false
updateStrategy: SmartUpdate
upgradeOptions:
versionServiceEndpoint: https://check.percona.com
apply: 5.0-recommended
schedule: "0 2 * * *"
setFCV: false
secrets:
users: my-cluster-name-secrets
encryptionKey: my-cluster-name-mongodb-encryption-key
pmm:
enabled: false
image: percona/pmm-client:2.27.0
serverHost: monitoring-service
replsets:
- name: rs0
size: 3
# configuration: |
# operationProfiling:
# mode: slowOp
affinity:
antiAffinityTopologyKey: "kubernetes.io/hostname"
podDisruptionBudget:
maxUnavailable: 1
expose:
enabled: false
exposeType: ClusterIP
resources:
limits:
cpu: "300m"
memory: "0.5G"
requests:
cpu: "300m"
memory: "0.5G"
volumeSpec:
persistentVolumeClaim:
resources:
requests:
storage: 5Gi
nonvoting:
enabled: false
size: 3
affinity:
antiAffinityTopologyKey: "kubernetes.io/hostname"
podDisruptionBudget:
maxUnavailable: 1
resources:
limits:
cpu: "300m"
memory: "0.5G"
requests:
cpu: "300m"
memory: "0.5G"
volumeSpec:
persistentVolumeClaim:
resources:
requests:
storage: 5Gi
arbiter:
enabled: false
size: 1
affinity:
antiAffinityTopologyKey: "kubernetes.io/hostname"
sharding:
enabled: false
configsvrReplSet:
size: 3
affinity:
antiAffinityTopologyKey: "kubernetes.io/hostname"
podDisruptionBudget:
maxUnavailable: 1
expose:
enabled: false
exposeType: ClusterIP
resources:
limits:
cpu: "300m"
memory: "0.5G"
requests:
cpu: "300m"
memory: "0.5G"
volumeSpec:
persistentVolumeClaim:
resources:
requests:
storage: 5Gi
mongos:
size: 3
affinity:
antiAffinityTopologyKey: "kubernetes.io/hostname"
podDisruptionBudget:
maxUnavailable: 1
resources:
limits:
cpu: "300m"
memory: "0.5G"
requests:
cpu: "300m"
memory: "0.5G"
expose:
exposeType: ClusterIP
backup:
enabled: false
image: percona/percona-backup-mongodb:1.7.0
serviceAccountName: percona-server-mongodb-operator
pitr:
enabled: false
compressionType: gzip
compressionLevel: 6
OperationProfiling을 추가해 보겠습니다.
configuration: |
operationProfiling:
mode: slowOp
그전에 OperationProfiling에 간단히 알아보면,
Profiler는 mongod 인스턴스에 실행된 database command의 정밀한 정보를 수집합니다.
CRUD operation 정보와, configuration, adminstration commands 로그 들을 포함하고 기본값은 off 입니다.
mysql의 slow 쿼리 수집과 비슷한 기능도 있는것 같습니다.
- level 0: off 상태 ( mode: off )
- level 1: slowms의 값보다 오래 걸리는 operation의 data를 수집한다. ( mode: slowOp )
- level 2: 모든 operation의 data를 수집힌다. ( mode: all )
현재 ProfilingLevel을 확인 해보면 기본값이 off이기 때문에 0인 것이 확인 됩니다.
deploy/cr.yaml 추가 후 확인 해보겠습니다.
configuration: |
operationProfiling:
mode: slowOp
kubectl apply -f deploy/cr.yaml
(🚴|DOIK-Lab:psmdb) root@k8s-m:~# k get pod -o wide -w
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
my-cluster-name-db-rs0-0 1/1 Running 0 3m45s 172.16.2.14 k8s-w1 <none> <none>
my-cluster-name-db-rs0-1 1/1 Running 0 4m20s 172.16.3.14 k8s-w3 <none> <none>
my-cluster-name-db-rs0-2 1/1 Running 0 3m13s 172.16.1.17 k8s-w2 <none> <none>
myclient1 1/1 Running 0 56m 172.16.0.5 k8s-m <none> <none>
myclient2 1/1 Running 0 56m 172.16.0.6 k8s-m <none> <none>
myclient3 1/1 Running 0 56m 172.16.0.7 k8s-m <none> <none>
percona-server-mongodb-operator-54d7456f5b-msslg 1/1 Running 0 29m 172.16.0.8 k8s-m <none> <none>
my-cluster-name-db-rs0-2 1/1 Terminating 0 4m45s 172.16.1.17 k8s-w2 <none> <none>
my-cluster-name-db-rs0-2 0/1 Pending 0 0s <none> <none> <none> <none>
my-cluster-name-db-rs0-2 0/1 Init:0/1 0 0s <none> k8s-w2 <none> <none>
my-cluster-name-db-rs0-2 0/1 PodInitializing 0 4s 172.16.1.18 k8s-w2 <none> <none>
my-cluster-name-db-rs0-2 1/1 Running 0 15s 172.16.1.18 k8s-w2 <none> <none>
my-cluster-name-db-rs0-0 1/1 Terminating 0 5m48s 172.16.2.14 k8s-w1 <none> <none>
my-cluster-name-db-rs0-0 0/1 Pending 0 0s <none> <none> <none> <none>
my-cluster-name-db-rs0-0 0/1 Init:0/1 0 1s <none> k8s-w1 <none> <none>
my-cluster-name-db-rs0-0 0/1 PodInitializing 0 5s 172.16.2.15 k8s-w1 <none> <none>
my-cluster-name-db-rs0-0 1/1 Running 0 18s 172.16.2.15 k8s-w1 <none> <none>
my-cluster-name-db-rs0-1 1/1 Terminating 0 6m59s 172.16.3.14 k8s-w3 <none> <none>
my-cluster-name-db-rs0-1 0/1 Pending 0 0s <none> <none> <none> <none>
my-cluster-name-db-rs0-1 0/1 Init:0/1 0 0s <none> k8s-w3 <none> <none>
my-cluster-name-db-rs0-1 0/1 PodInitializing 0 4s 172.16.3.15 k8s-w3 <none> <none>
my-cluster-name-db-rs0-1 1/1 Running 0 15s 172.16.3.15 k8s-w3 <none> <none>
확인해 보면 pod 하나씩 적용 되는 것 같습니다.
my-cluster-name-db-rs0-2
my-cluster-name-db-rs0-0
my-cluster-name-db-rs0-1
적용되는 순서는 랜덤인것 같습니다. 어떤 순서가 있을 수도 있지만, 정확한 정보는 모르겠습니다.
ProfilingLevel이 적용되어 1로 변경 된 것을 확인 했습니다.
ConfigMap 사용
ConfigMap으로 적용이 되는지 확인해 보겠습니다.
mongod.conf 파일 생성합니다.
operationProfiling:
mode: all
명령어 실행
kubectl create configmap my-cluster-name-db-rs0-mongod --from-file=mongod.conf=mongod.conf
(🚴|DOIK-Lab:psmdb) root@k8s-m:~# k get pod -o wide -w
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
my-cluster-name-db-rs0-0 1/1 Running 0 53s 172.16.2.23 k8s-w1 <none> <none>
my-cluster-name-db-rs0-1 1/1 Running 0 89s 172.16.3.20 k8s-w3 <none> <none>
my-cluster-name-db-rs0-2 1/1 Running 0 21s 172.16.1.22 k8s-w2 <none> <none>
myclient1 1/1 Running 0 106m 172.16.0.5 k8s-m <none> <none>
myclient2 1/1 Running 0 106m 172.16.0.6 k8s-m <none> <none>
myclient3 1/1 Running 0 106m 172.16.0.7 k8s-m <none> <none>
percona-server-mongodb-operator-54d7456f5b-x5gtl 1/1 Running 0 6m49s 172.16.0.15 k8s-m <none> <none>
my-cluster-name-db-rs0-2 1/1 Terminating 0 2m13s 172.16.1.22 k8s-w2 <none> <none>
my-cluster-name-db-rs0-2 0/1 Pending 0 0s <none> <none> <none> <none>
my-cluster-name-db-rs0-2 0/1 Init:0/1 0 0s <none> k8s-w2 <none> <none>
my-cluster-name-db-rs0-2 0/1 PodInitializing 0 3s 172.16.1.23 k8s-w2 <none> <none>
my-cluster-name-db-rs0-2 1/1 Running 0 15s 172.16.1.23 k8s-w2 <none> <none>
my-cluster-name-db-rs0-0 1/1 Terminating 0 3m17s 172.16.2.23 k8s-w1 <none> <none>
my-cluster-name-db-rs0-0 0/1 Pending 0 0s <none> <none> <none> <none>
my-cluster-name-db-rs0-0 0/1 Init:0/1 0 1s <none> k8s-w1 <none> <none>
my-cluster-name-db-rs0-0 0/1 PodInitializing 0 4s 172.16.2.24 k8s-w1 <none> <none>
my-cluster-name-db-rs0-0 1/1 Running 0 18s 172.16.2.24 k8s-w1 <none> <none>
my-cluster-name-db-rs0-1 1/1 Terminating 0 4m28s 172.16.3.20 k8s-w3 <none> <none>
my-cluster-name-db-rs0-1 0/1 Pending 0 0s <none> <none> <none> <none>
my-cluster-name-db-rs0-1 0/1 Init:0/1 0 0s <none> k8s-w3 <none> <none>
my-cluster-name-db-rs0-1 0/1 PodInitializing 0 4s 172.16.3.21 k8s-w3 <none> <none>
my-cluster-name-db-rs0-1 1/1 Running 0 15s 172.16.3.21 k8s-w3 <none> <none>
cr.yaml 파일을 수정한 것과 동일하게 순서와 상관없이 적용 되는 것을 확인 할 수 있습니다.
정상 적용 된것도 확인 됩니다.
테스트를 하다보니 문제점이 보입니다.
cr.yaml을 설정하면 ConfigMap이 생성됩니다.
cr.yaml파일에서 생성되는 ConfigMap과 현재 테스트중인 ConfigMap이 동일한 이름인 것이 확인 됩니다.
그래서 "deploy/cr.yaml" 설정과 "ConfigMap"을 같이 사용하게 되면 cr.yaml이 우선순위가 높아 덮어씌어 버리는 것 같습니다.
테스트 해보겠습니다.
현재는 ConfigMap 테스트로 ConfigMap이 만들어져 있는 상태입니다.
deploy/cr.yaml 파일에는 설정이 다 삭제되어 있는 상태인데, 다시 추가해 보겠습니다.
configuration: |
operationProfiling:
mode: slowOp
k apply -f deploy/cr.yaml
mode가 "all" 에서 "slowOp" 로 바뀐 것을 확인 할 수 있습니다.
개인적인 생각이지만 Config를 수정할때에는 cr.yaml로만 수정하는게 좋을 것 같습니다.
Secret object 사용
모든 설정을 제거해서 현재 ProfilingLevel은 0인 상태입니다.
mongod.conf를 재사용 하겠습니다.
operationProfiling:
mode: all
base64 인코딩
cat mongod.conf | base64
# decode로 확인
echo "b3BlcmF0aW9uUHJvZmlsaW5nOgogIG1vZGU6IGFsbAo=" | base64 --decode
시크릿 파일을 생성합니다.
my-mongod-secret.yaml
name: my-cluster-name-rs0-mongod
apiVersion: v1
kind: Secret
metadata:
name: my-cluster-name-db-rs0-mongod
data:
mongod.conf: "b3BlcmF0aW9uUHJvZmlsaW5nOgogIG1vZGU6IGFsbAo="
kubectl create -f deploy/my-mongod-secret.yaml
(🚴|DOIK-Lab:psmdb) root@k8s-m:~# k get pod -o wide -w
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
my-cluster-name-db-rs0-0 1/1 Running 0 6m32s 172.16.2.29 k8s-w1 <none> <none>
my-cluster-name-db-rs0-1 1/1 Running 0 7m8s 172.16.3.26 k8s-w3 <none> <none>
my-cluster-name-db-rs0-2 1/1 Running 0 5m57s 172.16.1.28 k8s-w2 <none> <none>
myclient1 1/1 Running 0 131m 172.16.0.5 k8s-m <none> <none>
myclient2 1/1 Running 0 131m 172.16.0.6 k8s-m <none> <none>
myclient3 1/1 Running 0 131m 172.16.0.7 k8s-m <none> <none>
percona-server-mongodb-operator-54d7456f5b-x5gtl 1/1 Running 0 32m 172.16.0.15 k8s-m <none> <none>
my-cluster-name-db-rs0-2 1/1 Terminating 0 7m34s 172.16.1.28 k8s-w2 <none> <none>
my-cluster-name-db-rs0-2 0/1 Pending 0 0s <none> <none> <none> <none>
my-cluster-name-db-rs0-2 0/1 Init:0/1 0 1s <none> k8s-w2 <none> <none>
my-cluster-name-db-rs0-2 0/1 PodInitializing 0 4s 172.16.1.29 k8s-w2 <none> <none>
my-cluster-name-db-rs0-2 1/1 Running 0 18s 172.16.1.29 k8s-w2 <none> <none>
my-cluster-name-db-rs0-0 1/1 Terminating 0 8m44s 172.16.2.29 k8s-w1 <none> <none>
my-cluster-name-db-rs0-0 0/1 Pending 0 0s <none> <none> <none> <none>
my-cluster-name-db-rs0-0 0/1 Init:0/1 0 0s <none> k8s-w1 <none> <none>
my-cluster-name-db-rs0-0 0/1 PodInitializing 0 4s 172.16.2.30 k8s-w1 <none> <none>
my-cluster-name-db-rs0-0 1/1 Running 0 18s 172.16.2.30 k8s-w1 <none> <none>
my-cluster-name-db-rs0-1 1/1 Terminating 0 9m55s 172.16.3.26 k8s-w3 <none> <none>
my-cluster-name-db-rs0-1 0/1 Pending 0 0s <none> <none> <none> <none>
my-cluster-name-db-rs0-1 0/1 Init:0/1 0 1s <none> k8s-w3 <none> <none>
my-cluster-name-db-rs0-1 0/1 PodInitializing 0 4s 172.16.3.27 k8s-w3 <none> <none>
my-cluster-name-db-rs0-1 1/1 Running 0 18s 172.16.3.27 k8s-w3 <none> <none>
정상 적용 확인이 됩니다.
"deploy/cr.yaml" 파일 변경 시 어떤 설정이 우선순위가 높은지 보겠습니다.
cr.yaml 파일은 설정이 없는 상태인데 수정하겠습니다.
configuration: |
operationProfiling:
mode: slowOp
k apply -f cr.yaml
변경이 진행되지 않습니다. 1로 바뀌지 않네요.
Secret Object 우선순위가 제일 높은 느낌입니다.
반대로 cr.yaml 파일은 유지하고, 시크릿 파일을 추가해 보겠습니다.
k delete -f my-mongod-secret.yaml
시크릿 파일을 삭제하니, ProfilingLevel이 1로 변경 되는 것을 확인 할 수 있습니다.
시크릿 파일을 다시 추가하면 ProfilingLevel이 2로 바뀌었습니다.
확인 결과 우선순위는 아래와 같습니다.
Secret Object > deploy/cr.yaml > ConfigMap
느낀점
- Config 설정은 여러가지 방법을 혼용해서 사용하면 안되네요.
- 적용되는 우선순위를 알아봤습니다.
- Secret Object > deploy/cr.yaml > ConfigMap
- 자동으로 pod 하나씩 설정값을 적용해 주는 것을 확인 했습니다.
- 개인적으로는 관리를 위해서 cr.yaml 파일로 설정하는 것만 사용할 것 같습니다.
- pod에는 /etc/mongodb-config/mongod.conf 에 설정이 저장되는 것을 확인 했습니다.
'스터디 > DOIK' 카테고리의 다른 글
Percona Operator for MongoDB - DOIK 스터디 4주차 (0) | 2022.06.22 |
---|---|
기본 Object - Pod (0) | 2022.06.05 |
K8S MySQL Operator 설치 - DOIK 스터디 2주차 (0) | 2022.06.01 |
K8S Operator 패턴 - DOIK 스터디 2주차 (0) | 2022.06.01 |