01 安装命令行工具
需要安装以下三个命令行工具:
-
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
下载安装包
curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"
安装
sudo installer -pkg AWSCLIV2.pkg -target /
验证
# aws --version
aws-cli/2.11.17 Python/3.11.3 Darwin/22.5.0 exe/x86_64 prompt/off
配置 AKSK
# aws configure
AWS 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-vpcs
01.02 kubectl 安装
AWS 官方文档出处 安装或更新 kubectl
https://docs.aws.amazon.com/zh_cn/eks/latest/userguide/install-kubectl.html
下载二进制文件
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
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 --client
01.03 eksctl 安装
eksctl github page
https://github.com/eksctl-io/eksctl
Mac OS 使用HomeBrew 进行安装
brew tap weaveworks/tap
brew install weaveworks/tap/eksctl
验证
eksctl version
02 EKS 核心对象
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
CLI Example:
eksctl create cluster --name=eksdemo1 \
--region=us-east-1 \
--zones=us-east-1a,us-east-1b \
--without-nodegroup
-
–name : cluster 名称
-
–region: cluster 所在区域
-
–zones: cluster 所在可用区
-
–without-nodegroup : 仅创建 control plane, 不创建nodegroup
OUTPUT :
创建时间大概 15 到 20 分钟.
验证 cluster
# eksctl get cluster
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.
CLI Example:
eksctl utils associate-iam-oidc-provider \
--region us-east-1 \
--cluster eksdemo1 \
--approve
03.03 创建 Node Group
通常情况下, 我们想要有机会去 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
其中 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 cluster
NAME REGION EKSCTL CREATED
eksdemo1 us-east-1 True
# eksctl get cluster --name=eksdemo1
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
# eksctl get nodegroup --cluster=eksdemo1
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
验证节点信息
# kubectl get node -owide
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) 对于所有协议和端口的入栈流量.