文章目录
- 一、部署背景简介
- 二、部署工具介绍
- 三、部署方案介绍
- 四、部署环境信息
- 五、部署资源下载
- 六、部署准备工作
- 6.1、系统内核升级
- 6.2、设置主机名
- 6.3、环境初始化
- 6.4、ssh多机互信
- 6.5、安装基础包
- 6.6、配置时间同步
- 七、部署操作步骤
- 7.1、上传部署文件
- 7.2、下载解压源码
- 7.3、安装依赖软件
- 7.4、生成inventory配置
- 7.5、个性化配置
- 7.6、修改calico网络模式(可选)
- 7.7、执行一键部署
- 总结:整理不易,如果对你有帮助,可否点赞关注一下?
一、部署背景简介
根据公司业务场景的不同,你可能需要部署几套或几十套K8S高可用集群,面对繁琐的部署步骤,你可能望而却步,急需自动化的K8S部署工具,kubespray就可以很好的解决你的问题。
二、部署工具介绍
说明:使用kubespray-v2.18.1,详情请右键点击打开超链接。
当前kubespray工具版本要求如下:
1、Kubernetes的最低要求版本是v1.20,如果需要部署其它版本K8S,请使用kubespray其它版本。
2、Ansible v2.9.x、Jinja 2.11+ 和 python-netaddr 安装在将运行Ansible命令的机器上,目前实验性支持 Ansible 2.10.x。
3、目标服务器必须能够访问 Internet才能拉取docker镜像,否则,需要额外的配置。
4、目标服务器配置为允许IPv4转发。
5、如果对pod和服务使用IPv6,则目标服务器配置为允许IPv6 转发。
6、防火墙不受管理,您需要像以前那样实施自己的规则。为了避免在部署过程中出现任何问题,您应该禁用防火墙。
7、如果kubespray是从非root用户帐户运行的,则应在目标服务器中配置正确的权限提升方法。然后应指定ansible_become标志或命令参数。–become or -b
三、部署方案介绍
说明:根据国内网络情况及实际部署环境,综合有如下四种部署方案:
方案一:基于docker使用kubespray工具在线部署高可用kubernetes集群(国内互联网环境)
方案二:基于containerd使用kubespray工具在线部署高可用kubernetes集群(国内互联网环境)
方案三:基于docker使用kubespray工具离线部署高可用kubernetes集群(国内专网环境)
方案四:基于containerd使用kubespray工具离线部署高可用kubernetes集群(国内专网环境)
四、部署环境信息
说明:由于服务器资源有限,演示环境共六台服务器,按如下规划进行部署。
IP地址 | 主机名 | 操作系统 | 内核版本 | K8S版本 | 角色 |
192.168.1.11 | k8s-sdjw-ansible-11 | centos7.6.1810 | 5.4.13 | ansible-client | |
192.168.1.12 | k8s-sdjw-test-12 | centos7.6.1810 | 5.4.13 | v1.22.8 | 控制节点 |
192.168.1.19 | k8s-sdjw-test-19 | centos7.6.1810 | 5.4.13 | v1.22.8 | 控制节点 |
192.168.1.20 | k8s-sdjw-test-20 | centos7.6.1810 | 5.4.13 | v1.22.8 | 工作节点 |
192.168.1.21 | k8s-sdjw-test-21 | centos7.6.1810 | 5.4.13 | v1.22.8 | 工作节点 |
192.168.1.22 | k8s-sdjw-test-22 | centos7.6.1810 | 5.4.13 | v1.22.8 | 工作节点 |
五、部署资源下载
说明:当前kubespray-v2.18.1版本默认安装的是K8S版本为v1.22.8,方便大家,特意找了一台能pull镜像及文件的服务器下载好了相关部署安装包及镜像。
基于docker使用kubespray工具部署高可用K8S集群(国内互联网方案一)部署资源包
资源信息如下:
六、部署准备工作
6.1、系统内核升级
说明:当前操作需在 所有主机上执行,执行更新后 必须重启服务器。
如下所示:
6.2、设置主机名
说明:当前操作需在 所有主机上执行,请根据部署环境信息中的主机名 分别对部署主机进行主机名设置。
[root@localhost ~]# hostnamectl set-hostname k8s-sdjw-ansible-11
[root@localhost ~]# hostnamectl set-hostname k8s-sdjw-test-12
[root@localhost ~]# hostnamectl set-hostname k8s-sdjw-test-19
[root@localhost ~]# hostnamectl set-hostname k8s-sdjw-test-20
[root@localhost ~]# hostnamectl set-hostname k8s-sdjw-test-21
[root@localhost ~]# hostnamectl set-hostname k8s-sdjw-test-22
6.3、环境初始化
说明:当前操作需在 所有主机上执行,环境初始化内容包括: 关闭防火墙、关闭selinux、关闭swap、内核参数。 配置完成后需再次重启服务器,内核参数vm.swappiness才生效。
注意事项:如果服务器默认开启dnsmasq服务,请关闭dnsmasq(否则可能导致容器无法解析域名),命令如下:
[root@localhost ~]# service dnsmasq stop && systemctl disable dnsmasq
6.4、ssh多机互信
说明:当前操作只需在 ansible-client主机上执行。
1、使用ssh-keygen工具生成秘钥
2、执行脚本
[root@k8s-sdjw-ansible-11 basic-env]# yum install expect -y
[root@k8s-sdjw-ansible-11 basic-env]# ./ssh_key.sh root 192.168.1.12 123456 /root/.ssh/id_rsa.pub /root/.ssh/id_rsa 22
[root@k8s-sdjw-ansible-11 basic-env]# ./ssh_key.sh root 192.168.1.19 123456 /root/.ssh/id_rsa.pub /root/.ssh/id_rsa 22
[root@k8s-sdjw-ansible-11 basic-env]# ./ssh_key.sh root 192.168.1.20 123456 /root/.ssh/id_rsa.pub /root/.ssh/id_rsa 22
[root@k8s-sdjw-ansible-11 basic-env]# ./ssh_key.sh root 192.168.1.21 123456 /root/.ssh/id_rsa.pub /root/.ssh/id_rsa 22
[root@k8s-sdjw-ansible-11 basic-env]# ./ssh_key.sh root 192.168.1.22 123456 /root/.ssh/id_rsa.pub /root/.ssh/id_rsa 22
如下图所示:
6.5、安装基础包
说明:当前操作需在 所有主机上执行。注意sshpass、expect 、rsync、ntpdate为必须要安装的包。
6.6、配置时间同步
说明:配置时间同步操作需在 所有主机上执行。,如果你有自己的时间同步服务器,可配置为自己的时间服务器地址。
crontab -e
*/2 * * * * /usr/sbin/ntpdate ntp1.aliyun.com &>/dev/null
七、部署操作步骤
7.1、上传部署文件
说明:将提前准备好的镜像及安装文件上传到 服务器集群所有主机,包括ansible-client主机上,如果不修改默认download_cache_dir变量值,则目录路径必须为/tmp/kubespray_cache。,如果你使用的是我提供的资源包,解压后,将kubespray_cache移至/tmp目录下即可。如下所示:
7.2、下载解压源码
说明:我提供的资源包里包含kubespray-2.18.1.zip,也是在github上下载的,你可以自己手动从github下载。
[root@k8s-sdjw-ansible-11 ~]# wget https://github.com/dongchengjueshen110/kubespray/archive/refs/tags/v2.18.1.zip
[root@k8s-sdjw-ansible-11 ~]# unzip v2.18.1.zip
7.3、安装依赖软件
说明:当前操作只需在 ansible-client主机上执行。
[root@k8s-sdjw-ansible-11 kubespray-2.18.1]# yum install python3-pip -y
[root@k8s-sdjw-ansible-11 kubespray-2.18.1]# pip3 install -r requirements.txt
如下图所示:
如下所示,即表示安装成功。
7.4、生成inventory配置
说明:由于kubespray给我们准备了py脚本,可以直接根据环境变量自动生成配置文件,所以我们现在只需要设定好环境变量就可以
1、copy一份demo配置,准备自定义
[root@k8s-sdjw-ansible-11 kubespray-2.18.1]# cp -rpf inventory/sample inventory/mycluster
2、使用真实的hostname,(否则会自动把你的hostname改成node1/node2...这种)
[root@k8s-sdjw-ansible-11 kubespray-2.18.1]# export USE_REAL_HOSTNAME=true
3、指定配置文件位置
[root@k8s-sdjw-ansible-11 kubespray-2.18.1]# export CONFIG_FILE=inventory/mycluster/hosts.yaml
4、定义ip列表(你的服务器内网ip地址列表,3台及以上,前两台默认为master节点)
[root@k8s-sdjw-ansible-11 kubespray-2.18.1]# declare -a IPS=(192.168.1.12 192.168.1.19 192.168.1.20 192.168.1.21 192.168.1.22)
5、生成配置文件
[root@k8s-sdjw-ansible-11 kubespray-2.18.1]# python3 contrib/inventory_builder/inventory.py ${IPS[@]}
操作步骤如下所示:
查看主机名,确认USE_REAL_HOSTNAME=true生效
[root@k8s-sdjw-ansible-11 kubespray-2.18.1]# cat inventory/mycluster/hosts.yaml
如下所示:
7.5、个性化配置
说明:配置文件都生成好了,虽然可以直接用,但并不能完全满足大家的个性化需求,比如用docker还是containerd,docker的工作目录是否用默认的/var/lib/docker等等。
1、默认使用containerd修改为docker
[root@k8s-sdjw-ansible-11 kubespray-2.18.1]# vim inventory/mycluster/group_vars/k8s_cluster/k8s-cluster.yml
container_manager: docker
2、修改docker数据存储目录
[root@k8s-sdjw-ansible-11 kubespray-2.18.1]# vim inventory/mycluster/group_vars/all/docker.yml
docker_daemon_graph: "/data/docker"
3、k8s集群配置(包括设置容器运行时、svc网段、pod网段等)
[root@k8s-sdjw-ansible-11 kubespray-2.18.1]# vim inventory/mycluster/group_vars/k8s_cluster/k8s-cluster.yml
kube_version: v1.22.8
kube_service_addresses: 10.233.0.0/18
kube_pods_subnet: 10.233.64.0/18
4、修改etcd部署类型为host(当前kubespray-v2.18.1版本etcd安装模式默认为host)
[root@k8s-sdjw-ansible-11 kubespray-2.18.1]# vim inventory/mycluster/group_vars/etcd.yml
etcd_deployment_type: host
5、附加组件(可选操作)
[root@k8s-sdjw-ansible-11 kubespray-2.18.1]# vim inventory/mycluster/group_vars/k8s_cluster/addons.yml
# 代理,默认是false
ingress_nginx_enabled: true
# 界面(可选),这里是默认注释的状态,取消注释即可
dashboard_enabled: true
6、修改镜像下载方式
[root@k8s-sdjw-ansible-11 kubespray-2.18.1]# vim roles/download/defaults/main.yml
download_force_cache: true #表示下载镜像源及文件会先从本地缓存目录中下载,即/tmp/kubespray_cache目录
7.6、修改calico网络模式(可选)
说明:calico有两种网络模式,IPIP和BGP两种,kubespray-v2.18.1默认使用calico的IPIP网络模式,这两种网络模式对比请参考:《Kubernetes部署篇:calico两种网络模式》。IPIP和BGP两种网络模式,官方建议K8S集群节点小于100个。由于当前节点节点主机网络都在同一网段内,所以使用BGP网络模式,原生hostgw,效率高。
修改内容如下所示:
#1、添加BGp模式
[root@k8s-sdjw-ansible-11 kubespray-2.18.1]# vim inventory/mycluster/group_vars/k8s_cluster/k8s-net-calico.yml
calico_ipip_mode: 'Never' #定义何时使用网路模式,Never为BGP模式;Always为ipip模式,如果主机跨网段,设置为CrossSubnet
calico_ip_auto_method: "interface=ens.*" #ens.*表示网卡名称,根据实际情况填写
#2、选择工作模式,建议设置为Always,表示支持BGP和IPIP
[root@k8s-sdjw-ansible-11 kubespray-2.18.1]# vim ./roles/network_plugin/calico/defaults/main.yml
calico_ipv4pool_ipip: "Always" #支持BGP,IPIP
说明:相比IPIP模式,BGP模式下不需要tunl0设备参与报文传输,我们从路由表信息就能看出差别,如下所示
1、网络模式IPIP,路由信息如下:
2、网络模式BGP,路由信息如下:
7.7、执行一键部署
[root@k8s-sdjw-ansible-11 kubespray-2.18.1]# ansible-playbook -i inventory/mycluster/hosts.yaml --become --become-user=root cluster.yml
或带详细日志
[root@k8s-sdjw-ansible-11 kubespray-2.18.1]# ansible-playbook -i inventory/mycluster/hosts.yaml --become --become-user=root cluster.yml -vvvv
如下所示,即表明部署成功。
1.查看节点状态
2.查看pod信息
3.查看集群各组件状态