如何在kubeadm搭建的AWS EC2 Kubernetes集群中使用EBS持久卷
前置准备:配置EC2实例IAM权限
你需要先为所有控制平面节点、工作节点关联的IAM角色添加EBS操作权限,权限策略示例如下:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:AttachVolume", "ec2:CreateSnapshot", "ec2:CreateTags", "ec2:CreateVolume", "ec2:DeleteSnapshot", "ec2:DeleteVolume", "ec2:DescribeInstances", "ec2:DescribeSnapshots", "ec2:DescribeTags", "ec2:DescribeVolumes", "ec2:DetachVolume" ], "Resource": "*" } ] }
配置集群开启AWS云提供商
kubeadm默认部署的1.19版本集群未启用AWS云提供商,需要手动修改组件配置:
1. 调整控制平面组件参数
首先在所有控制平面节点创建空的云配置文件:touch /etc/kubernetes/cloud-config
- 编辑
/etc/kubernetes/manifests/kube-apiserver.yaml,在command列表中添加以下参数:--cloud-provider=aws--cloud-config=/etc/kubernetes/cloud-config
- 编辑
/etc/kubernetes/manifests/kube-controller-manager.yaml,同样添加上述两个参数,保存后控制平面组件会自动重启。
2. 调整所有节点的kubelet配置
在所有控制平面、工作节点执行以下操作:
- 编辑
/var/lib/kubelet/config.yaml,添加配置项cloud-provider: aws - 执行命令重启kubelet:
systemctl daemon-reload && systemctl restart kubelet - 重启完成后执行
kubectl get nodes确认所有节点状态为Ready。
部署AWS EBS CSI驱动
1.19版本原生树内EBS插件已标记废弃,推荐部署CSI驱动实现EBS卷管理,直接部署兼容1.19版本的EBS CSI驱动清单即可,部署完成后执行以下命令确认驱动运行正常:kubectl get pods -n kube-system | grep ebs-csi
所有CSI相关Pod状态为Running即为部署成功。
创建EBS存储类
创建存储类配置文件sc.yaml,内容示例如下:
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: aws-ebs-sc provisioner: ebs.csi.aws.com volumeBindingMode: WaitForFirstConsumer parameters: type: gp2 fsType: ext4 reclaimPolicy: Retain
执行命令创建存储类:kubectl apply -f sc.yaml
如果需要将该存储类设置为集群默认存储类,执行以下命令:kubectl patch storageclass aws-ebs-sc -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
功能验证
创建测试PVC配置文件test-pvc.yaml:
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: ebs-test-pvc spec: accessModes: - ReadWriteOnce storageClassName: aws-ebs-sc resources: requests: storage: 10Gi
执行kubectl apply -f test-pvc.yaml创建PVC,再创建测试Pod挂载该PVC,执行kubectl get pv,pvc查看状态,PVC状态为Bound即代表配置生效。
注意事项
- EBS卷和挂载的EC2实例必须在同一可用区,
volumeBindingMode设置为WaitForFirstConsumer可避免可用区不匹配问题 - 集群节点名称必须和EC2实例的私有DNS名称一致,否则云提供商识别会出错
- 如果选择使用原生树内EBS插件,不需要部署CSI驱动,将存储类的
provisioner参数改为kubernetes.io/aws-ebs即可
内容的提问来源于stack exchange,提问作者Suresh

