文章目录

  • 一、部署背景简介
  • 二、部署工具介绍
  • 三、部署方案介绍
  • 四、部署环境信息
  • 五、部署资源下载
  • 六、部署准备工作
  • 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集群(国内互联网方案一)部署资源包

资源信息如下:

k8s使用docker作为允许时容器 使用docker部署k8s项目_kubernetes


六、部署准备工作

6.1、系统内核升级

说明:当前操作需在 所有主机上执行,执行更新后 必须重启服务器。

k8s使用docker作为允许时容器 使用docker部署k8s项目_服务器_02


如下所示:

k8s使用docker作为允许时容器 使用docker部署k8s项目_运维_03


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才生效。

k8s使用docker作为允许时容器 使用docker部署k8s项目_k8s使用docker作为允许时容器_04


注意事项:如果服务器默认开启dnsmasq服务,请关闭dnsmasq(否则可能导致容器无法解析域名),命令如下:

[root@localhost ~]# service dnsmasq stop && systemctl disable dnsmasq

6.4、ssh多机互信

说明:当前操作只需在 ansible-client主机上执行。

1、使用ssh-keygen工具生成秘钥

k8s使用docker作为允许时容器 使用docker部署k8s项目_kubernetes_05


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

如下图所示:

k8s使用docker作为允许时容器 使用docker部署k8s项目_服务器_06


6.5、安装基础包

说明:当前操作需在 所有主机上执行。注意sshpass、expect 、rsync、ntpdate为必须要安装的包。

k8s使用docker作为允许时容器 使用docker部署k8s项目_linux_07


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目录下即可。如下所示:

k8s使用docker作为允许时容器 使用docker部署k8s项目_运维_08


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

如下图所示:

k8s使用docker作为允许时容器 使用docker部署k8s项目_k8s使用docker作为允许时容器_09


如下所示,即表示安装成功。

k8s使用docker作为允许时容器 使用docker部署k8s项目_运维_10


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[@]}

操作步骤如下所示:

k8s使用docker作为允许时容器 使用docker部署k8s项目_linux_11


查看主机名,确认USE_REAL_HOSTNAME=true生效

[root@k8s-sdjw-ansible-11 kubespray-2.18.1]# cat inventory/mycluster/hosts.yaml

如下所示:

k8s使用docker作为允许时容器 使用docker部署k8s项目_k8s使用docker作为允许时容器_12


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,路由信息如下:

k8s使用docker作为允许时容器 使用docker部署k8s项目_k8s使用docker作为允许时容器_13


2、网络模式BGP,路由信息如下:

k8s使用docker作为允许时容器 使用docker部署k8s项目_linux_14


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

如下所示,即表明部署成功。

k8s使用docker作为允许时容器 使用docker部署k8s项目_linux_15


1.查看节点状态

k8s使用docker作为允许时容器 使用docker部署k8s项目_服务器_16


2.查看pod信息

k8s使用docker作为允许时容器 使用docker部署k8s项目_k8s使用docker作为允许时容器_17


3.查看集群各组件状态

k8s使用docker作为允许时容器 使用docker部署k8s项目_k8s使用docker作为允许时容器_18