阿里云ECS搭建高可用k8s集群及Terway、CCM、SLB配置
简介
在阿里云 ECS 上自建k8s时,除自行配置Nginx对外提供服务外,还可以使用阿里云官方的CNI插件Terway以及CCM 使用SLB对外提供服务,本文主要介绍该方式
约定
最小服务器要求
节点名 | 内网IP | 配置 | 系统 | 备注 |
---|---|---|---|---|
k8s-01 | 192.168.1.27 | 4C8G | CentOS 7.X | control plane、ETCD |
k8s-02 | 192.168.1.28 | 4C8G | CentOS 7.X | control plane、ETCD |
k8s-03 | 192.168.1.29 | 4C8G | CentOS 7.X | control plane、ETCD |
k8s-04 | 192.168.1.30 | 4C16G | CentOS 7.X | Node |
k8s-05 | 192.168.1.31 | 4C16G | CentOS 7.X | Node |
-
control plane 和 ETCD 为保证高可用,建议数量为>=3的奇数
-
阿里云 CCM 任何时候均不会把Master节点作为SLB后端
版本约定
目前github上 terway 的deployment文件仅支持 k8s 1.22以下的版本,我们使用1.21的最后一个版本:1.21.13
开始安装
IPVS
|
|
输出以下信息,表示安装成功
Haproxy
因阿里云SLB不支持服务器同时作为客户端和服务商,故我们使用Haproxy 和 Nginx,来进行master节点的负载均衡。因Nginx可能还会被用途web服务器中间件,会涉及到重启影响负载效果,在这里我们以Haproxy为例
|
|
ETCD
安装
使用以下Shell脚本进行安装最新的ETCD版本
|
|
生成证书
需要建立证书配置文件:etcd-root-ca-csr.json、etcd-csr.json、etcd-gencert.json,具体为:
|
|
生成证书
|
|
复制证书到 ssl 目录
|
|
配置文件
三台ETCD节点,都需要根据实际情况配置
|
|
常用命令
|
|
Docker
镜像源
大陆以外地区推荐直接使用官方源
国内服务器建议使用阿里云镜像源:https://developer.aliyun.com/mirror/docker-ce
|
|
安装和配置
为配合 k8s 1.21.13,安装docker版本 20.10.14,安装命令如下:
|
|
Kubernetes
Pod Switch
terway依赖于阿里云的交换机,需要在阿里云控制台创建一个ECS可用区的交换机作为Pod子网,
本文以 192.168.32.0/19 例
若使用 kube-flannel 作为集群CNI 插件则不需要该配置
镜像源
大陆以外地区推荐直接使用官方源
国内同样推荐使用阿里云镜像源:https://developer.aliyun.com/mirror/kubernetes
ECS可以直接使用阿里内网镜像源
|
|
组件安装
|
|
根据ccm要求修改 kubelet服务启动参数
|
|
hostname-override 和 provider-id 的值需要在对应的ECS上执行下面的命令获取:
echo curl -s http://100.100.100.200/latest/meta-data/region-id
.curl -s http://100.100.100.200/latest/meta-data/instance-id
修改完成后需要重载 systemd 并添加开机启动
|
|
k8s安装
kubeadm 配置
以下是kubeadm.yaml文件示例
|
|
请仔细查看 kubeadm.yml的配置及相关注释
安全组
为保证内网互通,需要到阿里云安全组中允许 kubeadm.yaml中的几个网段互通
安装 Control Plane
|
|
正常情况下,命令执行完成后会打印类似信息
|
|
配置 kubectl
可使用以下脚本配置 kubectl命令
|
|
检查集群状态
|
|
卸载集群
当集群或节点安装失败时,我们可以卸载后重新安装
|
|
安装CNI
阿里云有关 Terway和Flannel的选择和对比,可以看阿里云官方文档:Kubernetes集群网络规划
Terway
建议先阅读
-
官方文档:使用Terway网络插件
-
Github 文档:Terway 网络插件
Terway有两种安装模式:
-
VPC模式
- VPC模式,使用Aliyun VPC路由来打通网络,可以使用独立ENI给Pod,安装方式: 修改terway.yml文件中的eni.conf的配置中的授权和网段配置,以及Network的网段配置,然后通过
kubectl apply -f terway.yml
来安装terway插件。
- VPC模式,使用Aliyun VPC路由来打通网络,可以使用独立ENI给Pod,安装方式: 修改terway.yml文件中的eni.conf的配置中的授权和网段配置,以及Network的网段配置,然后通过
-
ENI多IP模式
-
ENI多IP模式,使用Aliyun ENI的辅助IP来打通网络,不受VPC的路由条目限制,安装方式: 修改terway-multiip.yml文件中的eni.conf的配置中的授权和资源配置,然后通过
kubectl apply -f terway-multiip.yml
来安装terway插件。
-
因为Terway会自动创建弹性网卡,所以它需要相关权限
在阿里控制台创建子用户并添加相关的权限,如下:
|
|
我们使用 terway的 ENI多IP模式
|
|
注意修改 terway配置中的镜像版本,建议使用最新的Release
|
|
flannel
flannel使用 ali-vpc模式时,同样需要创建子用户和授予相应的权限(AliyunVPCFullAccess),如下图:
配置文件如下:
|
|
配置修改
-
Network字段 需要与kubeadm.yaml的podSubnet 保持一致
-
修改ACCESS_KEY_ID和ACCESS_KEY_SECRET实际的值
添加 control plane
Kubeadm 安装完成后,会显示如何加入其它 Control Plane,但是如果我们直接使用上面的命令是会报错的,需要添加 apiserver相关信息
|
|
添加Node
启动node节点相对就比较简单了,只需要加一个防止 swap 开启拒绝启动的参数就行
|
|
允许Master运行Pod
默认情况下,control plane 不会参与Pod 调度,可在任意control plane节点上运行以下命令,让其参与调度
|
|
安装CCM插件
简介
Cloud Controller Manager提供Kubernetes与阿里云基础产品的对接能力,例如CLB(原SLB)、VPC等。CCM主要提供以下功能:
- 管理负载均衡
当Service的类型设置为Type=LoadBalancer时,CCM组件会为该Service创建或配置阿里云负载均衡CLB,包括含CLB、监听、后端服务器组等资源。当Service对应的后端Endpoint或者集群节点发生变化时,CCM会自动更新CLB的后端虚拟服务器组。
- 实现跨节点通信
当集群网络组件为Flannel时,CCM组件负责打通容器与节点间网络,实现容器跨节点通信。CCM会将节点的Pod网段信息写入VPC的路由表中,从而实现跨节点的容器通信。该功能无需配置,安装即可使用。
注意:任何情况下CCM都不会将Master节点作为SLB的后端。
创建子用户
CCM组件涉及到阿里云的云服务管理,同样需要创建子用户和授予相应的权限
|
|
配置kubelet和Node
在组件安装部分,我们已经提前为每台节点上的 kubelet 配置了启动参数,除此之外,我们还需要通过 patch的方式修改node的参数,命令如下:
|
|
创建 configMap
使用以下脚本创建 ccm 的 config
|
|
安装CCM
建议使用 github上的 cloud-controller-manager.yml,进行安装
|
|
检查CCM
我们可以通过查看Pod状态来检查CCM是否安装成功
|
|
扩展阅读
Master作为SLB后端
在阿里云文档的注意事项中有提到:任何情况下CCM都不会将Master节点作为SLB的后端。
可能是基于性能考虑,如果实在要将Master作为SLB后端,我们可以直接修改源码
在github Issues 中有人提到源码是如何过滤master节点,在尊重源码的情况下,我通过给master新增label的方式达到目的,参考代码
安装 ingress
Ingress-controller
|
|
SLB With Ingress
在安装 ingress-controoler时,我们并没有接入SLB,在此处单独配置
|
|
关于SLB 更多参数说明请查看阿里官方文档
鸣谢
感谢以下项目或文档给予我启发