创建MySQL StatefulSet时遭遇Kubernetes未知字段错误求助
问题:创建MySQL StatefulSet时遇到字段解析错误
错误信息
执行kubectl apply时出现以下错误:
C:\Users\Azvmadmin15\.docker\YAML>kubectl apply -f mysqlpvc.yaml service/mysql-srv created Error from server (BadRequest): error when creating "mysqlpvc.yaml": StatefulSet in version "v1" cannot be handled as a StatefulSet: strict decoding error: unknown field "spec.template.spec.ports", unknown field "spec.template.spec.volumeMounts"
当前集群资源状态
# 获取所有资源 C:\Users\Azvmadmin15\.docker\YAML>kubectl get all NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 78m service/mysql-srv ClusterIP 10.108.13.118 <none> 3306/TCP 17m # 获取PV状态 C:\Users\Azvmadmin15\.docker\YAML>kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE mysql-pv-volume 10Gi RWO Retain Bound default/mysql-pv-claim manual 64m # 获取PVC状态 C:\Users\Azvmadmin15\.docker\YAML>kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE mysql-pv-claim Bound mysql-pv-volume 10Gi RWO manual 67m
所用YAML文件内容
apiVersion: apps/v1 kind: StatefulSet metadata: name: mysql-ss spec: replicas: 1 selector: matchLabels: app: "mysql-pod" serviceName: "mysql" template: metadata: labels: app: "mysql-pod" spec: volumes: - name: mysql-persistent-storage persistentVolumeClaim: claimName: mysql-pv-claim containers: - image: mysql:5.6 name: mysql env: - name: MYSQL_ROOT_PASSWORD value: tiger1234 ports: - containerPort: 3306 name: mysql volumeMounts: - name: mysql-persistent-storage mountPath: /var/lib/mysql --- apiVersion: v1 kind: Service metadata: name: mysql-srv spec: ports: - port: 3306 selector: app: "mysql"
问题原因与修复方案
核心问题
- 字段位置错误:
ports和volumeMounts是容器级别的配置,必须嵌套在containers数组的具体容器条目下,而不是和containers同级放在spec.template.spec下。Kubernetes无法识别错误位置的字段,因此抛出解码错误。 - 服务标签不匹配:Service的
selector设置为app: "mysql",但StatefulSet模板中Pod的标签是app: "mysql-pod",会导致服务无法关联到Pod。 - StatefulSet的serviceName不匹配:StatefulSet的
serviceName需要指向已存在的Headless Service名称,原配置中写的mysql与实际创建的mysql-srv不一致。
修正后的YAML文件
apiVersion: apps/v1 kind: StatefulSet metadata: name: mysql-ss spec: replicas: 1 selector: matchLabels: app: "mysql-pod" serviceName: "mysql-srv" # 与下方Service名称保持一致 template: metadata: labels: app: "mysql-pod" spec: volumes: - name: mysql-persistent-storage persistentVolumeClaim: claimName: mysql-pv-claim containers: - image: mysql:5.6 name: mysql env: - name: MYSQL_ROOT_PASSWORD value: tiger1234 ports: # 移至containers条目内部 - containerPort: 3306 name: mysql volumeMounts: # 移至containers条目内部 - name: mysql-persistent-storage mountPath: /var/lib/mysql --- apiVersion: v1 kind: Service metadata: name: mysql-srv spec: clusterIP: None # 改为Headless Service,适配StatefulSet的网络需求 ports: - port: 3306 targetPort: 3306 selector: app: "mysql-pod" # 与Pod标签保持匹配
执行步骤
- 删除已创建的错误Service:
kubectl delete service mysql-srv
- 应用修正后的YAML文件:
kubectl apply -f mysqlpvc.yaml
- 验证资源状态:
kubectl get statefulset mysql-ss kubectl get pods -l app=mysql-pod kubectl get service mysql-srv
内容的提问来源于stack exchange,提问作者Balaji
相关产品推荐
相关产品推荐

