前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于AWS EKS的K8S实践 - 集群搭建

基于AWS EKS的K8S实践 - 集群搭建

作者头像
shysh95
发布2023-08-23 10:05:03
3600
发布2023-08-23 10:05:03
举报
文章被收录于专栏:shysh95shysh95

基于AWS EKS的K8S实践系列文章是基于企业级的实战文章,一些设置信息需要根据公司自身的网络等要求进行设置,如果大家有问题讨论或咨询可以后台私信我或者加入知识星球问我,知识星球的加入方式在文章末尾。

EKS集群搭建

通过EKS创建的集群,EKS本身会为我们保证控制平面的高可用。

集群角色准备

  1. 将以下内容复制到名为 cluster-trust-policy.json 的文件中
代码语言:javascript
复制
{
 
"Version": "2012-10-17",
 
"Statement": [
 
{
 
"Effect": "Allow",
 
"Principal": {
 
"Service": "eks.amazonaws.com"
 
},
 
"Action": "sts:AssumeRole"
 
}
 
]
 
}
 

2. 创建角色,这里假设角色名称是eks-cluster-role

代码语言:javascript
复制
aws iam create-role \
 
--role-name eks-cluster-role \
 
--assume-role-policy-document file://"cluster-trust-policy.json"
 

3. 将所需的 IAM policy 附加到角色

代码语言:javascript
复制
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网关出去,如下图:

准备安全组

这里需要根据公司自身的网络环境进行设置。

创建集群

  1. 配置集群,主要用来指定集群的名称和集群服务角色

2. 配置网络环境,vpc、子网、安全组选择我们上面的步骤创建的,集群端点访问选择公有和私有,如果集群端点访问你选择了包含公网的暴露方式,请指定一下CIDR块,这里相当于公网的IP白名单(假设你想让108.13.5.59的公网地址访问你的集群,这里就配置108.13.5.59/32)。

3. 配置控制面板日志,这里我选择全部关闭,这个地方开启会产生额外的CloudWatch费用,大家可以在找错的时候开启,平时保持关闭,当然如果公司自身对费用管控比较宽松的话你也可以一直开着,这个根据公司自身的钞能力来定。

4. 选择插件,安装必需的默认的3个插件就可以

5. 配置插件,这里主要用来选择插件的版本,保持默认就可以

6. 最后下一步确认信息创建就可以,最后我们可以在EKS的控制台上看到我们创建的集群

EKS集群连接

这里我们在VPC的集群里准备一台机器,然后通过kubectl来连接管理集群,等一些基础配置好了以后,我们可能会更多时候通过KubeSphere进行图形化的管理。

准备EC2的role

  1. 将以下内容复制到名为 ec2-trust-policy.json 的文件中,并创建角色test-eks-manage-role
代码语言:javascript
复制
{
 
"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

代码语言:javascript
复制
{
 
"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上

代码语言:javascript
复制
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文件

代码语言:javascript
复制
aws eks update-kubeconfig --region ap-southeast-3--name test-eks
 

通过上述命令在我们用户目录下会生成一个.kube文件夹,.kube文件夹下会自动生成一个config文件,如下图:

config文件的内容格式示例如下:

代码语言:javascript
复制
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
 

测试连接集群

代码语言:javascript
复制
kubectl get svc
 

如果上述命令可以显示下图内容,表明集群连接成功。

创建数据平面(工作节点)

数据平面的创建我们采用节点组的形式进行创建,不使用Fargate。

准备节点Role

  1. 将以下内容复制到名为 ec2-trust-policy.json 的文件中,并创建角色AmazonEKSNodeRole
代码语言:javascript
复制
{
 
"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上

代码语言:javascript
复制
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
 

准备节点组需要的启动模板

  1. 指定启动模板名称,test-eks-node-template,如下图:

2. 选择操作系统,操作系统这里注意要选择Amazon Linux AMI的镜像,具体的镜像id(ami-id)可以去官网搜索,我这里是ami-075b5ec6b13e12bc3,如下图:

3. 指定实例类型,这里可以指定也可以不指定,如果不指定,则在需要节点组创建的时候进行指定,这里我们假设指定t3.xlarge,如下图:

4. 指定密钥对,这里推荐指定,如果没有指定将无法登录数据平面节点,如下图:

5. 指定网络设置,这里主要用来指定子网和安全组,子网我们可以不设置,安全组在设置的时候一定要选择集群在的vpc的安全组

6. 指定存储,我这里卷类型指定为gp3,大小给50GB,如下图:

7. 填写高级信息,这边我们主要做两件事,一件是绑定role,另一个是填写用户数据,如下图:

上图中我们绑定了前面创建的role,用户数据我们需要填写以下内容(其中test-eks需要替换成你实际的集群名称):

代码语言:javascript
复制
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能够和我们的集群交互,这样我们的数据节点才能正常的和我们的控制平面进行交互。

代码语言:javascript
复制
# 如果没有config map可以先进行创建
 


 
kubectl edit configmap -n kube-system aws-auth
 

最终的yaml内容格式如下:

代码语言:javascript
复制
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
 

创建节点组

  1. 配置节点组,这里主要指定节点组的名称,IAM的角色,然后指定启动模板,如下图:

2. 节点组配置,这里主要指定节点组里面节点的数量大小,实例类型等参数,如下图:

通过上图可以看到我们的模板中已经指定好了AMI、磁盘、实例类型,这里所以是灰色的无法选择。

3. 指定网络配置,无特殊情况下建议选择私有子网,公有子网这里在后续部署ingress nginx controller的时候会使用,后续这个我会讲到,这里不再详细介绍防止打断集群建立的思路,如下图:

4. 最后一步就是确认信息进行创建了,创建成功以后我们可以eks的计算下面看到我们新建的节点组和节点如下图:

至此整个集群就搭建完成了,数据节点和工作节点全部配置完成,后续就是我们实际的一些工作了,比如部署Deployment、如何对接Jenkins实现简易版的CI/CD(如果公司有充足的研发人力,强力建议自研系统,Jenkins只负责用来调度,灵活性更强,也能屏蔽掉Jenkins,更加方便的对接公司的单点登录用户体系),如何部署ingress controller对外暴露服务等细节,这个后续我会继续介绍。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-06-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员修炼笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • EKS集群搭建
  • EKS集群连接
  • 创建数据平面(工作节点)
相关产品与服务
NAT 网关
NAT 网关(NAT Gateway)提供 IP 地址转换服务,为腾讯云内资源提供高性能的 Internet 访问服务。通过 NAT 网关,在腾讯云上的资源可以更安全的访问 Internet,保护私有网络信息不直接暴露公网;您也可以通过 NAT 网关实现海量的公网访问,最大支持1000万以上的并发连接数;NAT 网关还支持 IP 级流量管控,可实时查看流量数据,帮助您快速定位异常流量,排查网络故障。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档