Complete a 3 Question Survey and Earn a re:Post Badge
Help improve AWS Support Official channel in re:Post and share your experience - complete a quick three-question survey to earn a re:Post badge!
如何在 Amazon EKS 中创建使用 EBS CSI 驱动程序的拓扑感知卷预置并对其进行故障排除?
我想在使用 Amazon Elastic Block Store (Amazon EBS) 组件的 Amazon Elastic Kubernetes Service (Amazon EKS) 集群中配置拓扑感知卷。
简短描述
要在使用 Amazon EBS 组件的 Amazon EKS 中配置云基础设施拓扑并对其进行故障排除,请完成以下步骤:
- 检查 EBS CSI 附加组件的配置是否正确。
- 配置具有拓扑感知实现的存储类。
- 创建容器组和工作负载,然后测试拓扑感知场景。
- 对 EBS CSI 控制器错误进行故障排除。
解决方法
**注意:**如果在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请确保您使用的是最新的 AWS CLI 版本。
检查 EBS CSI 附加组件的配置是否正确
**注意:**最佳做法是使用 EBS CSI 预置程序 ebs.csi.aws.com 预置 EBS 卷。此外,在预置拓扑感知卷时使用 EBS CSI 预置程序,而不是使用内置的 Kubernetes 预置程序 kubernetes.io/aws-ebs。
要检查 EBS CSI 附加组件的配置是否正确,请完成以下步骤:
1. 检查 CSI 驱动程序是否已安装。如果未安装,请查看 Amazon EBS CSI 驱动程序以安装 CSI 驱动程序。
2. 检查服务账户上的 AWS Identity and Access Management (IAM) 角色是否拥有最低的 EBS 卷操作权限。
**注意:**您必须使用服务账户的 IAM 角色 (IRSA) 为服务账户添加注释。如果您没有使用 IRSA 为服务账户添加注释,那么 Amazon EBS CSI 驱动程序默认会在 Worker 节点上导入 IAM 角色。如果 CSI 驱动程序默认为 Worker 节点上的 IAM 角色,请在 AWS 管理控制台中配置所需的 IAM 角色权限。
配置具有拓扑感知实现的存储类
1. 运行以下命令部署存储类。根据您的特定部署要求编辑清单。
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-ebs-csi-driver/master/examples/kubernetes/storageclass/manifests/storageclass.yaml
清单示例:
**注意:**请将清单中的属性替换为特定于您的用例的属性。
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: ebs-sc provisioner: ebs.csi.aws.com volumeBindingMode: WaitForFirstConsumer parameters: csi.storage.k8s.io/fstype: xfs type: io1 iopsPerGB: "50" encrypted: "true" allowedTopologies: - matchLabelExpressions: - key: topology.ebs.csi.aws.com/zone values: - us-east-2c
**注意:**要实现拓扑感知功能,请确保您配置了 allowedTopologies 选项。删除此选项将导致推断出正确的可用区,并且 Amazon EBS CSI 控制器将创建一个已安排容器组的卷。
2. 使用以下选项之一创建 pv-claim:
**(选项 1)**创建一个 pv-claim,请求已部署的存储类清单中指定的配置文件类型的卷:
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-ebs-csi-driver/master/examples/kubernetes/storageclass/manifests/claim.yaml
**(选项 2)**创建一个 pv-claim,使用永久卷清单中指定的可用 EBS 卷。确保将 storageClassname: 选项修改为空字符串 , "",,然后根据需要修改 nodeAffinity block。
kubectl apply -f https://github.com/kubernetes-sigs/aws-ebs-csi-driver/tree/master/examples/kubernetes/static-provisioning/manifests
**注意:**对于选项 1 或选项 2,如果节点在卷的可用区中不可用,则部署将失败。这是因为调度器不能根据拓扑限制进行动态调整。
创建容器组和工作负载并测试拓扑感知场景
创建容器组
1. 创建使用先前 pv-claim 的测试容器组:
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-ebs-csi-driver/master/examples/kubernetes/storageclass/manifests/pod.yaml
注意:当您在存储类或永久卷的 allowedTopologies 中使用 topology.ebs.csi.aws.com/zone 时,容器组将被放置在配置清单中指定的可用区中。如果该可用区中没有可用的节点,则该容器组将卡在待处理状态。
2. 运行以下 get 和 describe 容器组命令来检查部署状态:
kubectl get pod,pvc,pv
kubectl describe pod <EXAMPLE_POD_NAME>
**注意:**请将 EXAMPLE_POD_NAME 替换为您的容器组的名称。
创建工作负载
1. 运行以下命令创建使用先前 pv-claim 的 statefulSet 工作负载:
kubectl apply -f https://gist.githubusercontent.com/AbeOwlu/b8641d2f58810789986ab775f00c7780/raw/9144ae5385dfd98d4739e99983346fbdd28eaa2d/statefulset.yaml
2. 运行以下 get 和 describe 命令来检查 statefulSet 工作负载的状态:
kubectl get statefulset,pod,pvc,pv
kubectl describe pod <EXAMPLE_POD_NAME>
**注意:**statefulSet 控制器创建了一些 pv-claim 来满足容器组的卷对 AWS 区域 us-east-2b 和 us-east-2c 中卷的请求。不能保证 StatefulSet 终止时会清理永久卷,这可能会导致卷无法被重新预置给重新安排到另一个可用区的 statefulSet 容器组。
测试拓扑感知场景
(可选)要测试另一个可用区的节点替换是如何处理的,请通过缩小指定可用区中的节点来模拟节点重组。然后,在另一个可用区纵向扩展新节点。完成后,请参阅创建容器组和创建工作负载部分。
模拟部署问题的输出示例:
from: default-scheduler : message: 0/4 nodes are available: 1 node(s) had volume node affinity conflict, 3 node(s) had taint {eks.amazonaws.com/compute-type: fargate}, that the pod didn't tolerate.
要更正卡住的容器组,请再次纵向扩展指定可用区中的节点以解决卷节点关联性冲突错误。
注意:在预期的可用区中纵向扩展新节点时,部署可能会由于协调器运行失败而失败。有关故障排除步骤,请参阅以下部分对 EBS CSI 控制器错误进行故障排除。
对 EBS CSI 控制器错误进行故障排除
模拟容器组变动和节点回收的 EBS CSI 错误示例:
from: default-scheduler : message: 0/5 nodes are available: 1 node(s) didn't find available persistent volumes to bind, 1 node(s) didn't match Pod's node affinity/selector, 3 node(s) had taint {eks.amazonaws.com/compute-type: fargate}, that the pod didn't tolerate
1. 要找出问题所在,请描述容器组,并查看事件中的错误日志条目。在前面的示例错误中,消息显示,由于节点污点和拓扑或关联性配置,五个节点中有四个无法安排。此外,在正确的可用区中运行的最后一个节点没有找到可绑定的永久卷。
2. 要找出此问题,请检查 pv-claim 绑定的状态:
kubectl describe persistentvolumeclaim <PVC_NAME>
注意:pv-claim 状态为正在等待、绑定、无效或未找到。在以下示例中,pv-claim 正在等待驱动程序创建卷。在等待时,pv-claim 不会绑定到目标节点。
`from: ebs.csi.aws.com_ebs-csi-controller- : message: failed to get target node: node "ip-10-0-60-85.ec2.internal" not found` `waiting for a volume to be created, either by external provisioner "ebs.csi.aws.com" or manually created by system administrator`
3. 查看 ebs-csi-controller 容器组中的 csi-provisioner 容器日志:
kubectl logs ebs-csi-controller-<RANDOM_HASH> -c csi-provisioner -n kube-system
以下输出是错误事件示例:
Retrying syncing claim "claim-id", failure 343 error syncing claim "claim-id": failed to get target node: node "ip-10-0-60-85.ec2.internal" not found
注意:如果出现与前面消息中类似的错误事件,那么 pv-claim 协调器未能找到选定的目标节点注释。请删除此注释以便 pv-claim 可以成功同步。
4. 要删除选定的目标节点注释,请运行以下命令。确保将输出复制并保存到 pv-claim 清单中,以删除选定的节点注释。
kubectl edit persistentvolumeclaims ebs-claim | grep -v "volume.kubernetes.io/selected-node:"
如果接下来的故障排除步骤不能解决您的问题,请从隔离的容器工作负载中收集日志,并联系 AWS Support。您也可以在 GitHub 存储库上搜索相关问题。

相关内容
- AWS 官方已更新 10 个月前