Набор состояний Kubernetes не использует класс хранения для создания тома персистентности - PullRequest
0 голосов
/ 22 января 2019

Я новичок в кубенете.Я настроил кластер kubernetes на две машины.и когда я развертываю pods, используя набор с сохранением состояния. Но kubernetes не создает pvc.

Я делаю POC для установки кластера redis на кластер kubernets, так что для этого я загрузил набор с состоянием из приведенного ниже URL сайта.[https://medium.com/zero-to/setup-persistence-redis-cluster-in-kubertenes-7d5b7ffdbd98]

Этот набор с состоянием работал нормально с minikube, но когда я развертывал его на кластере kubernetes (я создал на 2-х машинах), он дает ошибку ниже:

root@xen-727:/usr/local/bin# kubectl get pods
NAME              READY     STATUS    RESTARTS   AGE
redis-cluster-0   0/1       Pending   0          13m

root@xen-727:/usr/local/bin# kubectl describe pod redis-cluster-0
Name:           redis-cluster-0
Namespace:      default
Node:           /
Labels:         app=redis-cluster
                controller-revision-hash=redis-cluster-b5b75cc79
                statefulset.kubernetes.io/pod-name=redis-cluster-0
Annotations:    <none>
Status:         Pending
IP:
Controllers:    <none>
Containers:
  redis-cluster:
    Image:      tiroshanm/kubernetes-redis-cluster:latest
    Ports:      6379/TCP, 16379/TCP
    Command:
      /usr/local/bin/redis-server
    Args:
      /redis-conf/redis.conf
    Liveness:           exec [sh -c redis-cli -h $(hostname) ping] delay=20s timeout=1s period=3s #success=1 #failure=3
    Readiness:          exec [sh -c redis-cli -h $(hostname) ping] delay=15s timeout=5s period=10s #success=1 #failure=3
    Environment:        <none>
    Mounts:
      /data from data (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-h22jv (ro)
Conditions:
  Type          Status
  PodScheduled  False
Volumes:
  data:
    Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
    ClaimName:  data-redis-cluster-0
    ReadOnly:   false
  default-token-h22jv:
    Type:       Secret (a volume populated by a Secret)
    SecretName: default-token-h22jv
    Optional:   false
QoS Class:      BestEffort
Node-Selectors: <none>
Tolerations:    node.kubernetes.io/not-ready=:Exists:NoExecute for 300s
                node.kubernetes.io/unreachable=:Exists:NoExecute for 300s
Events:
  FirstSeen     LastSeen        Count   From                    SubObjectPath   Type            Reason                  Message
  ---------     --------        -----   ----                    -------------   --------        ------                  -------
  15m           14m             4       default-scheduler                       Warning         FailedScheduling        pod has unbound immediate PersistentVolumeClaims (repeated 2 times)


root@xen-727:/usr/local/bin# kubectl get pvc
NAME                   STATUS    VOLUME    CAPACITY   ACCESSMODES   STORAGECLASS   AGE
data-redis-cluster-0   Pending                                      slow           15m

root@xen-727:/usr/local/bin# kubectl get pv
No resources found.

Я создал один класс хранения:

root@xen-727:/usr/local/bin# kubectl get sc
NAME             TYPE
slow (default)   kubernetes.io/gce-pd

Но после большого поиска кажется, что kubernetes не использует этот класс хранения для создания pv.

Код класса хранения:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: slow
  annotations:
    storageclass.kubernetes.io/is-default-class: "true"
provisioner: kubernetes.io/gce-pd
parameters:
  type: pd-standard

ниже - мой полный код:

apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
  name: redis-cluster
  labels:
    app: redis-cluster
spec:
  serviceName: redis-cluster
  replicas: 6
  template:
    metadata:
      labels:
        app: redis-cluster
      annotations:
    spec:
      containers:
      - name: redis-cluster
        image: tiroshanm/kubernetes-redis-cluster:latest
        imagePullPolicy: Always
        ports:
        - containerPort: 6379
          name: client
        - containerPort: 16379
          name: gossip
        command: ["/usr/local/bin/redis-server"]
        args: ["/redis-conf/redis.conf"]
        readinessProbe:
          exec:
            command:
            - sh
            - -c
            - "redis-cli -h $(hostname) ping"
          initialDelaySeconds: 15
          timeoutSeconds: 5
        livenessProbe:
          exec:
            command:
            - sh
            - -c
            - "redis-cli -h $(hostname) ping"
          initialDelaySeconds: 20
          periodSeconds: 3
        volumeMounts:
        - name: data
          mountPath: /data
          readOnly: false
  volumeClaimTemplates:
  - metadata:
      name: data
      labels:
        name: redis-cluster
      annotations:
        volume.alpha.kubernetes.io/storage-class: anything
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 100Mi

Ожидаемый результат: должно быть создано 6 узлов с 6 и 6 pvc.

1 Ответ

0 голосов
/ 23 января 2019

Вам нужно создать хранилище, которое вы запрашиваете с PersistentVolumeClaim.

Пример доступных типов томов здесь .

A PersistentVolume (PV) - это часть хранилища в кластере, выделенная администратором. Это ресурс в кластере, точно так же, как узел является ресурсом кластера. PV - это плагины томов, такие как Volumes, но они имеют жизненный цикл, не зависящий от отдельных модулей, которые используют PV. Этот объект API фиксирует подробности реализации хранилища, будь то NFS, iSCSI или специфичная для облачного провайдера система хранения.

A PersistentVolumeClaim (PVC) - это запрос на хранение пользователем. Это похоже на стручок. Блоки используют ресурсы узла, а PVC - ресурсы PV. Контейнеры могут запрашивать определенные уровни ресурсов (процессор и память). Заявки могут запрашивать определенный размер и режимы доступа (например, могут быть смонтированы один раз для чтения / записи или много раз только для чтения).

Если вы находитесь на GCE , вы можете использовать gcePersistentDisk

Том gcePersistentDisk устанавливает Google Compute Engine (GCE) Постоянный диск в ваш Pod. В отличие от emptyDir, который стирается при удалении Pod, содержимое PD сохраняется, а том просто отключается. Это означает, что PD может быть предварительно заполнен данными, и эти данные могут быть «переданы» между модулями.

Вам нужно использовать команду gcloud, чтобы создать диск внутри GCE :

gcloud compute disks create --size=500GB --zone=us-central1-a my-data-disk

И используя его внутри POD, как в примере ниже:

apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: k8s.gcr.io/test-webserver
    name: test-container
    volumeMounts:
    - mountPath: /test-pd
      name: test-volume
  volumes:
  - name: test-volume
    # This GCE PD must already exist.
    gcePersistentDisk:
      pdName: my-data-disk
      fsType: ext4

Если вы предпочитаете, вы можете настроить свой собственный сервер nfs и использовать его внутри Kubernetes, пример того, как его настроить, доступен здесь .

Вы также можете проверить документацию о том, как использовать тома в AWS .

Надеюсь, этого будет достаточно, чтобы помочь вам.

...