如何在 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 官方已更新 2 年前
- AWS 官方已更新 10 个月前
- AWS 官方已更新 8 个月前