使用k8s 安装mysql时碰到的问题,不仅仅是mysql,一切需要动用到卷的都有一样的问题

# mysql.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-pv1
spec:
  capacity:
    storage: 5Gi
  storageClassName: mysql-5-7-volume-storage
  accessModes:
    - ReadWriteMany
  nfs:
    server: 172.16.200.230
    path: "/docker/mysql_5_7"
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql-5-7
  labels:
    name: mysql-5-7
spec:
  serviceName: mysql-5-7
  replicas: 1
  selector:
    matchLabels:
      app: mysql-5-7-service
  template:
    metadata:
      labels:
        app: mysql-5-7-service
    spec:
      terminationGracePeriodSeconds: 0
      containers:
      - name: mysql-5-7-service
        image: mysql:5.7
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 3306
          protocol: TCP
        volumeMounts:
        - name: mysql-5-7-volume
          mountPath: /var/lib/mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "123456"
  volumeClaimTemplates:
  - metadata:
      name: mysql-5-7-volume
    spec:
      accessModes: [ "ReadWriteMany" ]
      resources:
        requests:
          storage: 5Gi
      storageClassName: mysql-5-7-volume-storage
# 输入命令查看
kubectl describe pods mysql-5-7-0

Events:
  Type     Reason            Age        From                      Message
  ----     ------            ----       ----                      -------
  Normal   Scheduled         <unknown>  default-scheduler         Successfully assigned default/mysql-5-7-0 to base-node01
  Warning  FailedScheduling  <unknown>  default-scheduler         persistentvolumeclaim "mysql-5-7-volume-mysql-5-7-0" not found
  Warning  FailedScheduling  <unknown>  default-scheduler         error while running "VolumeBinding" filter plugin for pod "mysql-5-7-0": pod has unbound immediate PersistentVolumeClaims
  Warning  FailedScheduling  <unknown>  default-scheduler         error while running "VolumeBinding" filter plugin for pod "mysql-5-7-0": pod has unbound immediate PersistentVolumeClaims
  Normal   Created           5m43s      kubelet, base-node01  Created container mysql-5-7-service
  Normal   Started           5m43s      kubelet, base-node01  Started container mysql-5-7-service
  Normal   Pulled            5m43s      kubelet, base-node01  Container image "mysql:5.7" already present on machine
# 查看pv
[root@base-master scripts]# kubectl get pv
NAME               CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM                                  STORAGECLASS                  REASON   AGE
mysql-pv1          5Gi        RWX            Retain           Bound       default/mysql-5-7-volume-mysql-5-7-0   mysql-5-7-volume-storage               5m15s

# 查看pvc
[root@base-master scripts]# kubectl get pvc
NAME                           STATUS   VOLUME             CAPACITY   ACCESS MODES   STORAGECLASS                  AGE
mysql-5-7-volume-mysql-5-7-0   Bound    mysql-pv1          5Gi        RWX            mysql-5-7-volume-storage      6m7s
# describe pv
[root@base-master scripts]# kubectl describe pv mysql-pv1
Name:            mysql-pv1
Labels:          <none>
Annotations:     kubectl.kubernetes.io/last-applied-configuration:
                   {"apiVersion":"v1","kind":"PersistentVolume","metadata":{"annotations":{},"name":"mysql-pv1"},"spec":{"accessModes":["ReadWriteMany"],"cap...
                 pv.kubernetes.io/bound-by-controller: yes
Finalizers:      [kubernetes.io/pv-protection]
StorageClass:    mysql-5-7-volume-storage
Status:          Bound
Claim:           default/mysql-5-7-volume-mysql-5-7-0
Reclaim Policy:  Retain
Access Modes:    RWX
VolumeMode:      Filesystem
Capacity:        5Gi
Node Affinity:   <none>
Message:
Source:
    Type:      NFS (an NFS mount that lasts the lifetime of a pod)
    Server:    172.16.200.230
    Path:      /docker/mysql_5_7
    ReadOnly:  false
Events:        <none>
# describe pvc
[root@base-master scripts]# kubectl describe pvc mysql-5-7-volume-mysql-5-7-0
Name:          mysql-5-7-volume-mysql-5-7-0
Namespace:     default
StorageClass:  mysql-5-7-volume-storage
Status:        Bound
Volume:        mysql-pv1
Labels:        app=mysql-5-7-service
Annotations:   pv.kubernetes.io/bind-completed: yes
               pv.kubernetes.io/bound-by-controller: yes
Finalizers:    [kubernetes.io/pvc-protection]
Capacity:      5Gi
Access Modes:  RWX
VolumeMode:    Filesystem
Mounted By:    mysql-5-7-0
Events:
  Type     Reason              Age    From                         Message
  ----     ------              ----   ----                         -------
  Warning  ProvisioningFailed  9m17s  persistentvolume-controller  storageclass.storage.k8s.io "mysql-5-7-volume-storage" not found

这个错误好像是因为pvc没有正常执行造成的,但是pvc为什么会报一个
storageclass.storage.k8s.io "mysql-5-7-volume-storage" not found 的错误?

硬盘空间是足够的。nfs也通过测试,完全可用。

另外不仅仅是mysql,其他一切需要有状态服务,都会碰到类似的问题,比如mongodb, pgsql。都因为这个问题无法安装。

求解....

阅读 6.2k
2 个回答

https://kubernetes.io/zh/docs...

补充楼上答案, StorageClass 是kubernetes用来管理磁盘动态分配的. 为什么需要 StorageClass 呢.

因为 pvc 通常是跟云厂商以及集群本地磁盘挂钩的. 假设你固定声明了 pvc. 那么可能造成你的服务在阿里云的集群上运行没问题, 可万一迁移到了其他云厂商, 你就得修改pvc. 所以如果使用StorageClass. 集群就会通过对应的StorageClass规则来自动帮你分配磁盘以及创建pvc.

以上只是个人观点,如有不足欢迎补充.

那么回到现在 mysql-5-7-volume-storage not found 这个错误. 题主有两个选择.

  1. 像 @fefe 描述的那样. 创建对应的 StorageClass.
  2. 删除 storageClassName: mysql-5-7-volume-storage. 然后自行创建对应的pvc

storageclass

它是一个 k8s 对象,比如:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: standard
provisioner: kubernetes.io/aws-ebs
parameters:
  type: gp2
reclaimPolicy: Retain
allowVolumeExpansion: true
mountOptions:
  - debug
volumeBindingMode: Immediate

你创建过你的 mysql-5-7-volume-storage 嘛?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题