AWS运维部署实践--快速拉起生产可用的EKS集群
AWS 的 K8S 产品名叫 EKS,EKS 针对 K8S 的封装非常克制,因此有不少内容,需要我们自己手动来完成,本文记录下 EKS 集群搭建相关的配置,让你能够快速把集群搭建出来,并且跑通可用。
# 子网规划与配置
首先需要规划好子网,主要分两块儿,且每块儿都需要至少两个不同区域(节点组要求)的子网:
公有子网
- 要创建两个(最少),区分在两个可用区。
- 并且这个子网还需要开启自动分配公有 IPv4 地址的功能,否则无法正常使用。
私有子网
- 要创建两个(最少),区分在两个可用区。
关于子网相关的内容,请跳转 AWS运维部署实践--网络环境规划 (opens new window) 查看。
切切注意
📢注意: 这里我建议直接给公有子网以及私有子网都创建成三个可用区,千万不要出现一个多一个少,或者两种子网可用区对应不上的情况。(我曾踩过一个坑:创建了两个公有子网,三个私有子网,然后服务启动之后,有可能会在私有子网 C,此时假如公网 ingress 没有再 C 区,怎会出现无法关联成功的情况)
子网规划做好之后,要对子网进行打标,关于为什么要打标,可见此文档:子网自动发现 (opens new window)
# 如果是公有子网,则增加标签:
kubernetes.io/role/elb=1
# 如果是私有子网,则增加标签:
kubernetes.io/role/internal-elb=1
2
3
4
5
更为基础的,创建一个对应VPC下的基础安全组,这个就不多赘述了。安全组里要增加放开VPC内网所有请求的规则。
# 配置 IAM
因为我们创建集群以及一些操作,会通过 aws cli
命令行来进行,因此需要先创建一台服务器,之后的操作会在这台服务器上进行。
来到控制台,在 IAM
创建一个角色,关联一个权限,实际上这里关联EC2
和EKS
的就够,我这里直接关联了管理员的权限。
然后把上一步创建的角色绑定到一台EC2
的跳板机上,关联上之后,需要重启
下该实例,此时,该机器已经有了通过 aws
命令操作AWS的权限。
# 安装命令工具
# aws
$ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
$ unzip awscliv2.zip
$ sudo ./aws/install
2
3
# kubectl
$ curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/1.30.0/2024-05-12/bin/linux/amd64/kubectl
$ chmod +x ./kubectl
$ mv ./kubectl /usr/local/bin
2
3
# eksctl
$ curl -sLO "https://github.com/eksctl-io/eksctl/releases/latest/download/eksctl_Linux_amd64.tar.gz"
$ tar -xzf eksctl_Linux_amd64.tar.gz -C /tmp && rm eksctl_Linux_amd64.tar.gz
$ sudo mv /tmp/eksctl /usr/local/bin
2
3
# helm
$ curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 > get_helm.sh
$ chmod 700 get_helm.sh
$ ./get_helm.sh
2
3
# 创建集群
创建集群也是有多种方式,你可以选择在控制台创建,也可以通过工具创建,这里则选择结合eksctl
工具来创建集群。
# 定义集群配置
定义 eks
集群的配置文件,注意调整名字
,区域
,子网
,以及节点组
信息等需要修改。
配置文件命名:cluster.yaml
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
name: aws3-sgp-eks-cluster
region: ap-southeast-1
version: "1.31"
vpc:
subnets:
private:
ap-southeast-1a: { id: subnet-000001 }
ap-southeast-1b: { id: subnet-000002 }
ap-southeast-1c: { id: subnet-000003 }
public:
ap-southeast-1a: { id: subnet-000001 }
ap-southeast-1b: { id: subnet-000002 }
ap-southeast-1b: { id: subnet-000003 }
addons:
- name: vpc-cni
- name: coredns
- name: kube-proxy
managedNodeGroups:
- name: aws3-sgp-eks-nodegroup-01
minSize: 2
maxSize: 4
desiredCapacity: 2
volumeSize: 500
volumeType: gp3
privateNetworking: true
labels: { role: worker }
tags:
nodegroup-role: worker
ssh:
allow: true
publicKeyPath: ~/.ssh/authorized_keys
publicKeyName: "aws3-sshkey"
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
- 几项注意:
- 机型信息可通过实例类型页面查看支持的机型 (opens new window)。
- 子网的对应区域信息要正确。
- 如果你需要多个节点组,可以往下复制继续配置。
# 创建集群
因创建时间比较久,建议通过tmux管理。
$ yum -y install tmux
$ tmux new -s eryajf -d
$ tmux a -t eryajf
$ eksctl create cluster -f cluster.yaml
2
3
4
创建集群过程比较久,要一二十分钟,可耐心等待。可以通过命令输出看过程,也可以到控制台的 CloudFormation (opens new window) 查看。
集群创建完毕之后,要想连上节点组拉起的集群节点:
- 集群安全组,如果想要访问集群的节点,这个安全组也要放开内网访问。
- 节点安全组也要放开内网访问。
可能会有某些地方配置不对,导致创建失败,可根据cloudformation
里边的事件来看失败的原因。
如果要删除集群:
$ eksctl delete cluster -f cluster.yaml
# 集群授权
默认创建出来的集群,节点信息是看不到的,需要创建一个认证,关联eks
的策略,那么对应创建的子账号关联该策略,就可以管理集群了。
只需一条命令:
$ eksctl create iamidentitymapping --cluster aws3-sgp-eks-cluster --region=ap-southeast-1 --arn arn:aws:iam::0000007:user/aws3-eryajf --username admin --group system:masters --no-duplicate-arns
--cluster
:指定eks集群名字--region
:指定区域--arn
:指定要授权的子账号。
这个命令给对应账号aws3-eryajf
加了master的权限,这个权限比较大,可考虑酌情添加。
# 获取 kubeconfig
在执行机EC2上获取kubeconfig
$ aws eks update-kubeconfig --region ap-southeast-1 --name aws3-sgp-eks-cluster
然后可以执行kubectl命令验证是否能够正常使用:
$ kubectl get node
如果执行失败,则可能是网络不通,可以查看安全组是否放开。如果报权限问题,则可能是上边某个步骤没有做好。
以上,一个独立的集群就已经完整创建出来了,正常部署服务已经没有问题。
# 安装Ingress-Controller
集群创建完毕之后,可以正常部署应用,但是要想被外部访问,还需要配置ingress-controller
。接下来介绍一下配置的流程。
# 创建 OIDC
注意指定集群名字
:
$ oidc_id=$(aws eks describe-cluster --name aws3-sgp-eks-cluster --query "cluster.identity.oidc.issuer" --output text | cut -d '/' -f 5)
$ echo $oidc_id
$ aws iam list-open-id-connect-providers | grep $oidc_id | cut -d "/" -f4
$ eksctl utils associate-iam-oidc-provider --cluster aws3-sgp-eks-cluster --approve
2
3
4
创建成功之后,可以在 IAM 的角色提供商那里可以看到。
# OIDC 关联角色
先创建策略:
$ curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.8.1/docs/install/iam_policy.json
$ aws iam create-policy \
--policy-name AWSLoadBalancerControllerIAMPolicxh \
--policy-document file://iam_policy.json
# 执行之后会输出策略内容。
2
3
4
5
6
7
8
然后使用 eksctl
创建角色
# 注意arn使用上一部 oidc生成的
eksctl create iamserviceaccount \
--cluster=aws3-sgp-eks-cluster \
--namespace=kube-system \
--name=aws-load-balancer-controller \
--role-name AmazonEKSLoadBalancerControllerRole \
--attach-policy-arn=arn:aws:iam::0000007:policy/AWSLoadBalancerControllerIAMPolicxh \
--approve
2
3
4
5
6
7
8
切切注意
📢 注意
这里踩坑了,创建的时候,总是会提示:
这里实际kubectl get sa -n kube-system | grep load
,以及查看都找不到这个信息,猜测是eksctl
的bug。
那么可以将 --name=aws-load-balancer-controller
改为 --name=aws-load-balancer-controller-new
,但需要注意下边安装controller
时把名字指定为与这里一致。
如果正常创建了,可以查看一下这个sa:
$ k get sa -n kube-system aws-load-balancer-controller-new -oyaml
apiVersion: v1
kind: ServiceAccount
metadata:
annotations:
eks.amazonaws.com/role-arn: arn:aws:iam::0000007:role/AmazonEKSLoadBalancerControllerRoleg
creationTimestamp: "2024-07-17T09:59:06Z"
labels:
app.kubernetes.io/managed-by: eksctl
name: aws-load-balancer-controller
namespace: kube-system
resourceVersion: "45191"
uid: 0755f65b-7886-4e38-b022-4729b147e2bb
2
3
4
5
6
7
8
9
10
11
12
13
14
其中的arn可以在控制台的IAM中查看到这个角色,以及角色里边关联的策略。
# 添加helm源
$ helm repo add eks https://aws.github.io/eks-charts
$ helm repo update eks
2
# 安装 ingress-controller
$ helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
-n kube-system \
--set clusterName=aws3-sgp-eks-cluster \
--set serviceAccount.create=false \
--set serviceAccount.name=aws-load-balancer-controller
2
3
4
5
注意这里的角色与上边保持一致。默认情况下,安装的副本数为2,如果你是生产环境,可酌情考虑增加。
然后查看这个deployment:
$ k get deploy -n kube-system aws-load-balancer-controller
NAME READY UP-TO-DATE AVAILABLE AGE
aws-load-balancer-controller 2/2 2 2 20h
2
3
至此,一个基础的集群,以及基本的ingress-controller
就部署好了。
剩下的就是部署应用,以及配置ingress了。
# 完事儿后的一些调整
注意默认情况下,集群的访问端点是完全对公的,可以在集群管理处,进行调整:
可以改为私有访问,仅允许 VPC 内访问。
安全组则需要根据自己实际使用情况调整即可。
如此,一个可投入使用的 EKS 集群就创建好了。
接下来,将介绍 ingress 的实际应用。
# 可参考文档
- 02
- AWS运维部署实践--内外网Ingress配置验证实践10-19
- 03
- AWS运维部署实践--配置跨账号通过kubectl管理EKS集群10-19