建立支持 IPv6 的 權限給 EKS

了解叢集、Pod 和 服務的 IPv6 地址

EKS 中的配置 Cluster IP address family 選擇 IPv6 時,需要設定 Amazon VPC CNI 外掛程式以使用 IRSA

環境定義:

參數說明參數內容
eks cluster 名稱development-souffle
policy 名稱development-souffle-VPCCNIIPv6
role 名稱development-souffle-VPCCNIIPv6

從 EKS 中取得 OIDC URL

透過 aws cli 命令取得 EKS 中的 OIDC URL。

aws eks describe-cluster --name development-souffle --query "cluster.identity.oidc.issuer" --output text

回傳的結果如下。

https://oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE

建立 IAM policy 並定義可以使用的權限

因為 AWS 維護的 AmazonEKS_CNI_Policy 權限不足沒辦法分配 IPv6 地址,所以需要建立新 policy,下面為配置定義。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ec2:AssignIpv6Addresses",
        "ec2:DescribeInstances",
        "ec2:DescribeTags",
        "ec2:DescribeNetworkInterfaces",
        "ec2:DescribeInstanceTypes"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "ec2:CreateTags"
      ],
      "Resource": [
        "arn:aws:ec2:*:*:network-interface/*"
      ]
    }
  ]
}

建立 VPC CNI role 並定義 trust relationships

要配置 IRSA(IAM role for service account) 讓 pod kube-system:aws-node 可以提權,所以需要定義 trust relationships,下面 json 是 Trusted entities 的定義,其中:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com",
          "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:kube-system:aws-node"
        }
      }
    }
  ]
}

將 policy 權限加入到 role 中

aws iam attach-role-policy \
  --policy-arn arn:aws:iam::111122223333:policy/development-souffle-VPCCNIIPv6 \
  --role-name development-souffle-VPCCNIIPv6

加入 ann 到 serviceaccount aws-node 中,使其角色可以提權

kubectl get serviceaccount -n kube-system aws-node -o yaml

kubectl annotate serviceaccount \
    -n kube-system aws-node \
    eks.amazonaws.com/role-arn=arn:aws:iam::111122223333:role/development-souffle-VPCCNIIPv6

重新部署 aws-node 所有 pod 使其可以使用到新的 service account 權限