无法在k8s 1.13中安装本地PersistentVolume

时间:2018-12-12 01:43:17

标签: kubernetes

我正在尝试在裸机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 个答案:

答案 0 :(得分:0)

首先,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并且路径不存在时,它将提供与安装有关的错误。

这应该可以解决您的问题。希望这会有所帮助。

编辑:因此,我通过遵循yaml文件使用本地存储设置了cassandra 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

PV.yaml

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

在创建PV之前,请确保/data/cassandra-0存在。让我知道您是否遇到任何问题。