代码之家  ›  专栏  ›  技术社区  ›  FGreg ThiefMaster

无法在k8s 1.13中装入本地PersistentVolume

  •  0
  • FGreg ThiefMaster  · 技术社区  · 6 年前

    我试图在裸机kubernetes集群(v1.13)上部署一个具有持久卷声明的有状态集,但是在尝试装载卷时pod超时。

    local-storage 定义的存储类:

    kind: StorageClass
    apiVersion: storage.k8s.io/v1
    metadata:
      name: local-storage
      annotations:
        storageclass.kubernetes.io/is-default-class: "true"
    provisioner: kubernetes.io/no-provisioner
    volumeBindingMode: WaitForFirstConsumer
    

    我定义了一个PV:

    kind: PersistentVolume
    apiVersion: v1
    metadata:
      name: cassandradev1
      labels:
        app: cassandra
        environment: dev
    spec:
      storageClassName: local-storage
      capacity:
        storage: 1Ti
      accessModes:
        - ReadWriteOnce
      local:
        path: "/data1/cassandradev1"
      nodeAffinity:
        required:
          nodeSelectorTerms:
          - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
              - my-node1
    

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: cassandra-set
    spec:
      ...
      volumeClaimTemplates:
      - metadata:
          name: cassandra-data
        spec:
          selector:
            matchLabels:
              app: "cassandra"
              environment: "dev"
          accessModes: [ "ReadWriteOnce" ]
          storageClassName: "local-storage"
          resources:
            requests:
              storage: 1Ti
    

    当我尝试应用有状态集时,Pod会被调度,但会超时:

    Normal   Scheduled    2m13s  default-scheduler            Successfully assigned default/cassandra-set-0 to my-node1
    Warning  FailedMount  13s    kubelet, my-node1  Unable to mount volumes for pod "cassandra-set-0 (dd252f77-fda3-11e8-96d3-1866dab905dc)": timeout expired waiting for volumes to attach or mount for pod "default"/"cassandra-set-0". list of unmounted volumes=[cassandra-data]. list of unattached volumes=[cassandra-data default-token-t2dg8]
    

    如果我查看控制器的日志,就会看到一条错误消息,说明没有匹配的卷插件:

    kubectl logs pod/kube-controller-manager -n kube-system
    W1212 00:51:24.218114       1 plugins.go:845] FindExpandablePluginBySpec(cassandradev1) -> err:no volume plugin matched
    

    下一步去哪儿看有什么想法吗?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Prafull Ladha    6 年前

    首先,PV的定义是不正确的,没有 hostPath 在本地存储类中。这就是您应该如何定义本地存储PV:

    kind: PersistentVolume
    apiVersion: v1
    metadata:
      name: cassandradev1
      labels:
        app: cassandra
        environment: dev
    spec:
      storageClassName: local-storage
      capacity:
        storage: 1Ti
      accessModes:
        - ReadWriteOnce
      local:
        path: "/data1/cassandradev1"
      nodeAffinity:
        required:
          nodeSelectorTerms:
          - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
              - my-node1
    

    也要记住不像hostPath, /data1/cassandradev1 应该存在于 my-node1 local-storage 不会自动创建路径,并且当部署statefulset且路径不存在时,它将给出与装载相关的错误。

    这应该能解决你的问题。希望这有帮助。

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      generation: 1
      labels:
        state: cassandra
      name: cassandra
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: cassandra
      serviceName: cassandra
      template:
        metadata:
          annotations:
            pod.alpha.kubernetes.io/initialized: "true"
          creationTimestamp: null
          labels:
            app: cassandra
        spec:
          containers:
          - args:
            - chmod -R 777 /logs/; /on_start.sh
            command:
            - /bin/sh
            - -c
            image: <image>
            imagePullPolicy: Always
            name: cassandra
            ports:
            - containerPort: 9042
              protocol: TCP
            resources: {}
            volumeMounts:
            - mountPath: /data
              name: data
            imagePullSecrets:
          - name: gcr-imagepull-json-key
      volumeClaimTemplates:
      - metadata:
          creationTimestamp: null
          name: data
        spec:
          accessModes:
          - ReadWriteOnce
          resources:
            requests:
              storage: 10Gi
          storageClassName: local-storage
    

    山药

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      labels:
        type: local
      name: cassandra-data-vol-0
    spec:
      accessModes:
      - ReadWriteOnce
      capacity:
        storage: 10Gi
      claimRef:
        apiVersion: v1
        kind: PersistentVolumeClaim
        name: data-cassandra-0
        namespace: default
      local:
        path: /data/cassandra-0
      nodeAffinity:
        required:
          nodeSelectorTerms:
          - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
              - ip-10-0-1-91.ec2.internal
      persistentVolumeReclaimPolicy: Retain
      storageClassName: local-storage
    

    确保 /data/cassandra-0