如何使用CDK修改EKS的默认容量实例角色?
How to modify the default capacity instance role for EKS using CDK?
我们正在尝试使用 EKS 集群设置日志记录。我们目前是 运行 具有单个 EC2 实例的集群。 AWS 提供了 kubectl commands 创建必要的 kubernetes 配置。
将其应用于我们现有的 EKS 设置时,我们无法正确定义具有写入 CloudWatch 权限的实例角色。
cloudwatch 代理在其 pod 日志中显示这些错误:
2020-01-07T10:20:14Z E! CreateLogStream / CreateLogGroup with log group name /aws/containerinsights/eks-test-EKS/performance stream name ip-10-0-2-156.eu-central-1.compute.internal has errors. Will retry the request: AccessDeniedException: User: arn:aws:sts::662458865874:assumed-role/eks-test-ekstestEKSDefaultCapacityInstanceRole9446-7MD87BB2AA51/i-01e94e054f3c34383 is not authorized to perform: logs:CreateLogStream on resource: arn:aws:logs:eu-central-1:662458865874:log-group:/aws/containerinsights/eks-test-EKS/performance:log-stream:ip-10-0-2-156.eu-central-1.compute.internal
status code: 400, request id: 645166c7-34fb-4616-9f27-830986e27469
在我看来,问题是 CDK 在没有写入 CloudWatch 的权限的情况下创建了这个 cloudformation IAM 实例角色:
ekstestEKSDefaultCapacityInstanceRole9446FBA6:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Statement:
- Action: sts:AssumeRole
Effect: Allow
Principal:
Service: ec2.amazonaws.com
Version: "2012-10-17"
ManagedPolicyArns:
- Fn::Join:
- ""
- - "arn:"
- Ref: AWS::Partition
- :iam::aws:policy/AmazonEKSWorkerNodePolicy
- Fn::Join:
- ""
- - "arn:"
- Ref: AWS::Partition
- :iam::aws:policy/AmazonEKS_CNI_Policy
- Fn::Join:
- ""
- - "arn:"
- Ref: AWS::Partition
- :iam::aws:policy/AmazonEC2ContainerRegistryReadOnly
Tags:
- Key: Name
Value: eks-test/eks-test-EKS/DefaultCapacity
- Key:
Fn::Join:
- ""
- - kubernetes.io/cluster/
- Ref: ekstestEKSBA2E781A
Value: owned
Metadata:
aws:cdk:path: eks-test/eks-test-EKS/DefaultCapacity/InstanceRole/Resource
AWS也提到应该"check the IAM role",但问题是我不知道如何修改它。
在 EKS 集群构造中,我可以设置一个集群角色,但这并不相同,实例角色仍然是在缺少权限的情况下创建的。
有没有我可以修改实例角色的其他 CDK 方法?如果没有,有解决方法吗?
更新:
我已经从 an issue on CDK's github page 链接回这个问题。有人提到即将推出的用于服务帐户功能的 IAM 角色,但我想知道 "regular" IAM 角色映射到 kubernetes 角色是否是这里的方式...
更新:
该角色似乎是根据 CDK code 基于 AutoScalingGroup 创建的。我假设这可以被覆盖以添加不同的角色...
您可以在 DefaultCapacity 上创建集群后设置策略
const cluster = new Cluster(this, name, clusterProps);
cluster.defaultCapacity?.role.addManagedPolicy(ManagedPolicy.fromAwsManagedPolicyName('CloudWatchFullAccess'));
我们正在尝试使用 EKS 集群设置日志记录。我们目前是 运行 具有单个 EC2 实例的集群。 AWS 提供了 kubectl commands 创建必要的 kubernetes 配置。
将其应用于我们现有的 EKS 设置时,我们无法正确定义具有写入 CloudWatch 权限的实例角色。
cloudwatch 代理在其 pod 日志中显示这些错误:
2020-01-07T10:20:14Z E! CreateLogStream / CreateLogGroup with log group name /aws/containerinsights/eks-test-EKS/performance stream name ip-10-0-2-156.eu-central-1.compute.internal has errors. Will retry the request: AccessDeniedException: User: arn:aws:sts::662458865874:assumed-role/eks-test-ekstestEKSDefaultCapacityInstanceRole9446-7MD87BB2AA51/i-01e94e054f3c34383 is not authorized to perform: logs:CreateLogStream on resource: arn:aws:logs:eu-central-1:662458865874:log-group:/aws/containerinsights/eks-test-EKS/performance:log-stream:ip-10-0-2-156.eu-central-1.compute.internal
status code: 400, request id: 645166c7-34fb-4616-9f27-830986e27469
在我看来,问题是 CDK 在没有写入 CloudWatch 的权限的情况下创建了这个 cloudformation IAM 实例角色:
ekstestEKSDefaultCapacityInstanceRole9446FBA6:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Statement:
- Action: sts:AssumeRole
Effect: Allow
Principal:
Service: ec2.amazonaws.com
Version: "2012-10-17"
ManagedPolicyArns:
- Fn::Join:
- ""
- - "arn:"
- Ref: AWS::Partition
- :iam::aws:policy/AmazonEKSWorkerNodePolicy
- Fn::Join:
- ""
- - "arn:"
- Ref: AWS::Partition
- :iam::aws:policy/AmazonEKS_CNI_Policy
- Fn::Join:
- ""
- - "arn:"
- Ref: AWS::Partition
- :iam::aws:policy/AmazonEC2ContainerRegistryReadOnly
Tags:
- Key: Name
Value: eks-test/eks-test-EKS/DefaultCapacity
- Key:
Fn::Join:
- ""
- - kubernetes.io/cluster/
- Ref: ekstestEKSBA2E781A
Value: owned
Metadata:
aws:cdk:path: eks-test/eks-test-EKS/DefaultCapacity/InstanceRole/Resource
AWS也提到应该"check the IAM role",但问题是我不知道如何修改它。
在 EKS 集群构造中,我可以设置一个集群角色,但这并不相同,实例角色仍然是在缺少权限的情况下创建的。
有没有我可以修改实例角色的其他 CDK 方法?如果没有,有解决方法吗?
更新: 我已经从 an issue on CDK's github page 链接回这个问题。有人提到即将推出的用于服务帐户功能的 IAM 角色,但我想知道 "regular" IAM 角色映射到 kubernetes 角色是否是这里的方式...
更新: 该角色似乎是根据 CDK code 基于 AutoScalingGroup 创建的。我假设这可以被覆盖以添加不同的角色...
您可以在 DefaultCapacity 上创建集群后设置策略
const cluster = new Cluster(this, name, clusterProps);
cluster.defaultCapacity?.role.addManagedPolicy(ManagedPolicy.fromAwsManagedPolicyName('CloudWatchFullAccess'));