Pod не будет планировать узел с локальным PV. Заявки на постоянный том не будут привязаны к локальным постоянным томам

Я пытаюсь заставить монго быть запланированным для данного узла в моем кластере (Катар).

Я вижу следующее сообщение об ошибке в описании модуля:

  Warning  FailedScheduling  58m   default-scheduler  0/7 nodes are available: 1 node(s) had taint {node-role.kubernetes.io/master: }, that the pod didn't tolerate, 6 node(s) didn't find available persistent volumes to bind.

Монго опирается на следующие 2 утверждения:

[dsargrad@malta cfg]$ kubectl get pvc
NAME                                    STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS    AGE
data-volume-learning-center-mongodb-0   Pending                                      local-storage   3m57s
logs-volume-learning-center-mongodb-0   Pending                                      local-storage   3m57s

[dsargrad@malta cfg]$ kubectl describe pvc data-volume-learning-center-mongodb-0
Name:          data-volume-learning-center-mongodb-0
Namespace:     default
StorageClass:  local-storage
Status:        Pending
Volume:
Labels:        app=learning-center-mongodb-svc
Annotations:   <none>
Finalizers:    [kubernetes.io/pvc-protection]
Capacity:
Access Modes:
VolumeMode:    Filesystem
Used By:       learning-center-mongodb-0
Events:
  Type    Reason                Age                   From                         Message
  ----    ------                ----                  ----                         -------
  Normal  WaitForFirstConsumer  4m45s                 persistentvolume-controller  waiting for first consumer to be created before binding
  Normal  WaitForPodScheduled   12s (x19 over 4m42s)  persistentvolume-controller  waiting for pod learning-center-mongodb-0 to be scheduled

Мои два PV, которые я хочу связать, следующие:

[dsargrad@malta cfg]$ kubectl get pv
NAME            CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM                                           STORAGECLASS    REASON   AGE
mongo-data-pv   1Gi        RWO            Retain           Available   default/data-volume-learning-center-mongodb-0   local-storage            8m47s
mongo-logs-pv   1Gi        RWO            Retain           Available   default/logs-volume-learning-center-mongodb-0   local-storage            15m

Они используют локальное хранилище... на узле qatar.corp.sensis.com.

[dsargrad@malta cfg]$ kubectl get nodes
NAME                    STATUS   ROLES                  AGE   VERSION
benin.corp.sensis.com   Ready    <none>                 45h   v1.20.5
chad.corp.sensis.com    Ready    <none>                 45h   v1.20.5
malta.corp.sensis.com   Ready    control-plane,master   45h   v1.20.5
qatar.corp.sensis.com   Ready    <none>                 45h   v1.20.5
spain.corp.sensis.com   Ready    <none>                 45h   v1.20.5
togo.corp.sensis.com    Ready    <none>                 45h   v1.20.5
tonga.corp.sensis.com   Ready    <none>                 45h   v1.20.5

Моя капсула монго не планирует

[dsargrad@malta cfg]$ kubectl describe pod learning-center-mongodb-0
Name:           learning-center-mongodb-0
Namespace:      default
Priority:       0
Node:           <none>
Labels:         app=learning-center-mongodb-svc
                controller-revision-hash=learning-center-mongodb-784678577f
                statefulset.kubernetes.io/pod-name=learning-center-mongodb-0
Annotations:    <none>
Status:         Pending
IP:
IPs:            <none>
Controlled By:  StatefulSet/learning-center-mongodb
Init Containers:
  mongod-posthook:
    Image:      quay.io/mongodb/mongodb-kubernetes-operator-version-upgrade-post-start-hook:1.0.2
    Port:       <none>
    Host Port:  <none>
    Command:
      cp
      version-upgrade-hook
      /hooks/version-upgrade
    Environment:  <none>
    Mounts:
      /hooks from hooks (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from mongodb-kubernetes-operator-token-ldwsr (ro)
  mongodb-agent-readinessprobe:
    Image:      quay.io/mongodb/mongodb-kubernetes-readinessprobe:1.0.1
    Port:       <none>
    Host Port:  <none>
    Command:
      cp
      /probes/readinessprobe
      /opt/scripts/readinessprobe
    Environment:  <none>
    Mounts:
      /opt/scripts from agent-scripts (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from mongodb-kubernetes-operator-token-ldwsr (ro)
Containers:
  mongod:
    Image:      registry.hub.docker.com/library/mongo:4.2.6
    Port:       <none>
    Host Port:  <none>
    Command:
      /bin/sh
      -c

      #run post-start hook to handle version changes
      /hooks/version-upgrade

      # wait for config and keyfile to be created by the agent
       while ! [ -f /data/automation-mongod.conf -a -f /var/lib/mongodb-mms-automation/authentication/keyfile ]; do sleep 3 ; done ; sleep 2 ;


      # start mongod with this configuration
      exec mongod -f /data/automation-mongod.conf;

    Limits:
      cpu:     1
      memory:  500M
    Requests:
      cpu:     500m
      memory:  400M
    Environment:
      AGENT_STATUS_FILEPATH:  /healthstatus/agent-health-status.json
    Mounts:
      /data from data-volume (rw)
      /healthstatus from healthstatus (rw)
      /hooks from hooks (rw)
      /var/lib/mongodb-mms-automation/authentication from learning-center-mongodb-keyfile (rw)
      /var/log/mongodb-mms-automation from logs-volume (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from mongodb-kubernetes-operator-token-ldwsr (ro)
  mongodb-agent:
    Image:      quay.io/mongodb/mongodb-agent:10.27.0.6772-1
    Port:       <none>
    Host Port:  <none>
    Command:
      /bin/bash
      -c
      current_uid=$(id -u)
      echo $current_uid
      declare -r current_uid
      if ! grep -q "${current_uid}" /etc/passwd ; then
      sed -e "s/^mongodb:/builder:/" /etc/passwd > /tmp/passwd
      echo "mongodb:x:$(id -u):$(id -g):,,,:/:/bin/bash" >> /tmp/passwd
      cat /tmp/passwd
      export NSS_WRAPPER_PASSWD=/tmp/passwd
      export LD_PRELOAD=libnss_wrapper.so
      export NSS_WRAPPER_GROUP=/etc/group
      fi
      agent/mongodb-agent -cluster=/var/lib/automation/config/cluster-config.json -skipMongoStart -noDaemonize -healthCheckFilePath=/var/log/mongodb-mms-automation/healthstatus/agent-health-status.json -serveStatusPort=5000 -useLocalMongoDbTools
    Limits:
      cpu:     1
      memory:  500M
    Requests:
      cpu:      500m
      memory:   400M
    Readiness:  exec [/opt/scripts/readinessprobe] delay=5s timeout=1s period=10s #success=1 #failure=60
    Environment:
      AGENT_STATUS_FILEPATH:  /var/log/mongodb-mms-automation/healthstatus/agent-health-status.json
      AUTOMATION_CONFIG_MAP:  learning-center-mongodb-config
      HEADLESS_AGENT:         true
      POD_NAMESPACE:          default (v1:metadata.namespace)
    Mounts:
      /data from data-volume (rw)
      /opt/scripts from agent-scripts (rw)
      /var/lib/automation/config from automation-config (ro)
      /var/lib/mongodb-mms-automation/authentication from learning-center-mongodb-keyfile (rw)
      /var/log/mongodb-mms-automation from logs-volume (rw)
      /var/log/mongodb-mms-automation/healthstatus from healthstatus (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from mongodb-kubernetes-operator-token-ldwsr (ro)
Conditions:
  Type           Status
  PodScheduled   False
Volumes:
  logs-volume:
    Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
    ClaimName:  logs-volume-learning-center-mongodb-0
    ReadOnly:   false
  data-volume:
    Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
    ClaimName:  data-volume-learning-center-mongodb-0
    ReadOnly:   false
  agent-scripts:
    Type:       EmptyDir (a temporary directory that shares a pod's lifetime)
    Medium:
    SizeLimit:  <unset>
  automation-config:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  learning-center-mongodb-config
    Optional:    false
  healthstatus:
    Type:       EmptyDir (a temporary directory that shares a pod's lifetime)
    Medium:
    SizeLimit:  <unset>
  hooks:
    Type:       EmptyDir (a temporary directory that shares a pod's lifetime)
    Medium:
    SizeLimit:  <unset>
  learning-center-mongodb-keyfile:
    Type:       EmptyDir (a temporary directory that shares a pod's lifetime)
    Medium:
    SizeLimit:  <unset>
  mongodb-kubernetes-operator-token-ldwsr:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  mongodb-kubernetes-operator-token-ldwsr
    Optional:    false
QoS Class:       Burstable
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                 node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type     Reason            Age    From               Message
  ----     ------            ----   ----               -------
  Warning  FailedScheduling  7m19s  default-scheduler  0/7 nodes are available: 1 node(s) had taint {node-role.kubernetes.io/master: }, that the pod didn't tolerate, 6 node(s) didn't find available persistent volumes to bind.
  Warning  FailedScheduling  7m19s  default-scheduler  0/7 nodes are available: 1 node(s) had taint {node-role.kubernetes.io/master: }, that the pod didn't tolerate, 6 node(s) didn't find available persistent volumes to bind.

Я использую ClaimRef при создании PV.

apiVersion: v1
kind: PersistentVolume
metadata:
  name: mongo-logs-pv
  labels:
    app: learning-center-mongodb-svc
spec:
  capacity:
    storage: 1Gi
  claimRef:
    namespace: default
    name: logs-volume-learning-center-mongodb-0
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: local-storage
  local:
    path: /home/storage/mongo/logs
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - qatar.corp.sensis.com

Мой класс локального хранилища:

[dsargrad@malta cfg]$ kubectl get storageclass
NAME                      PROVISIONER                    RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
local-storage (default)   kubernetes.io/no-provisioner   Delete          WaitForFirstConsumer   false                  4h22m

Вот описание данных PV

[dsargrad@malta cfg]$ kubectl describe pv mongo-data-pv
Name:              mongo-data-pv
Labels:            app=learning-center-mongodb-svc
Annotations:       <none>
Finalizers:        [kubernetes.io/pv-protection]
StorageClass:      local-storage
Status:            Available
Claim:             default/data-volume-learning-center-mongodb-0
Reclaim Policy:    Retain
Access Modes:      RWO
VolumeMode:        Filesystem
Capacity:          1Gi
Node Affinity:
  Required Terms:
    Term 0:        kubernetes.io/hostname in [qatar.corp.sensis.com]
Message:
Source:
    Type:  LocalVolume (a persistent volume backed by local storage on a node)
    Path:  /home/storage/mongo/data
Events:    <none>

и журналы PV

[dsargrad@malta cfg]$ kubectl describe pv mongo-logs-pv
Name:              mongo-logs-pv
Labels:            app=learning-center-mongodb-svc
Annotations:       <none>
Finalizers:        [kubernetes.io/pv-protection]
StorageClass:      local-storage
Status:            Available
Claim:             default/logs-volume-learning-center-mongodb-0
Reclaim Policy:    Retain
Access Modes:      RWO
VolumeMode:        Filesystem
Capacity:          1Gi
Node Affinity:
  Required Terms:
    Term 0:        kubernetes.io/hostname in [qatar.corp.sensis.com]
Message:
Source:
    Type:  LocalVolume (a persistent volume backed by local storage on a node)
    Path:  /home/storage/mongo/logs
Events:    <none>

На узле qatar.corp.sensis.com у меня есть папки, на которые есть ссылки в PV Скриншот каталога с разрешения

Почему pod не назначается на qatar.corp.sensis.com, а PVC привязываются к PV?


person David Sargrad    schedule 31.03.2021    source источник
comment
Привет @Flo Да. Я знаю, что они находятся в состоянии ожидания. В этом суть моего вопроса. Я создал два PV, которые, по моему мнению, должны быть связаны, как показано выше. У меня достаточно опыта работы с PV и PVC. Раньше я использовал CEPH RBD для своего провайдера. Это мой первый раз с местным PV.   -  person David Sargrad    schedule 31.03.2021
comment
Можете ли вы сделать kubectl describe pv mongo-data-pv и посмотреть, на каком узле находится PV?   -  person Jonas    schedule 31.03.2021
comment
Привет Джонас (@Jonas) .. Я только что добавил это в конце вопроса.   -  person David Sargrad    schedule 31.03.2021
comment
@DavidSargrad извините, я удалил свой комментарий, потому что ответил слишком быстро, извините. Я также не очень привык к этим типам PV. Большую часть времени я привязываю его к облачному хранилищу. Я все еще разбираюсь, надеюсь, я смогу помочь :)   -  person Flo    schedule 31.03.2021
comment
Ty @Flo Я ценю, что ты уделил мне время!   -  person David Sargrad    schedule 31.03.2021
comment
Не знаю, разрешено ли вам делать это в кластере вашей компании, но взгляните на это проблема с GH (если вы еще не пробовали).   -  person Flo    schedule 31.03.2021
comment
@Flo, если вы предлагаете, чтобы я разрешил планировать модули для мастера ... я часто делал это в прошлом ... и я, конечно, мог бы это сделать ... однако это не моя цель здесь. У меня есть довольно большой кластер рабочих узлов, и я хочу, чтобы монго запланировал катар (только сейчас… в конце концов я настрою rook/ceph и предоставлю PV таким образом). Это позволит мне устранить ограничение привязки монго к определенному узлу с локальным хранилищем.   -  person David Sargrad    schedule 31.03.2021
comment
Последнее предложение: Share that Folder using NFS that all workers node have write access to. Then install nfs-client-provisioner which will give you a storageclass and you can create PVCs off of that storageclass and use small chunks of that 1TB for different pods. https://hub.helm.sh/charts/rimusz/nfs-client-provisioner Источник ... Я никогда не пробовал такое решение, так что не знаю, стабильно оно или нет.   -  person Flo    schedule 31.03.2021
comment
@Flo Привет, когда я впервые использовал K8S 2 года назад. Я начал с NFS (тогда я использовал nfs-client-provisioner). В конце концов я перешел на CEPH. Моя цель в этом конкретном примере — использовать локальное хранилище. NFS для меня не вариант. На данный момент я хочу полагаться на локальное хранилище... пока я не настрою ладью и не заработаю в своем кластере. Поэтому я действительно хочу выяснить, почему капсула монго не планирует. Я думаю, что 2 PV, которые я создал, должны быть размещены на Катаре, затем модуль должен быть запланирован на Катар, и, наконец, 2 монго PVC должны быть привязаны.   -  person David Sargrad    schedule 31.03.2021
comment
Это происходит только с mongodb? Или вы думаете, что любая подобная ситуация для любого изображения приведет к тому же? Кроме того, это специальный релиз или вы использовали готовый рум-чарт?   -  person Flo    schedule 31.03.2021
comment
Привет @Flo Это не проблема монго .. Mongo - это всего лишь первый модуль, который я попытался развернуть на своем свежем кластере 1.20 K8S. Это первая капсула, которую я когда-либо использовал с локальным PV. Источник: Тип: LocalVolume   -  person David Sargrad    schedule 31.03.2021
comment
Я бы удалил claimRef: из PersistentVolume.   -  person Jonas    schedule 31.03.2021


Ответы (1)


Я сделал тупоголовое предположение, что если бы PVC заявлял размер, я бы увидел это в выводе команды describe. Мне пришлось получить yaml для спецификации PVC, чтобы увидеть, что он запросил больше, чем было выделено PV.

Я успешно связал

[dsargrad@malta cfg]$ kubectl apply -f *logs* --namespace default
persistentvolume/mongo-logs-pv configured
[dsargrad@malta cfg]$ kubectl apply -f *data* --namespace default
persistentvolume/mongo-data-pv configured
[dsargrad@malta cfg]$ kubectl get pvc
NAME                                    STATUS   VOLUME          CAPACITY   ACCESS MODES   STORAGECLASS    AGE
data-volume-learning-center-mongodb-0   Bound    mongo-data-pv   10Gi       RWO            local-storage   98m
logs-volume-learning-center-mongodb-0   Bound    mongo-logs-pv   10Gi       RWO            local-storage   98m

Я нашел нужную мне деталь, внимательно изучив спецификацию ПВХ. Интересно, что именно это видео на YouTube подсказало мне ответ. Смотрите время, начиная примерно с 6:50.

В следующем примечании размер хранилища составляет 2 ГБ.

[dsargrad@malta cfg]$ kubectl get pvc logs-volume-learning-center-mongodb-0 -o yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  creationTimestamp: "2021-03-31T15:55:40Z"
  finalizers:
  - kubernetes.io/pvc-protection
  labels:
    app: learning-center-mongodb-svc
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:metadata:
        f:labels:
          .: {}
          f:app: {}
      f:spec:
        f:accessModes: {}
        f:resources:
          f:requests:
            .: {}
            f:storage: {}
        f:volumeMode: {}
      f:status:
        f:phase: {}
    manager: kube-controller-manager
    operation: Update
    time: "2021-03-31T15:55:40Z"
  name: logs-volume-learning-center-mongodb-0
  namespace: default
  resourceVersion: "302313"
  uid: 09ef80fe-a45e-45e4-b515-9746b9265476
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 2G
  storageClassName: local-storage
  volumeMode: Filesystem
status:
  phase: Pending
person David Sargrad    schedule 31.03.2021
comment
Хорошая работа, рад, что вы исправили это. Я постараюсь запомнить это на случай, если это случится со мной, хе-хе - person Flo; 31.03.2021
comment
@Flo .. Я ценю ваши отзывы! - person David Sargrad; 31.03.2021