Kubernetes Persistent Volumes With EBS (in EC2 instance)

问题描述 投票:0回答:1

目前,我正在尝试使用Kubernetes与Kubeadm为我的MYSQL数据库实现卷持久化,环境是基于一个使用EBS存储磁盘的亚马逊EC2实例。

正如你可以看到下面的存储类,一个持久化卷以及一个持久化卷的要求已经实现,以便有一个mysql的持久化.然而,当我试图部署mysql pod(在所附的图像上)时,发生了一个错误。

mysql-pv.yml。

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: standard
provisioner: kubernetes.io/aws-ebs
parameters:
  type: gp2
reclaimPolicy: Retain
mountOptions:
  - debug
volumeBindingMode: Immediate
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-pv
  labels:
    type: amazonEBS
spec:
  capacity:
    storage: 5Gi
  storageClassName: standard
  accessModes:
    - ReadWriteOnce
  awsElasticBlockStore:
    volumeID: vol-ID
    fsType: ext4
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pv-claim
spec:
  storageClassName: standard
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi

mysql.yml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
        - image: mysql:5.7.30
          name: mysql
          env:
            - name: MYSQL_ROOT_PASSWORD
              value: MYPASSWORD
          ports:
            - containerPort: 3306
              name: mysql
          volumeMounts:
            - name: mysql-persistent-storage
              mountPath: /var/lib/mysql
      volumes:
        - name: mysql-persistent-storage
          persistentVolumeClaim:
            claimName: mysql-pv-claim
---
apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  type: NodePort
  ports:
    - port: 3306
      targetPort: 3306
      nodePort: 31306
  selector:
    app: mysql

这是我的mysql pod描述。

Name:           mysql-5c9788fc65-jq2nh
Namespace:      default
Priority:       0
Node:           ip-172-31-31-210/172.31.31.210
Start Time:     Sat, 23 May 2020 12:19:24 +0000
Labels:         app=mysql
                pod-template-hash=5c9788fc65
Annotations:    <none>
Status:         Pending
IP:             
IPs:            <none>
Controlled By:  ReplicaSet/mysql-5c9788fc65
Containers:
  mysql:
    Container ID:   
    Image:          mysql:5.7.30
    Image ID:       
    Port:           3306/TCP
    Host Port:      0/TCP
    State:          Waiting
      Reason:       ContainerCreating
    Ready:          False
    Restart Count:  0
    Environment:
      MYSQL_ROOT_PASSWORD:  MYPASS
    Mounts:
      /data/ from mysql-persistent-storage (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-cshk2 (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             False 
  ContainersReady   False 
  PodScheduled      True 
Volumes:
  mysql-persistent-storage:
    Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
    ClaimName:  mysql-pv-claim
    ReadOnly:   false
  default-token-cshk2:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-cshk2
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s

这是我得到的错误。

Events:
Type     Reason       Age        From                       Message
----     ------       ----       ----                       -------
Normal   Scheduled    <unknown>  default-scheduler          
Successfully assigned default/mysql-5c9788fc65-jq2nh to ip-172-31-31-210
Warning  FailedMount  39m        kubelet, ip-172-31-31-210  MountVolume.SetUp failed for volume "mysql-pv" : mount failed: exit status 32

Mounting command: systemd-run
Mounting arguments: --description=Kubernetes transient mount for /var/lib/kubelet/pods/29d5cee7-da11-4a0c-b5aa-e262f919d1ba/volumes/kubernetes.io~aws-ebs/mysql-pv --scope -- mount  -o bind /var/lib/kubelet/plugins/kubernetes.io/aws-ebs/mounts/vol-06212746d87534157 /var/lib/kubelet/pods/29d5cee7-da11-4a0c-b5aa-e262f919d1ba/volumes/kubernetes.io~aws-ebs/mysql-pv
Output: Running scope as unit: run-r11fefbbda1d241c2985931d3adaaa969.scope
mount: /var/lib/kubelet/pods/29d5cee7-da11-4a0c-b5aa-e262f919d1ba/volumes/kubernetes.io~aws-ebs/mysql-pv: special device /var/lib/kubelet/plugins/kubernetes.io/aws-ebs/mounts/vol-06212746d87534157 does not exist.
Warning  FailedMount  39m  kubelet, ip-172-31-31-210  MountVolume.SetUp failed for volume "mysql-pv" : mount failed: exit status 32

谁能帮帮我?

mysql amazon-ec2 kubernetes amazon-ebs persistent-volumes
1个回答
0
投票

这里是一些额外的信息。

kubectl描述pvc mysql-pv-claim :

Name:          mysql-pv-claim
Namespace:     default
StorageClass:  standard
Status:        Bound 
Volume:        mysql-pv
Labels:        <none>
Annotations:   pv.kubernetes.io/bind-completed: yes
           pv.kubernetes.io/bound-by-controller: yes
Finalizers:    [kubernetes.io/pvc-protection]
Capacity:      5Gi
Access Modes:  RWO
VolumeMode:    Filesystem
Mounted By:    mysql-5c9788fc65-jq2nh
Events:        <none>

kubectl describe pv mysql-pv :

Name:            mysql-pv
Labels:          type=amazonEBS
Annotations:     pv.kubernetes.io/bound-by-controller: yes
Finalizers:      [kubernetes.io/pv-protection]
StorageClass:    standard
Status:          Bound
Claim:           default/mysql-pv-claim
Reclaim Policy:  Retain
Access Modes:    RWO
VolumeMode:      Filesystem
Capacity:        5Gi
Node Affinity:   <none>
Message:         
Source:
    Type:       AWSElasticBlockStore (a Persistent Disk resource in AWS)
    VolumeID:   vol-06212746d87534157
    FSType:     ext4
    Partition:  0
    ReadOnly:   false
Events:         <none>

lsblk :

NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
loop0         7:0    0   18M  1 loop /snap/amazon-ssm-agent/1566
loop1         7:1    0 93.9M  1 loop /snap/core/9066
loop2         7:2    0 93.8M  1 loop /snap/core/8935
nvme0n1     259:0    0   10G  0 disk 
nvme1n1     259:1    0   15G  0 disk 
└─nvme1n1p1 259:2    0   15G  0 part /

我想使用nvme0n1。

我没有kubelet和kube-controller-manager.log文件日志。


0
投票

检查PV和PVC的状态,如果PVC是在约束状态或没有。

kubectl describe pvc mysql-pv-claimkubectl describe pv mysql-pv你是否有 EBS CSI驱动程序 安装?

其他原因可能是,我想你漏加了 --cloud-provider=aws,这是CCM对节点的要求。查看类似的 发出.

下面的链接有所有的IAM权限和一个如何在Kubernetes中创建和挂载EBS卷的工作示例,从docs上可以看到 集群配置 用于使用EBS。

对于kubeadm配置,配置定义在: varlibkubeletconfig.yaml中定义。varlibkubeletkubeadm-flags.env。

如果集群是使用 kubeadm 然后,在所有的节点上定义环境变量 kubeadm-flags.env如果要手动解决这个问题,你需要添加 --cloud-provider=aws 标签到 kubeadm-flags.env 并重新启动服务,这样就可以解决这个问题。

systemctl daemon-reload && systemctl restart kubelet或提供以下信息 配置 的kubeadm。在你的情况下,将openstack改为AWS。

检查以下内容 博客 以便更好地理解。

kind: InitConfiguration
nodeRegistration:
  kubeletExtraArgs:
    cloud-provider: "aws"
    cloud-config: "/etc/kubernetes/cloud.conf"
---
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
apiServer:
  extraArgs:
    cloud-provider: "aws"
    #cloud-config: "/etc/kubernetes/cloud.conf"
  extraVolumes:
  - name: cloud
    hostPath: "/etc/kubernetes/cloud.conf"
    mountPath: "/etc/kubernetes/cloud.conf"
controllerManager:
  extraArgs:
    cloud-provider: "aws"
    #cloud-config: "/etc/kubernetes/cloud.conf"
  extraVolumes:
  - name: cloud
    hostPath: "/etc/kubernetes/cloud.conf"
    mountPath: "/etc/kubernetes/cloud.conf"```

© www.soinside.com 2019 - 2024. All rights reserved.