实例 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 策略文档,如下所示
-
工作节点:https://github.com/kubernetes/kops/blob/master/pkg/model/iam/tests/iam_builder_node_strict_ecr.json
其他权限是
{
"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