

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# `AWSSupport-TroubleshootEbsCsiDriversForEks`
<a name="automation-awssupport-troubleshoot-ebs-csi-drivers-for-eks"></a>

 **描述** 

 该`AWSSupport-TroubleshootEbsCsiDriversForEks`运行手册有助于解决亚马逊 Elastic Kubernetes Service（亚马逊 EKS）中的亚马逊 Elastic Block Store 卷装载问题和亚马逊 EBS 容器存储接口 (CSI) 驱动程序问题 

**重要**  
目前不支持在上 AWS Fargate 运行的 Amazon EBS CSI 驱动程序。

 **如何工作？** 

 运行手册`AWSSupport-TroubleshootEbsCsiDriversForEks`执行以下高级步骤：
+ 验证目标 Amazon EKS 集群是否存在且处于活动状态。
+ 根据插件是 Amazon EKS 管理的还是自行管理的，部署必要的身份验证资源，用于调用 Kubernetes API。
+ 执行 Amazon EBS CSI 控制器运行状况检查和诊断。
+ 对节点角色和服务账号角色运行 IAM 权限检查。
+ 诊断指定应用程序 Pod 的持续卷创建问题。
+ 检查 node-to-pod调度并检查 pod 事件。
+ 收集相关的 Kubernetes 和应用程序日志，并将它们上传到指定的 Amazon S3 存储桶。
+ 执行节点运行状况检查并验证与 Amazon EC2 终端节点的连接。
+ 查看永久音量块设备附件和安装状态。
+ 清理故障排除期间创建的身份验证基础架构。
+ 生成包含所有诊断结果的全面故障排除报告。

**注意**  
Amazon EKS 集群的身份验证模式必须设置为`API`或`API_AND_CONFIG_MAP`。我们建议使用 Amazon EKS Access 入口。运行手册需要 Kubernetes 基于角色的访问控制 (RBAC) 权限才能执行必要的 API 调用。
如果您没有为 Lambda 函数（`LambdaRoleArn`参数）指定 IAM 角色，则自动化会在您的账户`Automation-K8sProxy-Role-<ExecutionId>`中创建一个名为的角色。此角色包括托管策略`AWSLambdaBasicExecutionRole`和`AWSLambdaVPCAccessExecutionRole`。
某些诊断步骤要求将 Amazon EKS 工作节点设为 Systems Manager 托管实例。如果节点不是 Systems Manager 托管实例，则会跳过需要 Systems Manager 访问权限的步骤，但会继续进行其他检查。
自动化包括一个清理步骤，用于删除身份验证基础架构资源。即使之前的步骤失败，此清理步骤也会运行，这有助于防止您的 AWS 账户中出现孤立资源。

 [运行此自动化（控制台）](https://console.aws.amazon.com/systems-manager/automation/execute/AWSSupport-TroubleshootEbsCsiDriversForEks) 

**文档类型**

自动化

**所有者**

Amazon

**平台**

/

**所需的 IAM 权限**

`AutomationAssumeRole` 参数需要执行以下操作才能成功使用运行手册。
+ `ec2:DescribeIamInstanceProfileAssociations`
+ `ec2:DescribeInstanceStatus`
+ `ec2:GetEbsEncryptionByDefault`
+ `eks:DescribeAddon`
+ `eks:DescribeAddonVersions`
+ `eks:DescribeCluster`
+ `iam:GetInstanceProfile`
+ `iam:GetOpenIDConnectProvider`
+ `iam:GetRole`
+ `iam:ListOpenIDConnectProviders`
+ `iam:SimulatePrincipalPolicy`
+ `s3:GetBucketLocation`
+ `s3:GetBucketPolicyStatus`
+ `s3:GetBucketPublicAccessBlock`
+ `s3:GetBucketVersioning`
+ `s3:ListBucket`
+ `s3:ListBucketVersions`
+ `ssm:DescribeInstanceInformation`
+ `ssm:GetAutomationExecution`
+ `ssm:GetDocument`
+ `ssm:ListCommandInvocations`
+ `ssm:ListCommands`
+ `ssm:SendCommand`
+ `ssm:StartAutomationExecution`

 **说明** 

按照这些步骤对自动化进行配置：

1. 在您的账户`TroubleshootEbsCsiDriversForEks-SSM-Role`中创建 SSM 自动化角色。验证信任关系是否包含以下策略。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "",
               "Effect": "Allow",
               "Principal": {
                   "Service": "ssm.amazonaws.com"
               },
               "Action": "sts:AssumeRole"
           }
       ]
   }
   ```

------

1. 将以下策略附加到 IAM 角色，以授予对指定资源执行指定操作所需的权限。
   + 如果您希望将执行和资源日志上传到同一 AWS 区域的 Amazon S3 存储桶，请在中替换`arn:{partition}:s3:::BUCKET_NAME/*`为您的日志`OptionalRestrictPutObjects`。
     + 如果您要在 SSM 执行中选择`S3BucketName`，Amazon S3 存储桶应指向正确的亚马逊 S3 存储桶。
     + 如果您未指定，则此权限是可选的 `S3BucketName`
     + Amazon S3 存储桶必须是私有的，并且位于执行 SSM 自动化的同一 AWS 区域。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "OptionalRestrictPutObjects",
               "Effect": "Allow",
               "Action": [
                   "s3:PutObject"
               ],
               "Resource": [
                   "arn:aws:s3:::amzn-s3-demo-bucket/*"
               ]
           },
           {
               "Effect": "Allow",
               "Action": [
                   "ec2:DescribeIamInstanceProfileAssociations",
                   "ec2:DescribeInstanceStatus",
                   "ec2:GetEbsEncryptionByDefault",
                   "eks:DescribeAddon",
                   "eks:DescribeAddonVersions",
                   "eks:DescribeCluster",
                   "iam:GetInstanceProfile",
                   "iam:GetOpenIDConnectProvider",
                   "iam:GetRole",
                   "iam:ListOpenIDConnectProviders",
                   "iam:SimulatePrincipalPolicy",
                   "s3:GetBucketLocation",
                   "s3:GetBucketPolicyStatus",
                   "s3:GetBucketPublicAccessBlock",
                   "s3:GetBucketVersioning",
                   "s3:ListBucket",
                   "s3:ListBucketVersions",
                   "ssm:DescribeInstanceInformation",
                   "ssm:GetAutomationExecution",
                   "ssm:GetDocument",
                   "ssm:ListCommandInvocations",
                   "ssm:ListCommands",
                   "ssm:SendCommand",
                   "ssm:StartAutomationExecution"
               ],
               "Resource": "*"
           },
           {
               "Sid": "SetupK8sApiProxyForEKSActions",
               "Effect": "Allow",
               "Action": [
                   "cloudformation:CreateStack",
                   "cloudformation:DeleteStack",
                   "cloudformation:DescribeStacks",
                   "cloudformation:UpdateStack",
                   "ec2:CreateNetworkInterface",
                   "ec2:DeleteNetworkInterface",
                   "ec2:DescribeNetworkInterfaces",
                   "ec2:DescribeRouteTables",
                   "ec2:DescribeSecurityGroups",
                   "ec2:DescribeSubnets",
                   "ec2:DescribeVpcs",
                   "eks:DescribeCluster",
                   "iam:CreateRole",
                   "iam:DeleteRole",
                   "iam:GetRole",
                   "iam:TagRole",
                   "iam:UntagRole",
                   "lambda:CreateFunction",
                   "lambda:DeleteFunction",
                   "lambda:GetFunction",
                   "lambda:InvokeFunction",
                   "lambda:ListTags",
                   "lambda:TagResource",
                   "lambda:UntagResource",
                   "lambda:UpdateFunctionCode",
                   "logs:CreateLogGroup",
                   "logs:CreateLogStream",
                   "logs:DescribeLogGroups",
                   "logs:DescribeLogStreams",
                   "logs:ListTagsForResource",
                   "logs:PutLogEvents",
                   "logs:PutRetentionPolicy",
                   "logs:TagResource",
                   "logs:UntagResource",
                   "ssm:DescribeAutomationExecutions",
                   "tag:GetResources",
                   "tag:TagResources"
               ],
               "Resource": "*"
           },
           {
               "Sid": "PassRoleToAutomation",
               "Effect": "Allow",
               "Action": "iam:PassRole",
               "Resource": [
                   "arn:aws:iam::*:role/TroubleshootEbsCsiDriversForEks-SSM-Role",
                   "arn:aws:iam::*:role/Automation-K8sProxy-Role-*"
               ],
               "Condition": {
                   "StringLikeIfExists": {
                       "iam:PassedToService": [
                           "lambda.amazonaws.com",
                           "ssm.amazonaws.com"
                       ]
                   }
               }
           },
           {
               "Sid": "AttachRolePolicy",
               "Effect": "Allow",
               "Action": [
                   "iam:AttachRolePolicy",
                   "iam:DetachRolePolicy"
               ],
               "Resource": "*",
               "Condition": {
                   "StringLikeIfExists": {
                       "iam:ResourceTag/AWSSupport-SetupK8sApiProxyForEKS": "true"
                   }
               }
           }
       ]
   }
   ```

------

1. 授予 Amazon EKS 集群 RBAC（基于角色的访问控制）所需的权限。推荐的方法是在您的 Amazon EKS 集群中创建访问入口。

    在 Amazon EKS 控制台中，导航到您的集群。对于 Amazon EKS 访问条目，请确认您的访问配置设置为`API_AND_CONFIG_MAP`或`API`。有关为访问条目配置身份验证模式的步骤，请参阅[设置访问条目](https://docs.aws.amazon.com//eks/latest/userguide/setting-up-access-entries.html)。

   选择**创建访问条目**。
   + 对于 *IAM 委托人 ARN*，请选择您在上一步中为 SSM 自动化创建的 IAM 角色。
   + 对于*类型*，选择 `Standard`。

1. 添加访问策略：
   + 在 “*访问范围*” 中，选择`Cluster`。
   + 在 “*策略名称*” 中，选择`AmazonEKSAdminViewPolicy`。

   选择**添加策略**。

   如果您不使用访问权限条目来管理 Kubernetes API 权限，则必须更新`aws-auth` ConfigMap 并在您的 IAM 用户或角色之间创建角色绑定。确保你的 IAM 实体拥有以下只读 Kubernetes API 权限：
   + GET `/apis/apps/v1/namespaces/{namespace}/deployments/{name}`
   + GET `/apis/apps/v1/namespaces/{namespace}/replicasets/{name}`
   + GET `/apis/apps/v1/namespaces/{namespace}/daemonsets/{name}`
   + GET `/api/v1/nodes/{name}`
   + GET `/api/v1/namespaces/{namespace}/serviceaccounts/{name}`
   + GET `/api/v1/namespaces/{namespace}/persistentvolumeclaims/{name}`
   + GET `/api/v1/persistentvolumes/{name}`
   + GET `/apis/storage.k8s.io/v1/storageclasses/{name}`
   + GET `/api/v1/namespaces/{namespace}/pods/{name}`
   + GET `/api/v1/namespaces/{namespace}/pods`
   + GET `/api/v1/namespaces/{namespace}/pods/{name}/log`
   + GET `/api/v1/events`

1. 运行自动化 [AWSSupport-TroubleshootEbsCsiDriversForEks （控制台）](https://console.aws.amazon.com/systems-manager/documents/AWSSupport-TroubleshootEbsCsiDriversForEks/description)

1. 选择 **Execute automation**（执行自动化）。

1. 对于输入参数，请输入以下内容：
   + **AutomationAssumeRole （可选）：**
     + 描述：（可选）允许 SSM Automation 代表您执行操作的 AWS Identity and Access Management (IAM) 角色的亚马逊资源名称 (ARN)。需要将该角色添加到您的 Amazon EKS 集群访问条目或 RBAC 权限中，才能允许 Kubernetes API 调用。
     + 类型：`AWS::IAM::Role::Arn`
     + 示例：`TroubleshootEbsCsiDriversForEks-SSM-Role`
   + **EksClusterName:**
     + 描述：目标亚马逊 Elastic Kubernetes Service（亚马逊 EKS）集群的名称。
     + 类型：`String`
   + **ApplicationPodName:**
     + 描述：在 Amazon EBS CSI 驱动程序中存在问题的 Kubernetes 应用程序容器的名称。
     + 类型：`String`
   + **ApplicationNamespace:**
     + 描述：Amazon EBS CSI 驱动程序存在问题的应用程序容器的 Kubernetes 命名空间。
     + 类型：`String`
   + **EbsCsiControllerDeploymentName（可选）：**
     + 描述：（可选）Amazon EBS CSI 控制器容器的部署名称。
     + 类型：`String`
     + 默认值：`ebs-csi-controller`
   + **EbsCsiControllerNamespace（可选）：**
     + 描述：（可选）亚马逊 EBS CSI 控制器舱的 Kubernetes 命名空间。
     + 类型：`String`
     + 默认值：`kube-system`
   + **S3BucketName （可选）：**
     + 描述：（可选）将上传故障排除日志的目标 Amazon S3 存储桶名称。
     + 类型：`AWS::S3::Bucket::Name`
   + **LambdaRoleArn （可选）：**
     + 描述：（可选）允许该 AWS Lambda 函数访问所需 AWS 服务和资源的 IAM 角色的 ARN。
     + 类型：`AWS::IAM::Role::Arn`

   选择**执行**。

1. 完成后，请查看 “*输出*” 部分，了解执行的详细结果。

**参考**

Systems Manager Automation
+ [运行此自动化（控制台）](https://console.aws.amazon.com/systems-manager/documents/AWSSupport-TroubleshootEbsCsiDriversForEks/description)
+ [运行自动化](https://docs.aws.amazon.com//systems-manager/latest/userguide/automation-working-executing.html)
+ [设置自动化](https://docs.aws.amazon.com//systems-manager/latest/userguide/automation-setup.html)
+ [Support 自动化工作流程](https://aws.amazon.com/premiumsupport/technology/saw/)

有关亚马逊 EBS CSI 驱动程序的更多信息，请参阅[亚马逊 EBS CSI](https://docs.aws.amazon.com//eks/latest/userguide/ebs-csi.html) 驱动程序。