EKS 简明教程
01-集群创建

01.安装命令行工具

需要安装以下三个命令行工具:

NameDescription
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)

下载安装包

Terminal
curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"

安装

Terminal
sudo installer -pkg AWSCLIV2.pkg -target /

验证

Terminal
aws --version
Output
aws-cli/2.11.17 Python/3.11.3 Darwin/22.5.0 exe/x86_64 prompt/off

配置 AKSK

Terminal
aws configure
Output
AWS Access Key ID [None]: AxxxxxxxxxxTUCxxxxxG
AWS Secret Access Key [None]: uMe7fuxxxxxxxxxxxxBqt3HxxxxxxxxDTm  
Default region name [None]: us-east-1
Default output format [None]: json

验证权限

Terminal
aws ec2 describe-vpcs

01.02 kubectl 安装

AWS 官方文档出处 安装或更新 kubectl

https://docs.aws.amazon.com/zh_cn/eks/latest/userguide/install-kubectl.html (opens in a new tab)

下载二进制文件

Terminal
curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/1.27.1/2023-04-19/bin/darwin/amd64/kubectl

赋予执行权限

Terminal
chmod +x ./kubectl

更新 PATH

👉

注意 : 不同 shell 有着不同的配置方法,以下为 bash 的配置命令

Terminal
mkdir -p $HOME/bin && cp ./kubectl $HOME/bin/kubectl && export PATH=$PATH:$HOME/bin
echo 'export PATH=$PATH:$HOME/bin' >> ~/.bash_profile

验证命令行

Terminal
kubectl version --short --client

01.03 eksctl 安装

eksctl github page

https://github.com/eksctl-io/eksctl (opens in a new tab)

Mac OS 使用HomeBrew 进行安装

Terminal
brew tap weaveworks/tap
brew install weaveworks/tap/eksctl

验证

Terminal
eksctl version

02 EKS 核心对象

ITEMCONTENT
EKS Control PlaneEKS以托管方式为我们管理, 控制面板的相关组件, etcd/Kube-apiserver/kube-controller.
Worker Node & Node Groups使用 EC2 作为 K8S 作为数据平面时, EKS 提供以 Node Group 方式进行 EC2 Instance 的管理.
Fargate ProfileEKS 中你还可以使用 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

创建示例集群

Terminal
eksctl create cluster --name=eksdemo1 \
                      --region=us-east-1 \
                      --zones=us-east-1a,us-east-1b \
                      --without-nodegroup
ARGDESCRIPTION
--namecluster 名称
--regioncluster 所在区域
--zonescluster 所在可用区
--without-nodegroup仅创建 control plane, 不创建nodegroup

创建时间大概 15 到 20 分钟.

验证 cluster

Terminal
eksctl get cluster
Output
NAME    REGION    EKSCTL CREATED
eksdemo1  us-east-1  True

03.02 创建 IAM OIDC Provider

在 EKS 使用过程中, K8S 的 pod 很多情境下都需要拥有 IAM 的权限, 这时我们会借助这个 OIDC 来完成 Kubernetes Service Acounts 与 IAM Roles 的转换和映射. 所以在这里, 绝大多数情况下我们都需要创建一个 OIDC Provider.

Terminal
eksctl utils associate-iam-oidc-provider \
    --region us-east-1 \
    --cluster eksdemo1 \
    --approve

03.03 创建 Node Group

👉

创建KeyPair : 通常情况下, 我们想要有机会去 ssh 到 nodegroup 管理的 ec2 instance 中进行一些操作, 那么我们需要提前创建一个 keypair 进行 ssh 连接. 你可以在 EC2 的控制台当中创建一个 keypair, 以下是我创建的 keypair


接下来开始创建 Node Group, 在创建 Node Group 时, 可以指定很多选项你可以使用

Terminal
eksctl create nodegroup --help

来进行选项的具体作用. 下面是一个创建 nodegroup 的示例:

Terminal
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
ARGDESCRIPTION
cluster/region/name表明 nodegroup 隶属于那个 cluster , 位于哪个 region, 叫做什么名字.
node-type则是 group 内 ec2 的实例类型, node-volume-size 则是 instance 的卷大小.
Nodes/nodes-min/nodes-maxnodegroup 背后的 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

Terminal
eksctl get cluster
Output
NAME    REGION    EKSCTL CREATED
eksdemo1  us-east-1  True
Terminal
eksctl get cluster --name=eksdemo1
Output
NAME    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

Terminal
eksctl get nodegroup --cluster=eksdemo1
Output
CLUSTER        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

验证节点信息

Terminal
kubectl get node -owide
Output
NAME                            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.19

04.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) 对于所有协议和端口的入栈流量.