StatefulSet部署Cassandra时出现spec.containers[0].volumeMounts[0].name: Not found错误的排查求助
StatefulSet部署Cassandra时出现spec.containers[0].volumeMounts[0].name: Not found错误的排查求助
我在部署Cassandra StatefulSet时遇到了卷挂载的问题,先跟大家说下我的操作流程:
我先部署了nfs-subdir-external-provisioner,使用helm安装的命令如下:
root@k8s-eu-1-master:~# helm install k8s-eu-1-worker-1-nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \ > --set nfs.server=38.242.249.121 \ > --set nfs.path=/srv/shared-k8s-eu-1-worker-1 \ > --set storageClass.name=k8s-eu-1-worker-1 \ > --set storageClass.provisionerName=k8s-sigs.io/k8s-eu-1-worker-1 \ > --set nfs.volumeName=k8s-eu-1-worker-1-nfs-v
安装完成后检查资源状态,都是正常运行的:
root@k8s-eu-1-master:~# helm ls NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION k8s-eu-1-worker-1-nfs-subdir-external-provisioner default 1 2023-11-07 17:14:42.197847444 +0100 CET deployed nfs-subdir-external-provisioner-4.0.18 4.0.2 root@k8s-eu-1-master:~# kubectl get deployments NAME READY UP-TO-DATE AVAILABLE AGE k8s-eu-1-worker-1-nfs-subdir-external-provisioner 1/1 1 1 2m9s root@k8s-eu-1-master:~# kubectl get pods NAME READY STATUS RESTARTS AGE k8s-eu-1-worker-1-nfs-subdir-external-provisioner-79fff4ff2qx7k 1/1 Running 0 2m27s
查看provisioner的Pod详情,确认卷k8s-eu-1-worker-1-nfs-v已经正确挂载:
root@k8s-eu-1-master:~# kubectl describe pod k8s-eu-1-worker-1-nfs-subdir-external-provisioner-79fff4ff2qx7k # 省略非关键输出,重点看卷配置 Volumes: k8s-eu-1-worker-1-nfs-v: Type: NFS (an NFS mount that lasts the lifetime of a pod) Server: xx.xxx.xxx.xxx Path: /srv/shared-k8s-eu-1-worker-1 ReadOnly: false
接下来我修改了Cassandra的StatefulSet YAML,想把这个NFS卷挂载到Cassandra Pod里,完整配置如下:
apiVersion: apps/v1 kind: StatefulSet metadata: name: cassandra labels: app: cassandra spec: serviceName: cassandra replicas: 3 selector: matchLabels: app: cassandra template: metadata: labels: app: cassandra spec: terminationGracePeriodSeconds: 1800 containers: - name: cassandra image: gcr.io/google-samples/cassandra:v13 imagePullPolicy: Always ports: - containerPort: 7000 name: intra-node - containerPort: 7001 name: tls-intra-node - containerPort: 7199 name: jmx - containerPort: 9042 name: cql resources: limits: cpu: "500m" memory: 1Gi requests: cpu: "500m" memory: 1Gi securityContext: capabilities: add: - IPC_LOCK lifecycle: preStop: exec: command: - /bin/sh - -c - nodetool drain env: - name: MAX_HEAP_SIZE value: 512M - name: HEAP_NEWSIZE value: 100M - name: CASSANDRA_SEEDS value: "cassandra-0.cassandra.default.svc.cluster.local" - name: CASSANDRA_CLUSTER_NAME value: "K8Demo" - name: CASSANDRA_DC value: "DC1-K8Demo" - name: CASSANDRA_RACK value: "Rack1-K8Demo" - name: POD_IP valueFrom: fieldRef: fieldPath: status.podIP readinessProbe: exec: command: - /bin/bash - -c - /ready-probe.sh initialDelaySeconds: 15 timeoutSeconds: 5 # 这里是我配置的卷挂载 volumeMounts: - name: k8s-eu-1-worker-1-nfs-v mountPath: /srv/shared-k8s-eu-1-worker-1 # 原有的volumeClaimTemplates volumeClaimTemplates: - metadata: name: k8s-eu-1-worker-1 spec: accessModes: [ "ReadWriteOnce" ] storageClassName: k8s-eu-1-worker-1 resources: requests: storage: 1Gi --- kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: k8s-eu-1-worker-1 provisioner: k8s-sigs.io/k8s-eu-1-worker-1 parameters: #type: pd-ss
但应用这个配置后,出现了错误:
root@k8s-eu-1-master:~# kubectl apply -f ./cassandraStatefulApp/cassandra-statefulset.yaml statefulset.apps/cassandra created Warning: resource storageclasses/k8s-eu-1-worker-1 is missing the kubectl.kubernetes.io/last-applied-configuration annotation which is required by kubectl apply. kubectl apply should only be used on resources created declaratively by either kubectl create --save-config or kubectl apply. The missing annotation will be patched automatically. The StorageClass "k8s-eu-1-worker-1" is invalid: parameters: Forbidden: updates to parameters are forbidden. root@k8s-eu-1-master:~# kubectl get statefulsets NAME READY AGE cassandra 0/3 21s root@k8s-eu-1-master:~# kubectl describe statefulsets cassandra # 省略非关键输出,重点看错误事件 Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning FailedCreate 20s (x13 over 41s) statefulset-controller create Pod cassandra-0 in StatefulSet cassandra failed error: Pod "cassandra-0" is invalid: spec.containers[0].volumeMounts[0].name: Not found: "k8s-eu-1-worker-1-nfs-v"
我实在搞不清楚哪里出错了,想请教大家:我在StatefulSet的YAML里指定VolumeMounts的方式到底哪里有问题?正确的做法应该是什么?
备注:内容来源于stack exchange,提问作者Raphael10
相关产品推荐
相关产品推荐

