01.安装命令行工具
需要安装以下三个命令行工具:
| Name | Description |
|---|---|
| AWS CLI | 用于通过命令行方式控制 AWS Service. |
| kubectl | 用于控制 Kubernetes 集群以及对象 |
| eksctl | 用于管理 Amazon EKS 集群, 管理 NodeGroup / Fargate Profile 等EKS 资源. |
01.01 AWS CLI 安装配置
AWS 官方文档出处 安装或更新 AWS CLI 的最新版本
https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html (opens in a new tab)
下载安装包
curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"安装
sudo installer -pkg AWSCLIV2.pkg -target /验证
aws --versionaws-cli/2.11.17 Python/3.11.3 Darwin/22.5.0 exe/x86_64 prompt/off配置 AKSK
aws configureAWS Access Key ID [None]: AxxxxxxxxxxTUCxxxxxG
AWS Secret Access Key [None]: uMe7fuxxxxxxxxxxxxBqt3HxxxxxxxxDTm
Default region name [None]: us-east-1
Default output format [None]: json验证权限
aws ec2 describe-vpcs01.02 kubectl 安装
AWS 官方文档出处 安装或更新 kubectl
https://docs.aws.amazon.com/zh_cn/eks/latest/userguide/install-kubectl.html (opens in a new tab)
下载二进制文件
curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/1.27.1/2023-04-19/bin/darwin/amd64/kubectl赋予执行权限
chmod +x ./kubectl更新 PATH
注意 : 不同 shell 有着不同的配置方法,以下为 bash 的配置命令
mkdir -p $HOME/bin && cp ./kubectl $HOME/bin/kubectl && export PATH=$PATH:$HOME/bin
echo 'export PATH=$PATH:$HOME/bin' >> ~/.bash_profile验证命令行
kubectl version --short --client01.03 eksctl 安装
eksctl github page
Mac OS 使用HomeBrew 进行安装
brew tap weaveworks/tap
brew install weaveworks/tap/eksctl验证
eksctl version02 EKS 核心对象
| ITEM | CONTENT |
|---|---|
| EKS Control Plane | EKS以托管方式为我们管理, 控制面板的相关组件, etcd/Kube-apiserver/kube-controller. |
| Worker Node & Node Groups | 使用 EC2 作为 K8S 作为数据平面时, EKS 提供以 Node Group 方式进行 EC2 Instance 的管理. |
| Fargate Profile | EKS 中你还可以使用 Fargate 的方式承载 K8S 上的数据平面负载, 这时你需要配置 Fargate Profile. |
| VPC | 在 EKS 中, 数据平面负载所需的网络环境由 VPC 进行承载. |
02.01 EKS Control Plane
-
EKS 中每一个 Cluster 的控制平面都独自隔离, control plane 的基础设施不会与其他账号或者同一个账号下的其他 Cluster 进行共享.
-
在这个 Control Plane 中, 在用户看来是天然高可用的, EKS 会为用户启动至少两个 APIServer Node 和 三个 EtcdNodes , 且其基础设施会横跨同一区域中的三个可用区.
-
EKS 也会帮助我们自动检测和替换非正常控制平面节点, 以使得用户免于运维 Control Plane 的相关组件.
02.02 Worker Node 和 Node Group
-
你可以使用 EC2 Instances 作为 K8S 的数据平面负载, 也就是 K8S语境中的 Worker Node.
-
这些 Worker Node 在通过位于其所在的 VPC 中的 Cluser API Server endpoint 与 EKS 托管的 Control Plane 进行通信.
-
Node Group 是为了简化 Worker Node 而被设计出来的, 其背后使用 EC2 AutoScaling Group 进行管理. 所以在同一个 Node Group 中的多个 Node 使用同一个模板进行创建, 保证其配置的一致性, 例如使用一致的 Instance Type/AMI/EC2 Profile.
02.03 Fargate Profiles
-
在 EKS 中你还可以使用 Fargate 服务在承载 K8S 中的计算负载, 从而免于运维虚拟机.
-
每一个 Fargate 运行着一个 Pod, Fargate为其提供一个隔离的运行环境, 每个 Fargate 都使用隔离的计算资源和独立的ENI.
-
通过配置 Fargate Profile 可以让 Fargate Controller 识别哪些 Pod 需要使用 Fargate 方式进行承载.
02.04 VPC (Virtual Private Cloud)
-
VPC 是 AWS 中的网络服务, 用于让客户创建独立的网络环境.
-
在 VPC 中, 通过安全组(Security Group) 和 N-ACL 完成网络安全策略配置.
-
不论是以 Node Group 方式还是 Fargate 方式, 都需要跑在 VPC 提供的网络环境下.
03 创建第一个 EKS Cluster
03.01 创建Cluster Control Plane
创建示例集群
eksctl create cluster --name=eksdemo1 \
--region=us-east-1 \
--zones=us-east-1a,us-east-1b \
--without-nodegroup| ARG | DESCRIPTION |
|---|---|
| --name | cluster 名称 |
| --region | cluster 所在区域 |
| --zones | cluster 所在可用区 |
| --without-nodegroup | 仅创建 control plane, 不创建nodegroup |

验证 cluster
eksctl get clusterNAME REGION EKSCTL CREATED
eksdemo1 us-east-1 True03.02 创建 IAM OIDC Provider
在 EKS 使用过程中, K8S 的 pod 很多情境下都需要拥有 IAM 的权限, 这时我们会借助这个 OIDC 来完成 Kubernetes Service Acounts 与 IAM Roles 的转换和映射. 所以在这里, 绝大多数情况下我们都需要创建一个 OIDC Provider.
eksctl utils associate-iam-oidc-provider \
--region us-east-1 \
--cluster eksdemo1 \
--approve03.03 创建 Node Group
创建KeyPair : 通常情况下, 我们想要有机会去 ssh 到 nodegroup 管理的 ec2 instance 中进行一些操作, 那么我们需要提前创建一个 keypair 进行 ssh 连接. 你可以在 EC2 的控制台当中创建一个 keypair, 以下是我创建的 keypair

接下来开始创建 Node Group, 在创建 Node Group 时, 可以指定很多选项你可以使用
eksctl create nodegroup --help来进行选项的具体作用. 下面是一个创建 nodegroup 的示例:
eksctl create nodegroup \
--cluster=eksdemo1 \
--region=us-east-1 \
--name=eksdemo1-ng-public1 \
--node-type=t3.medium \
--nodes=2 \
--nodes-min=2 \
--nodes-max=4 \
--node-volume-size=20 \
--ssh-access \
--ssh-public-key=kube-demo \
--asg-access \
--external-dns-access \
--full-ecr-access \
--appmesh-access \
--alb-ingress-access| ARG | DESCRIPTION |
|---|---|
| cluster/region/name | 表明 nodegroup 隶属于那个 cluster , 位于哪个 region, 叫做什么名字. |
| node-type | 则是 group 内 ec2 的实例类型, node-volume-size 则是 instance 的卷大小. |
| Nodes/nodes-min/nodes-max | nodegroup 背后的 asg 的所需容量,最小容量和最大容量. |
| ssh-access/ssh-public-key | 则指定了 instance sg 被允许 ssh 且使用制定的 keypair. |
| asg-access/external-dns-access/full-ecr-access/appmesh-access/alb-ingress-access | 则是显性的指明在 nodegroup 下的 ec2 instance 所附加的 EC2 instance profile 需要添加上述的几个权限. |
04 验证集群资源
04.01 EKS 资源验证
验证 Control Plane
eksctl get clusterNAME REGION EKSCTL CREATED
eksdemo1 us-east-1 Trueeksctl get cluster --name=eksdemo1NAME VERSION STATUS CREATED VPC SUBNETS SECURITYGROUPS PROVIDER
eksdemo1 1.25 ACTIVE 2023-08-07T06:01:32Z vpc-051e6f8a3c344c075 subnet-0146b62bf36b782f8,subnet-03efa115372238d10,subnet-04836e2c70b6532f9,subnet-0bc391b02ce6bd919 sg-0cd93ab2c8acb64af EKS验证Node Group
eksctl get nodegroup --cluster=eksdemo1CLUSTER NODEGROUP STATUS CREATED MIN SIZE MAX SIZE DESIRED CAPACITY INSTANCE TYPE IMAGE ID ASG NAME TYPE
eksdemo1 eksdemo1-ng-public1 ACTIVE 2023-08-07T07:17:35Z 2 4 2 t3.medium AL2_x86_64 eks-eksdemo1-ng-public1-78c4e76d-dbe3-503f-7603-dbe140ecef65 managed验证节点信息
kubectl get node -owideNAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
ip-192-168-13-57.ec2.internal Ready <none> 171m v1.25.11-eks-a5565ad 192.168.13.57 xxx.95.xxx.255 Amazon Linux 2 5.10.184-175.749.amzn2.x86_64 containerd://1.6.19
ip-192-168-33-3.ec2.internal Ready <none> 171m v1.25.11-eks-a5565ad 192.168.33.3 xxx.91.xxx.130 Amazon Linux 2 5.10.184-175.749.amzn2.x86_64 containerd://1.6.1904.02 VPC 网络资源
在 VPC Resource Map 中可以看到 eksctl 使用 cloudformation 为我们创建的相关网络资源.

包含 4 个子网, 每个 AZ 包含一个公有子网,一个私有子网

一个 IGW 与 一个 NAT-GW


一个Cluster安全组, 用于 control plane 与 data plane 之间的通信.
一个 SSH 安全组, 附加与 NodeGroup 中, 用于允许外部 IP 连接 WorkerNode.
04.03 验证 SSH
使用配置的 KeyPair 进行对于 NodeGroup 中实例的 ssh 连接.

04.04 仅测试使用 慎用 开启Node所有入网流量
注意 : 为了方便之后的demo 和测试, 在上述 SSH 安全组上开启所有来源 IP (0.0.0.0) 对于所有协议和端口的入栈流量.
![]()