Jun 14, 2025
建立支持 IPv6 的 CNI 給 EKS
記錄在 EKS 叢集啟用 IPv6 時,如何透過 IRSA(IAM Role for Service Account)設定 Amazon VPC CNI 外掛程式權限的完整操作步驟:建立具備 IPv6 相關權限的 IAM policy、設定 trust relationship 建立對應 role、將 role 附掛到 policy、annotate kube-system 的 aws-node service account,最後重啟 aws-node pod 套用新權限。
[chiehting]
424 Words CHANGE ME READ TIME1 Minute, 55 Seconds
2025-06-14 13:24 +0800
EKS 使用 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",
"ec2:DescribeSubnets"
],
"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 的定義,其中:
- Effect 固定 Allow
- Federated 為 OIDC 的 arn,可以去 IAM > Identity providers 底下找
- Action 固定 “sts:AssumeRoleWithWebIdentity”
- StringEquals
- aud (Audience) 為 sts.amazonaws.com 可以使用 Token 授權
- sub (Subject) 為 system:serviceaccount:kube-system:aws-node 可以提權
{
"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 權限
kubectl delete pods -n kube-system -l k8s-app=aws-node