跳至内容

实例 IAM 角色

默认情况下,kOps 为集群创建两个实例 IAM 角色:一个用于控制平面,另一个用于工作节点。

从 kOps 1.22 开始,在 AWS 上运行 Kubernetes 1.22 的新集群将限制 Pod 对实例元数据服务的访问。这意味着 Pod 也将被阻止直接假定实例角色。请参阅服务帐户的 IAM 角色实例元数据 文档。在此之前,在集群中运行的所有 Pod 都可以访问实例 IAM 角色。请考虑启用上述保护并使用 IRSA 为您的工作负载。

访问 AWS EC2 容器注册表 (ECR)

默认的 IAM 角色不会授予节点访问 AWS EC2 容器注册表 (ECR) 的权限。要授予访问 ECR 的权限,请使用以下内容更新您的集群规范,然后执行集群更新

iam:
  allowContainerRegistry: true

添加 ECR 权限将扩展 IAM 策略文档,如下所示

其他权限是

{
  "Sid": "kOpsK8sECR",
  "Effect": "Allow",
  "Action": [
    "ecr:BatchCheckLayerAvailability",
    "ecr:BatchGetImage",
    "ecr:DescribeRepositories",
    "ecr:GetAuthorizationToken",
    "ecr:GetDownloadUrlForLayer",
    "ecr:GetRepositoryPolicy",
    "ecr:ListImages"
  ],
  "Resource": [
    "*"
  ]
}

权限边界

引入
kOps 1.19

AWS 权限边界使您能够使用策略(托管的或自定义的)来设置 kOps 创建的角色能够授予其所附加的实例的最大权限。它有助于防止可能的权限提升。

要为 kOps 的角色设置权限边界,请使用以下内容更新您的集群规范,然后执行集群更新

iam:
  permissionsBoundary: aws:arn:iam:123456789000:policy:test-boundary

注意:目前,kOps 仅支持为其创建的所有角色使用单个权限边界。如果您需要设置每个角色的权限边界,我们建议您参考以下部分,并向 kOps 提供您自己的角色。

添加外部策略

引入
kOps 1.18

有时,您可能希望附加由另一个 AWS 帐户共享的策略,或由外部应用程序维护的策略。您可以通过externalPolicies 规范字段指定托管策略。

外部策略通过其 AWS 上的 ARN 指定,并按其角色类型分组。请参阅以下示例

spec:
  externalPolicies:
    node:
    - arn:aws:iam::123456789000:policy/test-policy
    master:
    - arn:aws:iam::123456789000:policy/test-policy
    bastion:
    - arn:aws:iam::123456789000:policy/test-policy

外部策略附件以声明方式处理。声明的任何策略都将附加到角色,未指定的任何策略将在附加新策略后分离。这不会以任何方式替换或影响内置的 kOps 策略。

重要的是要注意,externalPolicies 仅处理策略的附加和分离,而不处理策略的创建、修改或删除。

添加其他策略

有时,您可能需要扩展 kOps 实例 IAM 角色以添加其他策略。您可以通过additionalPolicies 规范字段执行此操作。例如,假设您想将 DynamoDB 和 Elasticsearch 权限添加到您的节点。

通过kops edit cluster ${CLUSTER_NAME} 编辑您的集群,并将以下内容添加到规范中

spec:
  additionalPolicies:
    node: |
      [
        {
          "Effect": "Allow",
          "Action": ["dynamodb:*"],
          "Resource": ["*"]
        },
        {
          "Effect": "Allow",
          "Action": ["es:*"],
          "Resource": ["*"]
        }
      ]

编辑完成后,您的集群规范应类似于以下内容

metadata:
  name: ${CLUSTER_NAME}
spec:
  cloudProvider: aws
  networkCIDR: 10.100.0.0/16
  networkID: vpc-a80734c1
  nonMasqueradeCIDR: 100.64.0.0/10
  zones:
  - cidr: 10.100.32.0/19
    name: eu-central-1a
  additionalPolicies:
    node: |
      [
        {
          "Effect": "Allow",
          "Action": ["dynamodb:*"],
          "Resource": ["*"]
        },
        {
          "Effect": "Allow",
          "Action": ["es:*"],
          "Resource": ["*"]
        }
      ]

现在,您可以运行集群更新以使更改生效

kops update cluster ${CLUSTER_NAME} --yes

您可以为每个 kOps 实例角色(节点、主、堡垒机)设置一组附加策略。例如,如果您想对主实例应用一组附加权限,而对节点应用另一组附加权限,您可以执行以下操作

spec:
  additionalPolicies:
    node: |
      [
        {
          "Effect": "Allow",
          "Action": ["es:*"],
          "Resource": ["*"]
        }
      ]
    master: |
      [
        {
          "Effect": "Allow",
          "Action": ["dynamodb:*"],
          "Resource": ["*"]
        }
      ]

使用现有的 AWS 实例配置文件

除了让 kOps 创建和管理 IAM 角色和实例配置文件之外,还可以使用现有的实例配置文件。这在安全策略禁止工具创建自己的 IAM 角色和策略的组织中很有用。kOps 仍将输出每个 IAM 角色的 IAM 内联策略中的任何差异。这便于确定在升级 kOps 时需要进行的策略更改。**使用 IAM 托管策略不会输出这些差异;用户有责任跟踪对策略的预期更改。**

注意:目前,kOps 仅支持对集群中的每个实例组使用现有的实例配置文件,不支持混合使用现有的和托管的实例配置文件。这是由于生命周期覆盖被用来阻止创建与 IAM 相关的资源。

为此,请获取集群的实例组名称列表

kops get ig --name ${CLUSTER_NAME}

并使用所需的实例配置文件 ARN 更新每个实例组的规范

kops edit ig --name ${CLUSTER_NAME} ${INSTANCE_GROUP_NAME}

将以下iam 部分添加到规范中

spec:
  iam:
    profile: arn:aws:iam::1234567890108:instance-profile/kops-custom-node-role

现在,运行集群更新以创建新的启动模板版本,使用生命周期覆盖 来防止创建与 IAM 相关的资源

kops update cluster ${CLUSTER_NAME} --yes --lifecycle-overrides IAMRole=ExistsAndWarnIfChanges,IAMRolePolicy=ExistsAndWarnIfChanges,IAMInstanceProfileRole=ExistsAndWarnIfChanges

每次运行kops update cluster 时,都必须包含上述--lifecycle-overrides,除非指定了非security 阶段。

最后,执行滚动更新以用新的启动模板版本替换 ASG 中的 EC2 实例

kops rolling-update cluster ${CLUSTER_NAME} --yes