创建 AWS EKS 集群_服务器




下周十一放假休息,停更一期

长文多图预警

简介


我们在《Kubernetes 基础 理论》中提到过 AWS EKS,EKS 是 Kubernetes 在 AWS 的具体实现。

本文先介绍 AWS EKS 相关概念,然后实战测试如何利用 AWS 图形界面创建 EKS。

目录

- 环境(配置)

- AWS EKS 概念

  1. EKS 简介

  2. EKS control plane 架构

  3. 使用 EKS 的一般步骤

  4. 收费

  5. 自建 K8s

- 实战步骤

  1. 创建 Role

     - 创建 EKS Cluster Role

     - 创建 EKS Node Role

  2. 创建 EKS 集群

  3. 添加 node

     - 创建 Key pair(选做)

     - 创建 Node group

     - 登录 node

  4. 配置 kubectl

     - 下载 kubectl

     - 利用 AWS CLI 配置 kubectl

  5. 检查 EKS

- 总结

- 资源下载

- 后记


环境(配置)



  • AWS 中国或 Global 帐号,可在官网申请,一年内使用指定资源免费
  • Win10 + WSL
  • AWS CLI
  • Kubectl

AWS EKS 概念


1. EKS 简介

Amazon Elastic Kubernetes Service(Amazon EKS)是 AWS 提供的 Kubernetes(K8s)服务,

可以让我们方便地在 AWS 或者 on-premises 环境(可以理解为自己的服务器)中运行 K8s 应用。

AWS EKS 主要特点如下


  • EKS 负责安装,维护 Kubernetes control plane 及工作 node,无需用户自行操作
  • EKS 在多 AZ( Availability Zones)中运行 K8s,增强可用性
  • 根据负载情况,自动扩展 control plane instances(即 control plane 的节点),探测并替换失败 control plane instances,并提供自动版本升级及打补本操作
  • 与 AWS 其它服务紧密集成,提供更好的扩展和使用特性
  • 及时更新 K8s 版本,可以利用社区中各种工具及插件,与 K8s 完全兼容,可以方便地进行 K8s 应用的迁移

我们在《代理环境下在 WSL2 中用 Kind 创建 Kubernetes 集群》中展示过如何用 Kind 创建 K8s,一条命令搞定,非常简单。

但 Kind 创建的 K8s 一般只是用来测试或者开发,并不合适生产环境。

生产上自己搭建 K8s 集群,一般会用 kubeadm,但用 kubeadm 创建 K8s 还是挺麻烦的,并且非常容易报错。

如果利用 AWS EKS 服务来帮我们创建,维护 K8s,则可以大大减轻这些负担。

在之前的文章中,我们说了 K8s 本身更像是一个框架而不是一个产品,所以它需要借助其它第三方服务或者软件来实现一些功能。

利用 EKS 与 AWS 其它服务紧密结合的特点,我们就可以直接利用 AWS 现成的服务来实现 K8s 需要的额外功能,

比如,用 Load Balancer 进行负载均衡,用 ECR 保存镜像,利用 IAM 控制用户权限等等。

当然,使用了 AWS 的服务就相当于和 AWS 深度绑定了。但这也是惯例,所有云服务商上的 k8s 都会和自身的服务相绑定。

2. EKS control plane 架构

EKS control plane 的组件与一般 K8s 相同,这里只是列出 EKS 本身的特点。

AWS EKS 为每个集群单独运行一个 control plane 且不能在 AWS Account 之间共享。

每个 control plane,在一个 Region 内会占用三个 AZ(Availability Zones),并至少由两个 Apiserver 服务器实例,三个 etcd 实例组成。

EKS 利用 VPC 网络 polies 来控制同一个集群内部,不同 control plane 组件(component)之间的流量。

在没有经过 K8s RBAC 授权的情况下,一个 EKS 集群的 control plane 不能和其它 EKS 集群通信,以保证彼此隔绝。

3. 使用 EKS 的一般步骤

创建 AWS EKS 集群_docker_02


  1. 利用 AWS 中控台,CLI 或者 SDK 创建 EKS 集群
  2. 启动 AWS 代管理的,或者自己管理的 EC2 做为工作 node 加入 EKS 集群。除了利用 EC2,我们还可以把 workload 运行在 AWS Fargate 中(中国区暂时还不支持这个功能)
  3. 当 EKS 集群建好后,我们可以配置自己习惯的工具,比如 kubectl 来连接 EKS
  4. 用部署 K8s 应用的一般方法向 EKS 上部署应用

4. 收费

一个 EKS 集群由一个 control plane 和 EC2 或者 Fargate 组成的计算资源构成。

control plane 的费用应不同地区而不同,中国区是每个 EKS 集群 0.688CNY/小时。

EC2 或者 Fargate 组成的计算资源的费用,按 EC2 和 Fargate 各自的标准分别计算。

可以看到 EKS 的集群既使没有工作节点时也是按小时收费的。

这与 Fargate 不同,Fargate 在建了集群但没有运行 task 的情况下是不收费的。

5. 自建 K8s

如果想自己搭建 K8s,还可以利用 AWS EKS Distro。

AWS EKS Distro 包含了 EKS 部署 K8s 时用到的 K8s 软件以及相关依赖,利用 EKS Distro 用户可以创建自己的 K8s 集群。EKS Distro 的源码可以在 GitHub 上下载。

实战步骤


1. 创建 Role

创建 EKS Cluster Role

在 AWS 中控台,选择“IAM”,进入 IAM 界面,选择左边的“Roles”,然后在右边点击“Create role”创建 AWS EKS 集群_desktop_03

进入 Select type of trusted entity 页面,依次选择“Amazon Web Services service”, “EKS”,“EKS - Cluster”后,点击“Next:Permissions”创建 AWS EKS 集群_docker_04

在添加 permission policy 页面,“AmazonEKSClusterPolicy”已经自动添加,所以可以直接点击“Next:Tags”创建 AWS EKS 集群_desktop_05

我们可以添加 Tag 也可以不添加,直接点击“Next:Review”创建 AWS EKS 集群_docker_06

添加 Role 名称“tseksClusterRole”后,点击“Create role”创建 AWS EKS 集群_desktop_07

创建完成创建 AWS EKS 集群_服务器_08说明:此 policy 为 EKS 集群,提供运行必要的权限,比如操作 EC2,自动扩展等等

创建 EKS Node Role

方法与创建 Cluser Role 相同,这里只列出不同的地方

在 Select type of trusted entity 页面,依次选择“Amazon Web Services service”, “EC2”,然后点击“Next:Permissions”创建 AWS EKS 集群_desktop_09

在添加 permission policy 页面中,依次搜索勾选以下三个 policy,然后点击“Next:Tags”


  • AmazonEC2ContainerRegistryReadOnly
  • AmazonEKSWorkerNodePolicy
  • AmazonEKS_CNI_Policy

说明:“AmazonEKS_CNI_Policy” 这个 policy 是必要的,但 AWS 官网推荐把这个 policy 加到与 K8s service account 相关联的 Role 里,我们这里简便起见,直接加到 node role 里

最后,建好的 EKS Node Role “tsEKSnoderole”如下创建 AWS EKS 集群_服务器_10

提示:利用 IAM 创建 Role 等权限管理相关内容请参考《一文搞懂 AWS IAM 权限 基础篇上 理论》和《一文搞懂 AWS IAM 权限 基础篇下 实战》

2. 创建 EKS 集群

在 AWS 中控台,选择“EKS”,进入 EKS 界面,点击左边“Amazon EKS”下的“Clusters”,然后在右边点击“Create cluster”创建 AWS EKS 集群_服务器_11

添写 EKS 集群信息,然后点击“Next”


  • EKS 集群名称“tsEKS”
  • 选择 Kubernetes 版本,现在默认是 1.21
  • 选择我们在上一步中创建的 Role “tseksClusterRole”创建 AWS EKS 集群_docker_12

进入 network 配置页,为测试简便,我们选了 Default VPC 和两个公共 Subnet,Cluster endpoint access 中选了 Public,其它的保持默认就可以,点击“Next”创建 AWS EKS 集群_服务器_13

在配置 Log 页面,可以默认也可以打开需要保存的日志,点击“Next”创建 AWS EKS 集群_desktop_14

在 Review 页,点击“Create”,开始创建 EKS创建 AWS EKS 集群_docker_15

这个创建时间比较长,大概 10 几分钟创建 AWS EKS 集群_服务器_16

创建完成创建 AWS EKS 集群_docker_17

EKS 集群创建好之后,本身并没有工作 Node,下一步我们添加 Node。

3. 添加 node

创建 Key pair(选做)

在 node 中配置了 Key Pair 就可以直接登录 node。如果已经有 Key Pair 的话,可以跳过创建 Key pair 这一步。

在 AWS 中控台选择“EC2”,进入 EC2 界面,点击左边的“Key Pairs”,在右边点击“Create key pair”创建 AWS EKS 集群_docker_18

添加 Key Pair 名称“tstest”,“Private key file format”这里选择“.pem”(我用 ssh 访问 EC2,所以选择 pem,也可以选择 ppk 格式),点击“Create key pair”创建 AWS EKS 集群_desktop_19

创建完成创建 AWS EKS 集群_服务器_20

这时浏览器会自动下载 key pair,这个要保存好创建 AWS EKS 集群_服务器_21

下面我们添加 node

创建 Node group

选择“Compute”,点击“Add Node Group”创建 AWS EKS 集群_desktop_22

在 Configure Node Group 页面添加下列信息,然后点击“Next”


  • name “tsEKSNodegrp”
  • Node IAM Role:选择上面我们建的 Node role “tsEKSnoderole”创建 AWS EKS 集群_服务器_23

在“compute and scaling configuration”这页,我们选默认的即可,点击“Next”创建 AWS EKS 集群_desktop_24说明:Instance types 不要选太小的 EC2,之前我选了 t3.micro 的,结果部署应用时总失败,换了大一点的 EC2 就好了

在网络页面,选择两个 subnet,我们方便测试直接选了两个 public subnet(生产都会用 private subnet),然后打开“Configure SSH access to nodes”的开关创建 AWS EKS 集群_docker_25

这时会弹出关于网络连接的安全告警,直接点击“Enable”创建 AWS EKS 集群_docker_26

在“SSH key pair”中选择已经存在的,或者我们上面新建的 key pair “tstest”,“Allow SSH remote access from”中选择“All”,点击“Next”创建 AWS EKS 集群_docker_27说明:为了测试简便,我们在“Allow SSH remote access from”中选择“All”,生产中需要选择第一项“Selected security groups”,并配置合适的 SG

在“Review and create”页面,拉到最下面,点击“Create”创建 AWS EKS 集群_desktop_28

Node 创建中创建 AWS EKS 集群_服务器_29

Node 创建好了创建 AWS EKS 集群_docker_30

可以在 EC 界面,看到两个新启动的 instances创建 AWS EKS 集群_服务器_31

tsEKS 集群的 Compute 项里,可以看到 Node Groups 正常运行了创建 AWS EKS 集群_docker_32

登录 node

下面我们登到 node 上,简单观察一下

在 EC 界面,选择一个 EKS 中的 EC2,然后点击“Connect”创建 AWS EKS 集群_desktop_33

在“Connect to instance”页面,可以看到连接信息创建 AWS EKS 集群_docker_34

找一个可以连接 internet 的 linux 环境,把 tstest.pem 复杂过来,然后运行以下命令,注意把 root 用户换成 ec2-user

chmod 400 tstest.pem
ssh -i "tstest.pem" ec2-user@ec2-52-81-239-4.cn-north-1.compute.amazonaws.com.cn

登录到 EC2 上了创建 AWS EKS 集群_服务器_35

运行以下命令,可以看到 kubelet 已经装好,做为 service 在运行了

#切换到root帐号
sudo su
systemctl status kubelet.service

创建 AWS EKS 集群_服务器_36

查看 docker 运行的容器

docker ps

可以看到和 kind 中相似的 K8s 容器,以及为 AWS 服务器的定制容器创建 AWS EKS 集群_desktop_37说明:


  • 与 kind 不同这里没有 apiserver 的容器,因为 EKS 的 control plane 不在 node 上
  • kubectl 是客户端工具,所以在 node 上默认没有安装 kubectl

到这里 EKS 集群就建好了

4. 配置 kubectl

下载 kubectl

我们在本地需要先下载 kubectl 工具,依次运行以下命令下载 kubectl 工具

#下载kubectl
wget --no-check-certificate https://amazon-eks.s3.us-west-2.amazonaws.com/1.19.6/2021-01-05/bin/linux/amd64/kubectl
#增加执行权限
chmod +x ./kubectl
#复制到bin目录
cp ./kubectl /usr/local/bin/kubectl

运行结果创建 AWS EKS 集群_desktop_38创建 AWS EKS 集群_desktop_39

注意:

我们之前用 Kind + Docker desktop 连接 K8s 时,并没有专门下载 kubectl,那是因为 Docker desktop 启动后会自动在 WSL2 中加上 kubectl 的链接。

从下图可以看到 kubectl 是一个到 windows 系统上的链接创建 AWS EKS 集群_docker_40

现在我们准备连接 AWS EKS,不需要启动 Docker desktop,这样 WSL 中就没有 kubectl 命令了,所以需要单独下载 kubectl。

利用 AWS CLI 配置 kubectl

下面我们用 AWS CLi 配置 kubectl

运行以下命令更新~/.kube/config 文件

#先测试AWS CLi配置运行正常
aws sts get-caller-identity
#更新config文件
aws eks --region cn-north-1 update-kubeconfig --name tsEKS

运行结果

创建 AWS EKS 集群_docker_41创建 AWS EKS 集群_desktop_42说明:--name 后面加上面创建 KKS 的名称

注意:

如果出现以下错误,则说明当前 AWS CLi 版本太低,需要安装新版本

Unable to connect to the server: getting credentials: exec: executable aws-iam-authenticator not found

It looks like you are trying to use a client-go credential plugin that is not installed.

如果运行 AWS CLi 时,出现以下报错,请参考《AWS CLI SSL: CERTIFICATE_VERIFY_FAILED 错误分析与解决》

SSL validation failed for https://sts.cn-north-1.amazonaws.com.cn/ [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1056)

运行以下命令连接 AWS EKS

#查看node
kubectl get nodes
#查看kube-system内的pods
kubectl get pods -n kube-system

现在可以查看到 EKS 中的 nodes创建 AWS EKS 集群_docker_43

查看 kube-system 内的 pods创建 AWS EKS 集群_服务器_44对比,用 Kind 创建的 K8s 的 kube-system 内 pods创建 AWS EKS 集群_desktop_45说明:可以看到 EKS 的 kube-system 中并没有 apiserver,scheduler 这些 pods,说明在 EKS 中,这些组件并不是以 pods 形式在 kube-system 中运行的

现在,我们可以像用 kind K8s 一样,像 EKS 了部署应用了。

5. 检查 EKS

最后,我们检查一下 EKS 及本地 kubectl 配置的一些细节

在 EKS 页面,点击“Details”选项卡,注意“API server endpoint”和“Certificate authority”两项创建 AWS EKS 集群_docker_46

在本地 WSL 中,打开~/.kube/config 文件

在 context 中,我们可以找到我们刚刚通过 AWS CLi 命令加进来的 context创建 AWS EKS 集群_服务器_47

在上面 context 中对应的 cluster 里,server 中的地址就是 EKS 页面里的“API server endpoint”的地址,certificate-authority-data 中的内容就是 Certificate authority 的内容创建 AWS EKS 集群_服务器_48

在上面 context 中对应的 user 部分里,可以看到用户是利用 AWS CLI 获得 Token 进行登录 EKS(Apiserver)的授权创建 AWS EKS 集群_desktop_49

如果我们运行下列命令

aws eks get-token --cluster-name tsEKS --region cn-north-1

可以直接得到 token创建 AWS EKS 集群_服务器_50

然后用这个 token 也可以访问 EKS创建 AWS EKS 集群_docker_51

在 EKS 页面,点击“Networking”选项卡,这里可以看到 apiserver 是 public,所有人都可以向 apiserver 发送请求。如果需控制访问源,点击“Manage networking”创建 AWS EKS 集群_desktop_52

点开“Advance Settings”,在这里可以控制访问 Apiserver 的 IP 段创建 AWS EKS 集群_服务器_53

总结


创建和使用 EKS 集群,主要是以下几步


  1. 创建 EKS Role 和 Node Role,分别为 EKS control-plane 后面的 instance(这些 instances 在 EC2 界面不可见)和工作 Node(在 EC2 界面可见)提供必要的权限
  2. 用 AWS 中控台或 AWS CLi 创建 EKS 集群
  3. 向 EKS 集群中添加 Node group,即增加具体的工作节点(EC2)
  4. 在本地利用 AWS CLI 配置 kubectl 工具

后记


在前面花大力气讲了 Docker 和 K8s,现在终于可以进入主题了。通过阅读前面的文章,搞懂了 K8s 的基本原理,现在再使用 EKS 就简单多了。

当然,我们还需要学习一下如何把 AWS 现有服务集成到 EKS 中使用,在后续的文章中,会把这些内容也加进来。

最后,祝大家十一放假玩的开心~~~


喜欢请点赞,禁止转载,转发请标明出处

关注 B 站 UP 主“我是手拉面” 观看更多视频

微信公众号“全是 AWS 干货”


创建 AWS EKS 集群_desktop_54