基于AWS EKS的K8S实践系列文章是基于企业级的实战文章,一些设置信息需要根据公司自身的网络等要求进行设置,如果大家有问题讨论或咨询可以后台私信我或者加入知识星球问我,知识星球的加入方式在文章末尾。
通过EKS创建的集群,EKS本身会为我们保证控制平面的高可用。
集群角色准备
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "eks.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
2. 创建角色,这里假设角色名称是eks-cluster-role
aws iam create-role \
--role-name eks-cluster-role \
--assume-role-policy-document file://"cluster-trust-policy.json"
3. 将所需的 IAM policy 附加到角色
aws iam attach-role-policy \
--policy-arn arn:aws:iam::aws:policy/AmazonEKSClusterPolicy \
--role-name eks-cluster-role
通过上述三个步骤即可创建成功,在IAM控制台可以看到我们刚刚创建的角色,如下图:
VPC准备
这里创建一个VPC,VPC在创建的时候一定要启动DNS主机名,网段的设置需要根据公司自身的网络环境设置,子网的网段我们假设是10.10.32.0/21,在该VPC下面我们创建两个子网,子网的网段分别是10.10.33.0/24和10.10.32.0/24,如下图:
其中10.10.32.0/24是public子网(子网的路由表中有一条规则是发往0.0.0.0/0的数据包需要通过互联网网关路由),如下图:
10.10.33.0/24是private子网,关于private子网我们前往0.0.0.0/0(公网),通常会通过NAT网关出去,如下图:
准备安全组
这里需要根据公司自身的网络环境进行设置。
创建集群
2. 配置网络环境,vpc、子网、安全组选择我们上面的步骤创建的,集群端点访问选择公有和私有,如果集群端点访问你选择了包含公网的暴露方式,请指定一下CIDR块,这里相当于公网的IP白名单(假设你想让108.13.5.59的公网地址访问你的集群,这里就配置108.13.5.59/32)。
3. 配置控制面板日志,这里我选择全部关闭,这个地方开启会产生额外的CloudWatch费用,大家可以在找错的时候开启,平时保持关闭,当然如果公司自身对费用管控比较宽松的话你也可以一直开着,这个根据公司自身的钞能力来定。
4. 选择插件,安装必需的默认的3个插件就可以
5. 配置插件,这里主要用来选择插件的版本,保持默认就可以
6. 最后下一步确认信息创建就可以,最后我们可以在EKS的控制台上看到我们创建的集群
这里我们在VPC的集群里准备一台机器,然后通过kubectl来连接管理集群,等一些基础配置好了以后,我们可能会更多时候通过KubeSphere进行图形化的管理。
准备EC2的role
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "ec2.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
aws iam create-role \
--role-name test-eks-manage-role \
--assume-role-policy-document file://"ec2-trust-policy.json"
2. 创建一个自定义策略,该策略主要用来定义我们可以访问的EKS资源,这里假设策略名称test-env-eks-manager-server-policy
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"eks:DescribeAddonConfiguration",
"eks:ListClusters",
"eks:DescribeAddonVersions",
"eks:RegisterCluster",
"eks:CreateCluster"
],
"Resource": "*"
},
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": "eks:*",
"Resource": "arn:aws:eks:ap-southeast-x:xxxxxx:cluster/test-eks"
}
]
}
3. 将该策略添加到role上
aws iam attach-role-policy \
--policy-arn arn:aws:iam::xxxx:policy/test-env-eks-manager-server-policy \
--role-name test-eks-manage-role
创建EC2
EC2在创建的时候一定要绑定test-eks-manage-role角色,我这里选择操作系统是ubuntu。
安装aws cli
aws-cli安装一定要符合版本要求的,可以去aws官网查询指定版本进行安装,我这里安装的是2.11.24,如下图:
自动创建kubeconfig文件
aws eks update-kubeconfig --region ap-southeast-3--name test-eks
通过上述命令在我们用户目录下会生成一个.kube文件夹,.kube文件夹下会自动生成一个config文件,如下图:
config文件的内容格式示例如下:
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: xxxxxx
server: https://xxxxxx.xx.ap-southeast-3.eks.amazonaws.com
name: arn:aws:eks:ap-southeast-3:xxxxx:cluster/test-eks
contexts:
- context:
cluster: arn:aws:eks:ap-southeast-3:xxxx:cluster/test-eks
user: arn:aws:eks:ap-southeast-3:xxxx:cluster/test-eks
name: arn:aws:eks:ap-southeast-3:xxxx:cluster/test-eks
current-context: arn:aws:eks:ap-southeast-3:xxxxxx:cluster/test-eks
kind: Config
preferences: {}
users:
- name: arn:aws:eks:ap-southeast-3:xxxxxx:cluster/test-eks
user:
exec:
apiVersion: client.authentication.k8s.io/v1beta1
args:
- --region
- ap-southeast-3
- eks
- get-token
- --cluster-name
- test-eks
- --output
- json
command: aws
测试连接集群
kubectl get svc
如果上述命令可以显示下图内容,表明集群连接成功。
数据平面的创建我们采用节点组的形式进行创建,不使用Fargate。
准备节点Role
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "ec2.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
aws iam create-role \
--role-name AmazonEKSNodeRole \
--assume-role-policy-document file://"ec2-trust-policy.j
2. 将IAM Policy附加到Role上
aws iam attach-role-policy \
--policy-arn arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly \
--role-name AmazonEKSNodeRole
aws iam attach-role-policy \
--policy-arn arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy \
--role-name AmazonEKSNodeRole
aws iam attach-role-policy \
--policy-arn arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy \
--role-name arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy
准备节点组需要的启动模板
2. 选择操作系统,操作系统这里注意要选择Amazon Linux AMI的镜像,具体的镜像id(ami-id)可以去官网搜索,我这里是ami-075b5ec6b13e12bc3,如下图:
3. 指定实例类型,这里可以指定也可以不指定,如果不指定,则在需要节点组创建的时候进行指定,这里我们假设指定t3.xlarge,如下图:
4. 指定密钥对,这里推荐指定,如果没有指定将无法登录数据平面节点,如下图:
5. 指定网络设置,这里主要用来指定子网和安全组,子网我们可以不设置,安全组在设置的时候一定要选择集群在的vpc的安全组
6. 指定存储,我这里卷类型指定为gp3,大小给50GB,如下图:
7. 填写高级信息,这边我们主要做两件事,一件是绑定role,另一个是填写用户数据,如下图:
上图中我们绑定了前面创建的role,用户数据我们需要填写以下内容(其中test-eks需要替换成你实际的集群名称):
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="==MYBOUNDARY=="
--==MYBOUNDARY==
Content-Type: text/x-shellscript; charset="us-ascii"
#!/bin/bash
echo "Running custom user data script"
/etc/eks/bootstrap.sh test-eks
--==MYBOUNDARY==--
配置权限
这里我们需要通过之前建立的连接集群的机器,去配置AmazonEKSNodeRole能够和我们的集群交互,这样我们的数据节点才能正常的和我们的控制平面进行交互。
# 如果没有config map可以先进行创建
kubectl edit configmap -n kube-system aws-auth
最终的yaml内容格式如下:
apiVersion: v1
data:
mapRoles: |
- groups:
- system:masters
rolearn: arn:aws:iam::xxxx:role/test-eks-manage-role
username: arn:aws:eks:ap-southeast-3:xxxxxx:cluster/test-eks
- groups:
- system:bootstrappers
- system:nodes
rolearn: arn:aws:iam::xxxxx:role/AmazonEKSNodeRole
username: system:node:{{EC2PrivateDNSName}}
kind: ConfigMap
metadata:
creationTimestamp: "2023-06-01T08:02:15Z"
name: aws-auth
namespace: kube-system
resourceVersion: "3695478"
uid: d045dab1-53e6-4847-8730-51382cace102
创建节点组
2. 节点组配置,这里主要指定节点组里面节点的数量大小,实例类型等参数,如下图:
通过上图可以看到我们的模板中已经指定好了AMI、磁盘、实例类型,这里所以是灰色的无法选择。
3. 指定网络配置,无特殊情况下建议选择私有子网,公有子网这里在后续部署ingress nginx controller的时候会使用,后续这个我会讲到,这里不再详细介绍防止打断集群建立的思路,如下图:
4. 最后一步就是确认信息进行创建了,创建成功以后我们可以eks的计算下面看到我们新建的节点组和节点如下图:
至此整个集群就搭建完成了,数据节点和工作节点全部配置完成,后续就是我们实际的一些工作了,比如部署Deployment、如何对接Jenkins实现简易版的CI/CD(如果公司有充足的研发人力,强力建议自研系统,Jenkins只负责用来调度,灵活性更强,也能屏蔽掉Jenkins,更加方便的对接公司的单点登录用户体系),如何部署ingress controller对外暴露服务等细节,这个后续我会继续介绍。