스터디/DOIK

Percona Operator for MongoDB - 옵션 변경

시스템 엔지니어 2022. 6. 24. 18:40

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

 

Changing MongoDB Options

Changing MongoDB Options

www.percona.com

 

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 )

https://www.mongodb.com/docs/manual/reference/configuration-options/

현재 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 에 설정이 저장되는 것을 확인 했습니다.