Kubernetes有状态集未使用存储类创建持久化卷

时间:2019-01-22 14:17:54

标签: java docker redis kubernetes kubernetes-helm

我是kubenetes的新手。我已经在两台机器上设置了一个Kubernetes集群。以及当我使用有状态集部署Pod时。但是kubernetes没有创建pvc。

我正在做POC,用于在kubernets集群上安装Redis集群,为此,我从站点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个pvc和6个pv。

1 个答案:

答案 0 :(得分:0)

您需要创建要通过PersistentVolumeClaim请求的存储。

here中提供了卷类型的示例。

  

PersistentVolume(PV)是集群中由管理员配置的一块存储。它是群集中的资源,就像节点是群集资源一样。 PV是类似于Volumes的卷插件,但是其生命周期独立于使用PV的任何单个容器。该API对象捕获NFS,iSCSI或特定于云提供商的存储系统的存储实现细节。

     

PersistentVolumeClaim(PVC)是用户存储的请求。它类似于吊舱。容器消耗节点资源,PVC消耗PV资源。 Pod可以请求特定级别的资源(CPU和内存)。声明可以请求特定的大小和访问模式(例如,可以一次读/写或多次只读安装)。

如果您使用的是GCE,则可以使用gcePersistentDisk

  

一个gcePersistentDisk卷将Google Compute Engine(GCE)Persistent Disk装入您的Pod。与emptyDir不同,gcloud在删除Pod时会被擦除,它保留了PD的内容,而只是卸载了该卷。这意味着可以在PD中预填充数据,并且可以在Pod之间“传递”数据。

您需要使用gcloud compute disks create --size=500GB --zone=us-central1-a my-data-disk 命令在GCE内创建驱动器:

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

如果愿意,您可以设置自己的setAttribute()服务器,并在Kubernetes中使用它,here提供了有关如何设置它的示例。

您还可以查看有关如何use volumes on AWS的文档。

希望这足以为您提供帮助。