如何在 Amazon EKS 中创建使用 EBS CSI 驱动程序的拓扑感知卷预置并对其进行故障排除?

3 分钟阅读
0

我想在使用 Amazon Elastic Block Store (Amazon EBS) 组件的 Amazon Elastic Kubernetes Service (Amazon EKS) 集群中配置拓扑感知卷。

简短描述

要在使用 Amazon EBS 组件的 Amazon EKS 中配置云基础设施拓扑并对其进行故障排除,请完成以下步骤:

  1. 检查 EBS CSI 附加组件的配置是否正确。
  2. 配置具有拓扑感知实现的存储类。
  3. 创建容器组和工作负载,然后测试拓扑感知场景。
  4. 对 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.    运行以下 getdescribe 命令来检查 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 官方
AWS 官方已更新 1 年前