【问题标题】:Kubernetes Persistent Volumes With EBS (in EC2 instance)具有 EBS 的 Kubernetes 持久卷(在 EC2 实例中)
【发布时间】:2020-09-10 08:00:31
【问题描述】:

目前我正在尝试使用 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

有人可以帮助我吗?

【问题讨论】:

  • 您能否在此处查看有关在 EBS github.com/kubernetes/kubernetes/issues/86064 的情况下如何安装的步骤。还需要您提供有关kubectl describe pvc mysql-pv-claimkubectl describe pv mysql-pv 的更多信息。您需要检查它们是否创建成功。也请进入节点内部并运行lsblk 以检查挂载阶段的情况。
  • 如果你可以分享 kubelet /var/log/kubelet log/var/log/kube-controller-manager.log 的日志
  • mount键中,表示特殊设备不存在。这意味着 pvc 不受 pv 的限制。因此它失败了。

标签: mysql amazon-ec2 kubernetes amazon-ebs persistent-volumes


【解决方案1】:

如果PVC处于有界状态,则检查PV和PVC的状态。

kubectl describe pvc mysql-pv-claim kubectl describe pv mysql-pv EBS CSI driver 安装了吗?

其他原因可能是,我认为您错过了添加 --cloud-provider=aws 的选项,这是 CCM 对节点的要求。查看类似的issue

以下链接包含所有 IAM 权限和一个关于如何在 Kubernetes 中创建和挂载 EBS 卷的工作示例,来自 cluster configuration 上的文档以使用 EBS。

使用 kubeadm 配置,配置定义在:/var/lib/kubelet/config.yaml/var/lib/kubelet/kubeadm-flags.env

如果集群是使用 kubeadm 部署的,那么在kubeadm-flags.env 中的所有节点上定义环境变量 要手动解决此问题,您需要将 --cloud-provider=aws 标签添加到 kubeadm-flags.env 并重新启动服务,这将解决问题:

systemctl daemon-reload &amp;&amp; systemctl restart kubelet 或为 kubeadm 提供以下 configuration。在您的情况下将 openstack 更改为 AWS。

查看以下blog 以获得更好的理解。

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"```

【讨论】:

  • 这就是你应该如何配置集群,它已经为其他人工作了,文档中也提到了这一点。节点宕机是什么意思?可以提供 kubelet 日志吗?还需要安装 EBS CSI 驱动程序。
  • 但是 EBS CSI 驱动程序是否适用于 Amazon EKS 集群?因为我没有使用 EKS 集群。
  • 之前不清楚,但是您是否检查了此处列出的所有先决条件kubernetes.io/docs/concepts/storage/volumes/… 此外,您的 kubeadm 配置应该严格类似于上面。它来自 kubernetes 文档。
  • 添加了一个博客以供安装和使用 ebs 创建 pv/pvc。请在使用前创建 EBS。在 kubeadm 配置中将 --cloud-provider 作为 aws。遵循上述评论中的所有先决条件。
【解决方案2】:

以下是一些附加信息:

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 描述 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 文件日志。

【讨论】:

  • 您使用的 Kubernetes 集群是什么类型的?是EKS吗?您能否提供有关您的集群配置的更多详细信息?
  • 我在一个 ec2 实例上使用 kubeadm 创建了一个 kubernetes 集群。当前,此集群有一个节点(主节点)。我愿意在不使用付费亚马逊解决方案的情况下在 ec2 上做所有事情。
猜你喜欢
  • 2018-09-17
  • 2021-02-15
  • 1970-01-01
  • 2016-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-11
  • 2021-11-06
相关资源
最近更新 更多