在 AWS EKS 集群中安装 mongodb 时出错 - “运行 PreBind 插件 VolumeBinding:绑定卷:超时 > 等待条件”

Nan*_*dha 6 mongodb kubernetes amazon-eks

我尝试按照给定的链接在 EKS 集群中安装 mongodb。(使用 mongodb-kubernetes-operator)

https://www.youtube.com/watch?v=VqeTT0NvRR4&t=1s

https://github.com/mongodb/mongodb-kubernetes-operator

kubectl apply -f config/crd/bases/mongodbcommunity.mongodb.com_mongodbcommunity.yaml
kubectl get crd/mongodbcommunity.mongodbcommunity.mongodb.com

kubectl create ns mongo

kubectl apply -k config/rbac/ --namespace mongo


kubectl get role mongodb-kubernetes-operator --namespace mongo

kubectl get rolebinding mongodb-kubernetes-operator --namespace mongo

kubectl get serviceaccount mongodb-kubernetes-operator --namespace mongo

kubectl create -f config/manager/manager.yaml --namespace mongo

kubectl get pods --namespace mongo
Run Code Online (Sandbox Code Playgroud)
kubectl apply -f config/crd/bases/mongodbcommunity.mongodb.com_mongodbcommunity.yaml
kubectl get crd/mongodbcommunity.mongodbcommunity.mongodb.com

kubectl create ns mongo

kubectl apply -k config/rbac/ --namespace mongo


kubectl get role mongodb-kubernetes-operator --namespace mongo

kubectl get rolebinding mongodb-kubernetes-operator --namespace mongo

kubectl get serviceaccount mongodb-kubernetes-operator --namespace mongo

kubectl create -f config/manager/manager.yaml --namespace mongo

kubectl get pods --namespace mongo
Run Code Online (Sandbox Code Playgroud)

检查时

kubectl apply -f config/samples/mongodb.com_v1_mongodbcommunity_cr.yaml --namespace mongo
kubectl get pods -n mongo
Run Code Online (Sandbox Code Playgroud)

example-mongodb-0pod 长时间处于挂起状态。

在描述 pod 时出现以下错误,

“运行 PreBind 插件“VolumeBinding”:绑定卷:等待条件超时”。

Nan*_*dha 12

我已就此问题联系了 AWS 支持团队并得到了以下答复。

\n
\n

从您的信件中,我了解到您在 EKS 集群中创建 mongodb pod 时遇到问题,并且在创建 pod 后,您的 pod 将处于挂起状态。

\n

如果我误解了您的查询,请告诉我。感谢您使用相同的\n共享 GitHub 存储库 URL。我付出了一些努力来在我这边复制相同的问题,谢天谢地,我能够复制该问题。

\n

进一步调查我的待处理 Pod 问题,我在集群上运行了以下\ndescribe 命令,

\n

“kubectl 描述 pod <pending_pod_name>”

\n

几分钟后,我在输出的“事件”\n部分中找到了以下行。

\n

“运行 PreBind 插件“VolumeBinding”:绑定卷:超时\n等待条件”。

\n

经过进一步调查,我发现您尝试在集群上部署的 mongodb pod 模块正在尝试创建 EBS 卷\nas 持久卷,这就是我收到上述错误的原因。\n我们需要 EBS CSI 驱动程序安装在集群中的附加组件用于使用 EKS 创建\nEBS 卷,如果 EBS\nCSI 驱动程序附加组件不存在,通常会出现上述错误。由于创建集群时默认情况下未安装此附加组件,因此您需要通过 EKS\n控制台附加组件选项卡安装它。

\n

或者另一种可能性是,即使存在该附加组件,它也没有创建 EBS 卷所需的权限。因此,在我们将 EBS CSI 驱动程序附加组件安装到集群之前,我们需要确保已创建用于附加附加组件的 IAM 角色。这里也提到了同样的情况[1]。

\n

对于您的情况,您可以通过运行以下命令来检查 EBS CSI 驱动程序是否存在:\n

\n

“kubectl get pods -n kube-system”

\n

并查找名称类似于“ebs-csi-controller-xxxxxxx”的 pod。如果\n找到一个,则意味着您已经安装了 EBS CSI 驱动程序,\n问题可能与权限有关。

\n

为此,您需要运行以下命令。

\n

“kubectl 描述 pod ebs-csi-controller-xxxxxxx -c csi-provisioner\nn kube-system”

\n

这将给出驱动程序盒配置的输出。在该输出中,您需要检查名为“AWS_ROLE_ARN:”的环境,如果您的输出中不存在该环境,则意味着您尚未为该附加组件提供 IAM OIDC 提供商角色。\n因此,您需要在 IAM 控制台中创建该角色,然后从 EKS 集群控制台中删除\n现有的 EBS CSI 驱动程序加载项,然后\n再次添加 EBS CSI 驱动程序加载项,该角色为“服务\ naccount 角色”。有关将 EBS CSI 驱动程序加载项添加到集群的更多详细信息,请参阅此处 [3]。

\n

如果您已有“AWS_ROLE_ARN”的值,则需要使用此文档[2] 检查角色的配置。

\n

因此,牢记上述事项,我为该附加组件创建了 IAM OIDC\nprovider 角色。为此,您需要遵循此处 [2] 提到的有关如何为附加组件创建 IAM 角色的所有步骤。

\n

创建 IAM OIDC 提供商角色后,我已按照本文档[3]中的步骤通过控制台安装了附加组件,对于服务帐户角色,我选择了在上面创建的 OIDC 提供商角色步。

\n

安装插件后,我尝试通过运行以下命令来删除 mogodb 数据库 pod\n。

\n

“kubectl 删除 -f\nconfig/samples/mongodb.com_v1_mongodbcommunity_cr.yaml”

\n

然后运行以下 apply 命令来重新部署 Pod。

\n

“kubectl apply -f\nconfig/samples/mongodb.com_v1_mongodbcommunity_cr.yaml”

\n

检查 pod 后,我可以看到 mongodb 数据库 pod\n已进入运行状态。

\n

上述是可能发生的最常见问题,如果\n以上都不是您的问题,那么请分享您方便的时间\n以及您所在的时区\n以及联系电话号码和国家\n代码,以便我们可以通过呼叫进行连接并进行屏幕共享\n故障排除会话。

\n
\n

参考链接:

\n

[1] Amazon EBS CSI 驱动程序插件:https://docs.aws.amazon.com/eks/latest/userguide/ebs-csi.html

\n

[2] 如何为 EBS CSI 驱动程序插件创建 IAM OIDC 提供程序: https: //docs.aws.amazon.com/eks/latest/userguide/csi-iam-role.html

\n

[3] 管理 EBS CSI 驱动程序插件:https://docs.aws.amazon.com/eks/latest/userguide/managing-ebs-csi.html

\n

工作命令/步骤

\n

(支持团队提到的步骤)

\n
    \n
  1. 创建EKS集群
  2. \n
  3. 转到 AWS 控制台中新创建的 EKS 集群。在概述选项卡中,复制OpenID Connect 提供商 URL的值并将该值保存在某个位置以供将来参考。
  4. \n
  5. 转到IAM -> 身份提供商 -> 添加提供商。选择OpenID Connect作为提供商类型。
  6. \n
  7. 将步骤 2 中复制的 URL 粘贴到提供商 URL文本框中,然后单击\xe2\x80\x98Get指纹\xe2\x80\x99。在相应的文本框中设置受众 - sts.amazonaws.com 。
  8. \n
  9. 单击\xe2\x80\x98Add Provider\xe2\x80\x99按钮。
  10. \n
  11. 创建所需的 iam 角色。IAM -> 角色 -> 创建角色。在\xe2\x80\x98选择受信任实体\xe2\x80\x99部分中,选择\xe2\x80\x98Web Identity\xe2\x80\x99。在身份提供商下拉列表中,选择在步骤 5 中创建的 OIDC 选项。在下拉列表中选择受众 - sts.amazonaws.com 。单击\xe2\x80\x98下一步\xe2\x80\x99
  12. \n
  13. 在下一个窗口中搜索AmazonEBSCSIDriverPolicy策略,然后单击 \xe2\x80\x98Next\xe2\x80\x99 并提供角色的名称、描述、标签,然后单击创建角色。
  14. \n
  15. “角色”部分中,搜索在步骤 7 中新创建的角色并进入该角色。信任关系 -> 编辑信任策略。
  16. \n
\n
\n

“oidc.eks.eu-west-1.amazonaws.com/id/385AA11111111116116:sub”:\n“系统:serviceaccount:kube-system:ebs-csi-controller-sa”

\n
\n
    \n
  1. 使用当前 oidc id 更新上述文本,并将其添加为Statement[0] -> Condition -> StringEquals中的新键值。参考最后这个信任关系json数据的完整json结构。

    \n
  2. \n
  3. 更新文本后,单击 \xe2\x80\x98 更新策略\xe2\x80\x99\n转至EKS -> 集群 -> 步骤 1 中新建的集群。单击附加组件选项卡,添加新的。

    \n
  4. \n
  5. 在弹出窗口中选择 Name 作为Amazon EBS CSI Driver版本为最新。选择“角色”作为步骤 7 中创建的角色。如果下拉列表中未列出上述角色,请使用重新加载按钮重新加载该部分,然后单击添加

    \n
  6. \n
  7. 一段时间后,新的附加组件将变得活跃。然后运行此kubectl get pods -n kube-system命令,我们应该看到如图所示的 csi pod。

    \n
  8. \n
\n
    ebs-csi-controller-68d49f84c8-sl7w6   6/6     Running   0          109s \n    ebs-csi-controller-68d49f84c8-w2k6r   6/6     Running   0         2m19s \n    ebs-csi-node-ldmsm                    3/3     Running   0        2m20s\n
Run Code Online (Sandbox Code Playgroud)\n

然后运行问题中给出的命令。

\n

以下字典是角色的可信关系json

\n
    ebs-csi-controller-68d49f84c8-sl7w6   6/6     Running   0          109s \n    ebs-csi-controller-68d49f84c8-w2k6r   6/6     Running   0         2m19s \n    ebs-csi-node-ldmsm                    3/3     Running   0        2m20s\n
Run Code Online (Sandbox Code Playgroud)\n