📌  相关文章
📜  Amazon Web Services – 解决 Amazon EKS API 服务器中的服务器授权错误(1)

📅  最后修改于: 2023-12-03 15:29:19.891000             🧑  作者: Mango

Amazon Web Services – 解决 Amazon EKS API 服务器中的服务器授权错误

Amazon EKS (Elastic Kubernetes Service) 是一种基于 Kubernetes 的托管服务,可简化 Kubernetes 集群的部署和管理。然而,在使用 Amazon EKS 时,会遇到一些服务器授权错误的问题,本文将介绍解决这些错误的方法。

问题描述

当我们在 Amazon EKS 上运行 Kubernetes 应用时,可能会遇到以下错误:

Error from server (InternalError): an error on the server ("Unable to create user") has prevented the request from succeeding (get users)

这个错误通常表明 Kubernetes API 服务器遇到了权限问题,无法创建用户。

解决方法

为了解决这个错误,我们需要做两件事情:

  1. 创建 IAM 策略并授权给 Kubernetes service account
  2. 更新 Kubernetes service account 的访问权限信息

下面我们将分别介绍这两步具体的操作。

创建 IAM 策略并授权给 Kubernetes service account
  1. 登录 AWS 控制台,并在顶部菜单中选择 IAM。
  2. 在左侧菜单中选择 “Policies”。
  3. 点击 “Create policy” 按钮并选择 JSON 模式。
  4. 将以下 JSON 代码粘贴到 “Edit policy document” 页面中:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "eks:Describe*",
                "ssm:GetParameter",
                "ssm:GetParameters",
                "ssm:GetParametersByPath"
            ],
            "Resource": "*"
        }
    ]
}

这个 JSON 代码表示我们创建了一个包含四个 Action 的 IAM 策略,这些 Action 允许 Kubernetes service account 对 Amazon EKS API 进行操作。具体来说,这个策略给 Kubernetes service account 授予了以下权限:

  • eks:Describe*:获取 Amazon EKS 集群的相关信息。
  • ssm:GetParameter:获取 AWS Systems Manager Parameter Store 中的参数。
  • ssm:GetParameters:获取一组 AWS Systems Manager Parameter Store 参数的值。
  • ssm:GetParametersByPath:获取一个路径下的所有 AWS Systems Manager Parameter Store 参数的值。
  1. 给这个策略命名并点击 “Create policy” 完成创建。

现在我们已经创建了一个 IAM 策略,接下来我们需要将这个策略授予给 Kubernetes service account。

  1. 在左侧菜单中选择 “Roles”。
  2. 在页面顶部点击 “Create role” 按钮并选择 “AWS service”。
  3. 在 “Choose the service that will use this role” 页面中,选择 “EKS” 并点击 “Next: Permissions”。
  4. 在 “Attach permissions policies” 页面中,选择刚刚创建的策略并点击 “Next: Tags”。
  5. 在 “Add tags (optional)” 页面中,选择不添加标签并点击 “Next: Review”。
  6. 给这个角色命名并添加描述,然后点击 “Create role” 创建角色。

现在我们已经创建了一个角色,接下来需要将这个角色分配给 Kubernetes service account。

  1. 在左侧菜单中选择 “Service accounts”。
  2. 查找你的 Kubernetes service account 并点击它的名称。
  3. 点击 “Create new access key” 按钮并下载这个 access key 的密钥文件(.csv 文件)。
  4. 在 “Permissions” 页面中,点击 “Add inline policy” 按钮。
  5. 在弹出的 “Create policy” 窗口中,选择 “JSON” 模式并粘贴以下 JSON 代码:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "eks:*"
            ],
            "Resource": "*"
        }
    ]
}

这个 JSON 代码表示我们创建了一个包含一个 Action 的策略,这个 Action 允许 Kubernetes service account 对 Amazon EKS API 进行操作。

  1. 给这个策略命名并点击 “Create policy” 完成创建。

现在我们已经创建完了 IAM 策略并授权给 Kubernetes service account,接下来我们需要更新 Kubernetes service account 的访问权限信息。

更新 Kubernetes service account 的访问权限信息
  1. 在本地打开终端并使用 aws-cli 工具进行认证。
$ aws configure

输入你的 AWS 访问密钥 ID、秘密访问密钥和默认区域。这些信息可以在密钥文件(.csv 文件)中找到。

  1. 获取当前 Kubernetes service account 的访问令牌。
$ kubectl describe secret $(kubectl get secret | grep default | awk '{print $1}')

这个命令会输出一个长串的字符串,这个字符串就是 Kubernetes service account 的访问令牌。

  1. 更新 Kubernetes service account 的访问权限信息。
$ kubectl create clusterrolebinding cluster-admin-binding --clusterrole cluster-admin --user <username>

这个命令中,<username> 表示 Kubernetes service account 的用户名。这个用户名可以在访问令牌字符串中找到,格式为 <username>/system:serviceaccount:<namespace>:<serviceaccount>

这个命令将授予 Kubernetes service account 簇管理员的访问权限,以保证它可以进行操作。

现在我们已经更新了 Kubernetes service account 的访问权限信息,这个 Kubernetes 应用程序应该可以正常地运行了。

总结

本文介绍了在 Amazon EKS 上解决服务器授权错误的方法。在解决这个问题时,我们需要做两件事情:创建 IAM 策略并授权给 Kubernetes service account,更新 Kubernetes service account 的访问权限信息。希望本文能对您解决这个问题有所帮助。