AWS-EKS-04--安装 Amazon VPC CNI

摘要

安装Amazon VPC CNI plugin for Kubernetes

  • Amazon VPC CNI plugin for Kubernetes 是 Amazon EKS 集群中用于 Pod 联网的联网插件。该插件负责向 Kubernetes 节点分配 VPC IP 地址并为每个节点上的 Pods 配置所需网络。

  • 如果您使用 AWS Management Console 部署了集群,则可以跳过此步骤。AWS Management Console在默认情况下会部署 Amazon VPC CNI plugin for Kubernetes、CoreDNS、kube-proxy Amazon EKS 附加组件。
    如果您使用 eksctl 或 AWS CLI 部署集群,则 Amazon VPC CNI plugin for Kubernetes、CoreDNS 和 kube-proxy 自行管理的附加组件将会被部署。您可以将使用您的集群部署的 Amazon VPC CNI plugin for Kubernetes、CoreDNS 和 kube-proxy 自行管理的附加组件迁移到 Amazon EKS 附加组件中。为了遵循最小特权原则,AWS建议我们将AmazonEKS_CNI_Policy策略附加到专门用于Amazon VPC CNI附加组件的单独角色。

  • 创建 IAM 角色

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# 确定您的集群的 IP 系列
$ aws eks describe-cluster --name eks-lexing --profile eks-us-west-2 | grep ipFamily
"ipFamily": "ipv4"
# 使用与您的集群的 IP 系列匹配的命令创建 IAM 角色并将 IAM policy 附加到该角色。此命令创建并部署一个创建 IAM 角色的 AWS CloudFormation 堆栈,向其附加您指定的策略,并使用所创建 IAM 角色的 ARN 对现有 aws-node Kubernetes 服务账户添加注释。
$ eksctl create iamserviceaccount --name aws-node --namespace kube-system \
--cluster eks-lexing --profile eks-us-west-2 \
--role-name AmazonEKSVPCCNIRole \
--attach-policy-arn arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy \
--override-existing-serviceaccounts \
--approve
2023-06-30 16:38:30 [ℹ] 1 existing iamserviceaccount(s) (kube-system/ebs-csi-controller-sa) will be excluded
2023-06-30 16:38:30 [ℹ] 1 iamserviceaccount (kube-system/aws-node) was included (based on the include/exclude rules)
2023-06-30 16:38:30 [!] metadata of serviceaccounts that exist in Kubernetes will be updated, as --override-existing-serviceaccounts was set
2023-06-30 16:38:30 [ℹ] 1 task: {
2 sequential sub-tasks: {
create IAM role for serviceaccount "kube-system/aws-node",
create serviceaccount "kube-system/aws-node",
} }2023-06-30 16:38:30 [ℹ] building iamserviceaccount stack "eksctl-eks-lexing-addon-iamserviceaccount-kube-system-aws-node"
2023-06-30 16:38:31 [ℹ] deploying stack "eksctl-eks-lexing-addon-iamserviceaccount-kube-system-aws-node"
2023-06-30 16:38:31 [ℹ] waiting for CloudFormation stack "eksctl-eks-lexing-addon-iamserviceaccount-kube-system-aws-node"
2023-06-30 16:39:02 [ℹ] waiting for CloudFormation stack "eksctl-eks-lexing-addon-iamserviceaccount-kube-system-aws-node"
2023-06-30 16:39:04 [ℹ] serviceaccount "kube-system/aws-node" already exists
2023-06-30 16:39:04 [ℹ] updated serviceaccount "kube-system/aws-node"

# 重新部署 Amazon VPC CNI plugin for KubernetesPods
# 删除并重新创建任何与服务账户关联的现有 Pods,以应用凭证环境变量。注释未应用于目前在没有注释的情况下运行的 Pods。以下命令删除现有的 aws-node DaemonSet Pods 并使用服务账户注释部署它们。
$ kubectl delete Pods -n kube-system -l k8s-app=aws-node
pod "aws-node-fzh9v" deleted
pod "aws-node-t62f8" deleted

# 确认 Pods 已全部重新启动
$ kubectl get pods -n kube-system -l k8s-app=aws-node
NAME READY STATUS RESTARTS AGE
aws-node-q2zfb 1/1 Running 0 11s
aws-node-rmfbk 1/1 Running 0 11s

# 描述 Pods 之一并确保 AWS_WEB_IDENTITY_TOKEN_FILE 和 AWS_ROLE_ARN 环境变量存在。
$ kubectl describe pod -n kube-system aws-node-q2zfb | grep 'AWS_ROLE_ARN:\|AWS_WEB_IDENTITY_TOKEN_FILE:'
AWS_ROLE_ARN: arn:aws:iam::743263909655:role/AmazonEKSVPCCNIRole
AWS_WEB_IDENTITY_TOKEN_FILE: /var/run/secrets/eks.amazonaws.com/serviceaccount/token
AWS_ROLE_ARN: arn:aws:iam::743263909655:role/AmazonEKSVPCCNIRole
AWS_WEB_IDENTITY_TOKEN_FILE: /var/run/secrets/eks.amazonaws.com/serviceaccount/token
  • 配置好上面的IAM角色后,要从节点 IAM 角色中删除 CNI 策略

    • 在角色列表中搜索 eksNodeRole、AmazonEKSNodeRole 或 NodeInstanceRole,应该存在一个,我这里就是存在 NodeInstanceRole,如果一个都不存在就先参照上文创建一个新的IAM角色
    • 删除策略 AmazonEKS_CNI_Policy
    • 也可以通过命令行删除角色中的策略
    1
    aws iam detach-role-policy --profile eks-us-west-2 --role-name eksctl-eks-lexing-nodegroup-ng-4d-NodeInstanceRole-Y28EPJO9XYDG --policy-arn arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy
  • 安装Amazon VPC CNI plugin for Kubernetes

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# 查看集群上当前安装的附加组件版本
$ kubectl describe daemonset aws-node --namespace kube-system | grep amazon-k8s-cni: | cut -d : -f 3
v1.12.2-eksbuild.1

# 查看集群上当前安装的附加组件类型。根据您创建集群时使用的工具,您的集群上目前可能没有安装 Amazon EKS 附加组件类型
$ aws eks describe-addon --cluster-name eks-lexing --profile eks-us-west-2 --addon-name vpc-cni --query addon.addonVersion --output text

An error occurred (ResourceNotFoundException) when calling the DescribeAddon operation: No addon: vpc-cni found in cluster: eks-lexing
# 如果返回版本号,则表明您的集群上安装有 Amazon EKS 附加组件类型,且您不需要完成此过程的其余步骤。如果返回错误,则表明您的集群上安装有 Amazon EKS 类型的附加组件。完成此过程的其余步骤以进行安装。

# 使用 AWS CLI 创建附加组件,注意这里--addon-version的版本号要与https://docs.aws.amazon.com/zh_cn/eks/latest/userguide/managing-vpc-cni.html中的k8s版本相对应
# AmazonEKSVPCCNIRole就是上面创建的角色的名称
$ aws eks create-addon --cluster-name eks-lexing --profile eks-us-west-2 \
--addon-name vpc-cni \
--addon-version v1.12.6-eksbuild.2 \
--resolve-conflicts OVERWRITE \
--service-account-role-arn arn:aws:iam::743263909655:role/AmazonEKSVPCCNIRole
{
"addon": {
"addonName": "vpc-cni",
"clusterName": "eks-lexing",
"status": "CREATING",
"addonVersion": "v1.12.6-eksbuild.2",
"health": {
"issues": []
},
"addonArn": "arn:aws:eks:us-west-2:743263909655:addon/eks-lexing/vpc-cni/bcc485cc-cf4c-f8c6-84da-55c66044e0ff",
"createdAt": "2023-06-30T17:19:24.457000+08:00",
"modifiedAt": "2023-06-30T17:19:24.475000+08:00",
"serviceAccountRoleArn": "arn:aws:iam::743263909655:role/AmazonEKSVPCCNIRole",
"tags": {}
}
}

# 确认您的集群的 Kubernetes 版本的附加组件最新版本已添加到您的集群
$ aws eks describe-addon --cluster-name eks-lexing --profile eks-us-west-2 --addon-name vpc-cni --query addon.addonVersion --output text
v1.12.6-eksbuild.2

$ kubectl describe daemonset aws-node --namespace kube-system | grep amazon-k8s-cni: | cut -d : -f 3
v1.12.6-eksbuild.2
  • 此时可以通过aws控制台对eks的 Amazon VPC CNI 插件进行管理,后续升级可以直接在控制台进行

查看eks的所有可用组件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 查看都有哪些组件
$ eksctl utils describe-addon-versions --kubernetes-version 1.26 --profile eks-us-west-2 | grep AddonName
"AddonName": "kube-proxy",
"AddonName": "adot",
"AddonName": "aws-guardduty-agent",
"AddonName": "vpc-cni",
"AddonName": "kubecost_kubecost",
"AddonName": "coredns",
"AddonName": "aws-ebs-csi-driver",

# 查看某个组件有哪些版本
$ eksctl utils describe-addon-versions --kubernetes-version 1.26 --name vpc-cni --profile eks-us-west-2 | grep AddonVersion
"AddonVersions": [
"AddonVersion": "v1.13.2-eksbuild.1",
"AddonVersion": "v1.13.0-eksbuild.1",
"AddonVersion": "v1.12.6-eksbuild.2",
"AddonVersion": "v1.12.6-eksbuild.1",
"AddonVersion": "v1.12.5-eksbuild.2",
"AddonVersion": "v1.12.0-eksbuild.2",

# 确定您要创建的附加组件是 Amazon EKS 还是 AWS Marketplace 附加组件,如果未返回输出,则该附加组件是 Amazon EKS。如果返回输出,则该附加组件是 AWS Marketplace 附加组件。
$ eksctl utils describe-addon-versions --kubernetes-version 1.26 --name vpc-cni --profile eks-us-west-2 | grep ProductUrl

$ eksctl utils describe-addon-versions --kubernetes-version 1.26 --name kubecost_kubecost --profile eks-us-west-2 | grep ProductUrl
"ProductUrl": "https://aws.amazon.com/marketplace/pp?sku=753cea16-f450-4cfa-93eb-f55dcde11e91"