《企业级K8s集群运维实战》|《Kubernetes部署篇(基于docker使用kubespray工具部署高可用K8S集群(国内互联网方案四)》)


文章目录

  • 一、部署背景简介
  • 二、部署工具介绍
  • 三、部署方案介绍
  • 四、部署环境信息
  • 五、部署资源下载
  • 六、部署准备工作
    • 6.1、系统内核升级
    • 6.2、设置主机名
    • 6.3、环境初始化
    • 6.4、ssh多机互信
    • 6.5、安装基础包
    • 6.6、配置时间同步
  • 七、部署操作步骤
    • 7.1、下载解压源码
    • 7.2、安装依赖软件
    • 7.3、查看文件及镜像下载地址
    • 7.4、部署http服务器
    • 7.5、部署私有仓库
    • 7.6、生成inventory配置
    • 7.7、修改内部文件及镜像地址
    • 7.8、个性化配置
    • 7.9、修改docker私有仓库地址
    • 7.10、修改docker服务yum仓库源(可选)
    • 7.11、修改calico网络模式(可选)
    • 7.12、执行一键部署
    • 7.13、查看集群状态
  • 总结:整理不易,如果对你有帮助,可否点赞关注一下?


一、部署背景简介 根据公司业务场景的不同,你可能需要部署几套或几十套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 工作节点
192.168.1.23 k8s-sdjw-download-23 centos7.6.1810 5.4.13 v1.22.8 内网文件下载+内网镜像仓库
五、部署资源下载 说明:当前kubespray-v2.18.1版本默认安装的是K8S版本为v1.22.8,方便大家,特意找了一台能pull镜像及文件的服务器下载好了相关部署安装包及镜像。
基于docker使用kubespray工具部署高可用K8S集群(国内互联网方案四)部署资源包
1、资源信息列表
[root@k8s-sdjw-ansible-11 kubernetes-tools]# ll 总用量 1732 drwxr-xr-x5 root root129 4月25 08:57 basic-env #部署准备工作中需要执行自动化脚本 drwxr-xr-x2 root root103 4月26 20:57 docker #docker服务自动化部署工具 drwxr-xr-x 13 root root268 4月27 11:35 download #mv至nginx默认根目录下,k8s部署相关的文件 drwxr-xr-x4 root root137 4月27 11:29 files_images #1.22.8所有相关的官方镜像,tag及push至私有仓库脚本 -rw-r--r--1 root root 1771993 4月14 15:53 kubespray-2.18.1.zip #官方kubespray-2.18.1源码 drwxr-xr-x3 root root33 4月26 11:20 registry #私有仓库安装镜像及脚本

2、资源包分发
说明:basic-env目录中的执行脚本,所有机器都需要操作,docker 、download、files_images 、registry 可分发到当前环境中的192.168.1.23主机上,这台主机主要做内部文件下载+私有镜像仓库,kubespray-2.18.1.zip这个文件只需要在ansbile-client主机上即可。
六、部署准备工作 6.1、系统内核升级 说明:当前操作需在 所有主机上执行,执行更新后 必须重启服务器
《企业级K8s集群运维实战》|《Kubernetes部署篇(基于docker使用kubespray工具部署高可用K8S集群(国内互联网方案四)》)
文章图片

如下所示:
《企业级K8s集群运维实战》|《Kubernetes部署篇(基于docker使用kubespray工具部署高可用K8S集群(国内互联网方案四)》)
文章图片

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 [root@localhost ~]# hostnamectl set-hostname k8s-sdjw-download-23

6.3、环境初始化 说明:当前操作需在 所有主机上执行,环境初始化内容包括: 关闭防火墙、关闭selinux、关闭swap、内核参数 配置完成后需再次重启服务器,内核参数vm.swappiness才生效。
《企业级K8s集群运维实战》|《Kubernetes部署篇(基于docker使用kubespray工具部署高可用K8S集群(国内互联网方案四)》)
文章图片

注意事项:如果服务器默认开启dnsmasq服务,请关闭dnsmasq(否则可能导致容器无法解析域名),命令如下:
[root@localhost ~]# service dnsmasq stop && systemctl disable dnsmasq

6.4、ssh多机互信 说明:当前操作只需在 ansible-client主机上执行。
1、使用ssh-keygen工具生成秘钥
《企业级K8s集群运维实战》|《Kubernetes部署篇(基于docker使用kubespray工具部署高可用K8S集群(国内互联网方案四)》)
文章图片

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集群运维实战》|《Kubernetes部署篇(基于docker使用kubespray工具部署高可用K8S集群(国内互联网方案四)》)
文章图片

6.5、安装基础包 【《企业级K8s集群运维实战》|《Kubernetes部署篇(基于docker使用kubespray工具部署高可用K8S集群(国内互联网方案四)》)】 说明:当前操作需在 所有主机上执行。注意sshpass、expect 、rsync、ntpdate为必须要安装的包。
《企业级K8s集群运维实战》|《Kubernetes部署篇(基于docker使用kubespray工具部署高可用K8S集群(国内互联网方案四)》)
文章图片

6.6、配置时间同步 说明:配置时间同步操作需在 所有主机上执行。,如果你有自己的时间同步服务器,可配置为自己的时间服务器地址。
crontab -e */2 * * * * /usr/sbin/ntpdate ntp1.aliyun.com &>/dev/null

七、部署操作步骤 7.1、下载解压源码 说明:我提供的资源包里包含kubespray-2.18.1.zip,也是在github上下载的,你可以自己手动从github下载。当前操作只在 ansible-client主机上执行。
[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.2、安装依赖软件 说明:当前操作只需在 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集群运维实战》|《Kubernetes部署篇(基于docker使用kubespray工具部署高可用K8S集群(国内互联网方案四)》)
文章图片

如下所示,即表示安装成功。
《企业级K8s集群运维实战》|《Kubernetes部署篇(基于docker使用kubespray工具部署高可用K8S集群(国内互联网方案四)》)
文章图片

7.3、查看文件及镜像下载地址 说明:kubespray工具比较复杂,很多人不清楚需要下载什么镜像,当前v2.18.1版本默认装的k8s版本为1.22.8,你可以修改其它版本,但是必须符合当前kubespray-v2.18.1工具所能支持的k8s版本,如下操作只需在 ansible-client主机上执行。
[root@k8s-sdjw-ansible-11 kubespray-2.18.1]# cd contrib/offline [root@k8s-sdjw-ansible-11 offline]# sh generate_list.sh 查看文件下载地址 [root@k8s-sdjw-ansible-11 offline]# cat temp/files.list 查看镜像下载地址 [root@k8s-sdjw-ansible-11 offline]# cat temp/images.list

如上图所示,知道了需要下载的文件地址及镜像地址,你可以找一台能够下载这些资源的服务器或这找到这些资源版本的国内地址在自己电脑上下载。
文件下载地址,如下图所示:
《企业级K8s集群运维实战》|《Kubernetes部署篇(基于docker使用kubespray工具部署高可用K8S集群(国内互联网方案四)》)
文章图片

镜像下载地址,如下图所示:
《企业级K8s集群运维实战》|《Kubernetes部署篇(基于docker使用kubespray工具部署高可用K8S集群(国内互联网方案四)》)
文章图片

说明:通过这种方式查看当前需要下载的文件及镜像地址,唯一不足的是不能够根据使用docker或containerd来个性化的展示需要下载的文件及镜像地址,只能一股脑全部下载。
7.4、部署http服务器 说明:在企业内部环境中,通过内网下载部署速度会快,对于需要在企业内部多次部署的场景,强烈建议搭建内网环境http下载服务器,这里使用nginx来提供文件下载服务。 当前操作只在download主机上执行,即当前部署环境192.168.1.23主机上
部署步骤如下:
1、安装nginx
[root@k8s-sdjw-download-23 ~]# yum install epel-release -y [root@k8s-sdjw-download-23 ~]# yum install -y nginx [root@k8s-sdjw-download-23 html]# systemctl start nginx

2、创建文件目录(用来存放k8s部署所需相关文件)
[root@k8s-sdjw-download-23 ~]# mkdir /usr/share/nginx/html/download

3、根据 ansible-client主机中kubespray-2.18.1/contrib/offline/temp/files.list文件中的软件下载地址,如https://storage.googleapis.com/kubernetes-release/release/v1.22.8/bin/linux/amd64/kubelet,在download目录下创建相应的子目录kubernetes-release/release/v1.22.8/bin/linux/amd64/用来存放kubelet二进制工具,其它此次类推。这样做的目的是后面只需要在配置文件中修改https://storage.googleapis.com的url即可,减少更多改动,避免错误。操作如下所示:
[root@k8s-sdjw-download-23 download]# mkdir -pv download/containerd/v1.5.8 [root@k8s-sdjw-download-23 download]# mkdir -pv download/containers/crun/releases/download/1.3/ [root@k8s-sdjw-download-23 download]# mkdir -pv kata-containers/runtime/releases/download/2.2.3 [root@k8s-sdjw-download-23 download]# mkdir -pv kubernetes/calico/v3.20.3 [root@k8s-sdjw-download-23 download]# mkdir -pv kubernetes/cni [root@k8s-sdjw-download-23 download]# mkdir -pv kubernetes/cri-tools/ [root@k8s-sdjw-download-23 download]# mkdir -pv kubernetes/etcd [root@k8s-sdjw-download-23 download]# mkdir -pv kubernetes/flannel/v1.0.0 [root@k8s-sdjw-download-23 download]# mkdir -pv kubernetes/v1.22.8 [root@k8s-sdjw-download-23 download]# mkdir -pv nerdctl/v0.15.0 [root@k8s-sdjw-download-23 download]# mkdir -pv v1.0.3

4、这里我已经提前下载好了相关文件,并分别上传到相应目录下,如下图所示:
《企业级K8s集群运维实战》|《Kubernetes部署篇(基于docker使用kubespray工具部署高可用K8S集群(国内互联网方案四)》)
文章图片

5、如果你觉得创建目录很麻烦,你也可以将我提供的资源包中的download资源目录mv至/usr/share/nginx/html目录下,如下图所示:
《企业级K8s集群运维实战》|《Kubernetes部署篇(基于docker使用kubespray工具部署高可用K8S集群(国内互联网方案四)》)
文章图片

说明:这里提供的download目录下文件地址是与配置文件中定义的一致,较少修改,方便大家。
7.5、部署私有仓库 说明:在企业内部环境中,通过内网下载部署速度会快,对于需要在企业内部多次部署的场景,强烈建议搭建内网环境私有仓库,这里使用registry来提供镜像下载服务。如果你使用的是基于containerd来部署k8s服务的,你也可以部署registry或harbor镜像仓库,在kubespray-v2.18.1版本中基于docker部署目前只支持registry私有仓库。 当前操作只在download主机上执行,即当前部署环境192.168.1.23主机上
1、这里采用docker来部署私有仓库,需提前安装好docker,这里就不接好啊了,操作步骤如下:
[root@k8s-sdjw-download-23 ~]# docker pull registry [root@k8s-sdjw-download-23 ~]# docker run -itd -p 5000:5000 -v /data/docker/registry:/var/lib/registry --restart=always --name registry registry:latest [root@k8s-sdjw-download-23 ~]# vim /etc/docker/daemon.json "insecure-registries" : ["192.168.1.23:5000"], [root@k8s-sdjw-download-23 ~]# systemctl daemon-reload [root@k8s-sdjw-download-23 ~]# systemctl restart docker

如下图所示,则表明私有仓库部署成功。
《企业级K8s集群运维实战》|《Kubernetes部署篇(基于docker使用kubespray工具部署高可用K8S集群(国内互联网方案四)》)
文章图片

2、将官方下载的镜像导入到docker中,操作步骤如下:
[root@k8s-sdjw-download-23 images]# for i in `ls`; do docker load -i $i; done

如下图所示:
《企业级K8s集群运维实战》|《Kubernetes部署篇(基于docker使用kubespray工具部署高可用K8S集群(国内互联网方案四)》)
文章图片

3、将官方镜像重新打tag,这里使用的是play_tag.sh脚本,执行脚本即可,对于脚本中的my_images_register_url变量,请根据你实际环境中的私有仓库地址进行修改,操作步骤如下:
[root@k8s-sdjw-download-23 files_images]# sh play_tag.sh

如下图所示:
《企业级K8s集群运维实战》|《Kubernetes部署篇(基于docker使用kubespray工具部署高可用K8S集群(国内互联网方案四)》)
文章图片

play_tag.sh脚本内容如下:
[root@k8s-sdjw-download-23 files_images]# cat play_tag.sh [root@k8s-sdjw-download-23 files_images]# cat play_tag.sh #!/bin/bash my_images_register_url=192.168.1.23:5000 #根据实际情况填写 docker tagdocker.io/mirantis/k8s-netchecker-server:v1.2.2${my_images_register_url}/mirantis/k8s-netchecker-server:v1.2.2 docker tagdocker.io/mirantis/k8s-netchecker-agent:v1.2.2${my_images_register_url}/mirantis/k8s-netchecker-agent:v1.2.2 docker tagquay.io/coreos/etcd:v3.5.0${my_images_register_url}/coreos/etcd:v3.5.0 docker tagquay.io/cilium/cilium:v1.9.11${my_images_register_url}/cilium/cilium:v1.9.11 docker tagquay.io/cilium/cilium-init:2019-04-05${my_images_register_url}/cilium/cilium-init:2019-04-05 docker tagquay.io/cilium/operator:v1.9.11${my_images_register_url}/cilium/operator:v1.9.11 docker tagghcr.io/k8snetworkplumbingwg/multus-cni:v3.8${my_images_register_url}/k8snetworkplumbingwg/multus-cni:v3.8 docker tagquay.io/coreos/flannel:v0.15.1-amd64${my_images_register_url}/coreos/flannel:v0.15.1-amd64 docker tagquay.io/calico/node:v3.20.3${my_images_register_url}/calico/node:v3.20.3 docker tagquay.io/calico/cni:v3.20.3${my_images_register_url}/calico/cni:v3.20.3 docker tagquay.io/calico/pod2daemon-flexvol:v3.20.3${my_images_register_url}/calico/pod2daemon-flexvol:v3.20.3 docker tagquay.io/calico/kube-controllers:v3.20.3${my_images_register_url}/calico/kube-controllers:v3.20.3 docker tagquay.io/calico/typha:v3.20.3${my_images_register_url}/calico/typha:v3.20.3 docker tagdocker.io/weaveworks/weave-kube:2.8.1${my_images_register_url}/weaveworks/weave-kube:2.8.1 docker tagdocker.io/weaveworks/weave-npc:2.8.1${my_images_register_url}/weaveworks/weave-npc:2.8.1 docker tagdocker.io/kubeovn/kube-ovn:v1.8.1${my_images_register_url}/kubeovn/kube-ovn:v1.8.1 docker tagdocker.io/cloudnativelabs/kube-router:v1.3.2${my_images_register_url}/cloudnativelabs/kube-router:v1.3.2 docker tagk8s.gcr.io/pause:3.3${my_images_register_url}/pause:3.3 docker tagdocker.io/xueshanf/install-socat:latest${my_images_register_url}/xueshanf/install-socat:latest docker tagdocker.io/library/nginx:1.21.4${my_images_register_url}/library/nginx:1.21.4 docker tagdocker.io/library/haproxy:2.4.9${my_images_register_url}/library/haproxy:2.4.9 docker tagk8s.gcr.io/coredns/coredns:v1.8.0${my_images_register_url}/coredns/coredns:v1.8.0 docker tagk8s.gcr.io/dns/k8s-dns-node-cache:1.21.1${my_images_register_url}/dns/k8s-dns-node-cache:1.21.1 docker tagk8s.gcr.io/cpa/cluster-proportional-autoscaler-amd64:1.8.5 ${my_images_register_url}/cpa/cluster-proportional-autoscaler-amd64:1.8.5 docker tagdocker.io/library/registry:2.7.1${my_images_register_url}/library/registry:2.7.1 docker tagk8s.gcr.io/metrics-server/metrics-server:v0.5.0${my_images_register_url}/metrics-server/metrics-server:v0.5.0 docker tagk8s.gcr.io/addon-resizer:1.8.11${my_images_register_url}/addon-resizer:1.8.11 docker tagk8s.gcr.io/sig-storage/local-volume-provisioner:v2.4.0${my_images_register_url}/sig-storage/local-volume-provisioner:v2.4.0 docker tagquay.io/external_storage/cephfs-provisioner:v2.1.0-k8s1.11 ${my_images_register_url}/external_storage/cephfs-provisioner:v2.1.0-k8s1.11 docker tagquay.io/external_storage/rbd-provisioner:v2.1.1-k8s1.11${my_images_register_url}/external_storage/rbd-provisioner:v2.1.1-k8s1.11 docker tagdocker.io/rancher/local-path-provisioner:v0.0.19${my_images_register_url}/rancher/local-path-provisioner:v0.0.19 docker tagk8s.gcr.io/ingress-nginx/controller:v1.0.4${my_images_register_url}/ingress-nginx/controller:v1.0.4 docker tagdocker.io/amazon/aws-alb-ingress-controller:v1.1.9${my_images_register_url}/amazon/aws-alb-ingress-controller:v1.1.9 docker tagquay.io/jetstack/cert-manager-controller:v1.5.4${my_images_register_url}/jetstack/cert-manager-controller:v1.5.4 docker tagquay.io/jetstack/cert-manager-cainjector:v1.5.4${my_images_register_url}/jetstack/cert-manager-cainjector:v1.5.4 docker tagquay.io/jetstack/cert-manager-webhook:v1.5.4${my_images_register_url}/jetstack/cert-manager-webhook:v1.5.4 docker tagk8s.gcr.io/sig-storage/csi-attacher:v3.3.0${my_images_register_url}/sig-storage/csi-attacher:v3.3.0 docker tagk8s.gcr.io/sig-storage/csi-provisioner:v3.0.0${my_images_register_url}/sig-storage/csi-provisioner:v3.0.0 docker tagk8s.gcr.io/sig-storage/csi-snapshotter:v4.2.1${my_images_register_url}/sig-storage/csi-snapshotter:v4.2.1 docker tagk8s.gcr.io/sig-storage/snapshot-controller:v4.2.1${my_images_register_url}/sig-storage/snapshot-controller:v4.2.1 docker tagk8s.gcr.io/sig-storage/csi-resizer:v1.3.0${my_images_register_url}/sig-storage/csi-resizer:v1.3.0 docker tagk8s.gcr.io/sig-storage/csi-node-driver-registrar:v2.4.0${my_images_register_url}/sig-storage/csi-node-driver-registrar:v2.4.0 docker tagdocker.io/k8scloudprovider/cinder-csi-plugin:v1.22.0${my_images_register_url}/k8scloudprovider/cinder-csi-plugin:v1.22.0 docker tagdocker.io/amazon/aws-ebs-csi-driver:v0.5.0${my_images_register_url}/amazon/aws-ebs-csi-driver:v0.5.0 docker tagdocker.io/kubernetesui/dashboard-amd64:v2.4.0${my_images_register_url}/kubernetesui/dashboard-amd64:v2.4.0 docker tagdocker.io/kubernetesui/metrics-scraper:v1.0.7${my_images_register_url}/kubernetesui/metrics-scraper:v1.0.7 docker tagk8s.gcr.io/kube-apiserver:v1.22.8${my_images_register_url}/kube-apiserver:v1.22.8 docker tagk8s.gcr.io/kube-controller-manager:v1.22.8${my_images_register_url}/kube-controller-manager:v1.22.8 docker tagk8s.gcr.io/kube-scheduler:v1.22.8${my_images_register_url}/kube-scheduler:v1.22.8 docker tagk8s.gcr.io/kube-proxy:v1.22.8${my_images_register_url}/kube-proxy:v1.22.8

4、将新打上tag的镜像导入到私有仓库中,这里使用的是push_images.sh脚本,执行脚本即可,对于脚本中的my_images_register_url变量,请根据你实际环境中的私有仓库地址进行修改,操作步骤如下:
[root@k8s-sdjw-download-23 files_images]# sh push_images.sh

push_images.sh脚本内容如下:
#!/bin/bash my_images_register_url=192.168.1.23:5000 docker push${my_images_register_url}/mirantis/k8s-netchecker-server:v1.2.2 docker push${my_images_register_url}/mirantis/k8s-netchecker-agent:v1.2.2 docker push${my_images_register_url}/coreos/etcd:v3.5.0 docker push${my_images_register_url}/cilium/cilium:v1.9.11 docker push${my_images_register_url}/cilium/cilium-init:2019-04-05 docker push${my_images_register_url}/cilium/operator:v1.9.11 docker push${my_images_register_url}/k8snetworkplumbingwg/multus-cni:v3.8 docker push${my_images_register_url}/coreos/flannel:v0.15.1-amd64 docker push${my_images_register_url}/calico/node:v3.20.3 docker push${my_images_register_url}/calico/cni:v3.20.3 docker push${my_images_register_url}/calico/pod2daemon-flexvol:v3.20.3 docker push${my_images_register_url}/calico/kube-controllers:v3.20.3 docker push${my_images_register_url}/calico/typha:v3.20.3 docker push${my_images_register_url}/weaveworks/weave-kube:2.8.1 docker push${my_images_register_url}/weaveworks/weave-npc:2.8.1 docker push${my_images_register_url}/kubeovn/kube-ovn:v1.8.1 docker push${my_images_register_url}/cloudnativelabs/kube-router:v1.3.2 docker push${my_images_register_url}/pause:3.3 docker push${my_images_register_url}/xueshanf/install-socat:latest docker push${my_images_register_url}/library/nginx:1.21.4 docker push${my_images_register_url}/library/haproxy:2.4.9 docker push${my_images_register_url}/coredns/coredns:v1.8.0 docker push${my_images_register_url}/dns/k8s-dns-node-cache:1.21.1 docker push${my_images_register_url}/cpa/cluster-proportional-autoscaler-amd64:1.8.5 docker push${my_images_register_url}/library/registry:2.7.1 docker push${my_images_register_url}/metrics-server/metrics-server:v0.5.0 docker push${my_images_register_url}/addon-resizer:1.8.11 docker push${my_images_register_url}/sig-storage/local-volume-provisioner:v2.4.0 docker push${my_images_register_url}/external_storage/cephfs-provisioner:v2.1.0-k8s1.11 docker push${my_images_register_url}/external_storage/rbd-provisioner:v2.1.1-k8s1.11 docker push${my_images_register_url}/rancher/local-path-provisioner:v0.0.19 docker push${my_images_register_url}/ingress-nginx/controller:v1.0.4 docker push${my_images_register_url}/amazon/aws-alb-ingress-controller:v1.1.9 docker push${my_images_register_url}/jetstack/cert-manager-controller:v1.5.4 docker push${my_images_register_url}/jetstack/cert-manager-cainjector:v1.5.4 docker push${my_images_register_url}/jetstack/cert-manager-webhook:v1.5.4 docker push${my_images_register_url}/sig-storage/csi-attacher:v3.3.0 docker push${my_images_register_url}/sig-storage/csi-provisioner:v3.0.0 docker push${my_images_register_url}/sig-storage/csi-snapshotter:v4.2.1 docker push${my_images_register_url}/sig-storage/snapshot-controller:v4.2.1 docker push${my_images_register_url}/sig-storage/csi-resizer:v1.3.0 docker push${my_images_register_url}/sig-storage/csi-node-driver-registrar:v2.4.0 docker push${my_images_register_url}/k8scloudprovider/cinder-csi-plugin:v1.22.0 docker push${my_images_register_url}/amazon/aws-ebs-csi-driver:v0.5.0 docker push${my_images_register_url}/kubernetesui/dashboard-amd64:v2.4.0 docker push${my_images_register_url}/kubernetesui/metrics-scraper:v1.0.7 docker push${my_images_register_url}/kube-apiserver:v1.22.8 docker push${my_images_register_url}/kube-controller-manager:v1.22.8 docker push${my_images_register_url}/kube-scheduler:v1.22.8 docker push${my_images_register_url}/kube-proxy:v1.22.8

5、获取私有仓库列表,操作步骤如下:
[root@k8s-sdjw-download-23 files_images]# curl http://192.168.1.23:5000/v2/_catalog [root@k8s-sdjw-download-23 files_images]# curl -XGET http://192.168.1.23:5000/v2/kube-scheduler/tags/list

如下图所示:
《企业级K8s集群运维实战》|《Kubernetes部署篇(基于docker使用kubespray工具部署高可用K8S集群(国内互联网方案四)》)
文章图片

7.6、生成inventory配置 说明:由于kubespray给我们准备了py脚本,可以直接根据环境变量自动生成配置文件,所以我们现在只需要设定好环境变量就可以。当前操作只在 ansible-client主机上执行。
1、copy一份demo配置,准备自定义 [root@k8s-sdjw-ansible-11 kubespray-2.18.1]# cp -rpf inventory/sample inventory/mycluster2、使用真实的hostname,(否则会自动把你的hostname改成node1/node2...这种) [root@k8s-sdjw-ansible-11 kubespray-2.18.1]# export USE_REAL_HOSTNAME=true3、指定配置文件位置 [root@k8s-sdjw-ansible-11 kubespray-2.18.1]# export CONFIG_FILE=inventory/mycluster/hosts.yaml4、定义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集群运维实战》|《Kubernetes部署篇(基于docker使用kubespray工具部署高可用K8S集群(国内互联网方案四)》)
文章图片

查看主机名,确认USE_REAL_HOSTNAME=true生效
[root@k8s-sdjw-ansible-11 kubespray-2.18.1]# cat inventory/mycluster/hosts.yaml

如下所示:
《企业级K8s集群运维实战》|《Kubernetes部署篇(基于docker使用kubespray工具部署高可用K8S集群(国内互联网方案四)》)
文章图片

7.7、修改内部文件及镜像地址 说明:http文件服务下载及私有镜像仓库部署成功后,需要需改kbuespray部署包中的配置信息,经本人测试,主要有两种方法。 当前操作只在ansible-client主机上执行,即当前部署环境192.168.1.11主机上
方法:修改inventory/mycluster/group_vars/all/offline.yml文件中定义文件及镜像地址。如下所示:
[root@k8s-sdjw-ansible-11 kubespray-2.18.1]# vim inventory/mycluster/group_vars/all/offline.yml registry_host: "192.168.1.23:5000" files_repo: "http://192.168.1.23/download" kube_image_repo: "{{ registry_host }}" gcr_image_repo: "{{ registry_host }}" github_image_repo: "{{ registry_host }}" docker_image_repo: "{{ registry_host }}" quay_image_repo: "{{ registry_host }}" kubeadm_download_url: "{{ files_repo }}/kubernetes/{{ kube_version }}/kubeadm" kubectl_download_url: "{{ files_repo }}/kubernetes/{{ kube_version }}/kubectl" kubelet_download_url: "{{ files_repo }}/kubernetes/{{ kube_version }}/kubelet" cni_download_url: "{{ files_repo }}/kubernetes/cni/cni-plugins-linux-{{ image_arch }}-{{ cni_version }}.tgz" crictl_download_url: "{{ files_repo }}/kubernetes/cri-tools/crictl-{{ crictl_version }}-{{ ansible_system | lower }}-{{ image_arch }}.tar.gz" etcd_download_url: "{{ files_repo }}/kubernetes/etcd/etcd-{{ etcd_version }}-linux-amd64.tar.gz" calicoctl_download_url: "{{ files_repo }}/kubernetes/calico/{{ calico_ctl_version }}/calicoctl-linux-{{ image_arch }}" calico_crds_download_url: "{{ files_repo }}/kubernetes/calico/{{ calico_version }}.tar.gz" flannel_cni_download_url: "{{ files_repo }}/kubernetes/flannel/{{ flannel_cni_version }}/flannel-{{ image_arch }}" helm_download_url: "{{ files_repo }}/helm-{{ helm_version }}-linux-{{ image_arch }}.tar.gz" crun_download_url: "{{ files_repo }}/containers/crun/releases/download/{{ crun_version }}/crun-{{ crun_version }}-linux-{{ image_arch }}" kata_containers_download_url: "{{ files_repo }}/kata-containers/runtime/releases/download/{{ kata_containers_version }}/kata-static-{{ kata_containers_version }}-{{ ansible_architecture }}.tar.xz" runc_download_url: "{{ files_repo }}/{{ runc_version }}/runc.{{ image_arch }}" containerd_download_url: "{{ files_repo }}/containerd/v{{ containerd_version }}/containerd-{{ containerd_version }}-linux-{{ image_arch }}.tar.gz" nerdctl_download_url: "{{ files_repo }}/nerdctl/v{{ nerdctl_version }}/nerdctl-{{ nerdctl_version }}-{{ ansible_system | lower }}-{{ image_arch }}.tar.gz"

说明:这里修改内部文件及镜像地址有两种方法,这是一种,另一种请参考《Kubernetes部署篇:基于docker使用kubespray工具部署高可用K8S集群(国内互联网方案三)》之7.7章节
7.8、个性化配置 说明:配置文件都生成好了,虽然可以直接用,但并不能完全满足大家的个性化需求,比如用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: docker2、修改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/184、修改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: host5、附加组件(可选操作,当前环境没有安装) [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

7.9、修改docker私有仓库地址 说明:由于我们的私有镜像仓库未配置https证书,需要在inventory/mycluster/group_vars/all/docker.yml文件中添加如下配置:
[root@k8s-sdjw-ansible-11 kubespray-2.18.1]# vim inventory/mycluster/group_vars/all/docker.yml docker_insecure_registries: - 192.168.1.23:5000

7.10、修改docker服务yum仓库源(可选) 说明:如果官方默认的yum仓库源不可用,你可以修改为国内阿里云yum仓库源地址。经本人测试官方默认也是可以用的。阿里云docker-ce仓库yum源地址。
[root@k8s-sdjw-ansible-11 kubespray-2.18.1]# vim roles/container-engine/docker/defaults/main.yml # CentOS/RedHat docker-ce repo # docker_rh_repo_base_url: 'https://download.docker.com/linux/centos/{{ ansible_distribution_major_version }}/$basearch/stable' # docker_rh_repo_gpgkey: 'https://download.docker.com/linux/centos/gpg' docker_rh_repo_base_url: 'https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/$basearch/stable' docker_rh_repo_gpgkey: 'https://mirrors.aliyun.com/docker-ce/linux/centos/gpg'

7.11、修改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集群运维实战》|《Kubernetes部署篇(基于docker使用kubespray工具部署高可用K8S集群(国内互联网方案四)》)
文章图片

2、网络模式BGP,路由信息如下:
《企业级K8s集群运维实战》|《Kubernetes部署篇(基于docker使用kubespray工具部署高可用K8S集群(国内互联网方案四)》)
文章图片

7.12、执行一键部署
[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集群运维实战》|《Kubernetes部署篇(基于docker使用kubespray工具部署高可用K8S集群(国内互联网方案四)》)
文章图片

7.13、查看集群状态 1.查看节点状态

2.查看pod信息
《企业级K8s集群运维实战》|《Kubernetes部署篇(基于docker使用kubespray工具部署高可用K8S集群(国内互联网方案四)》)
文章图片

3.查看集群各组件状态

总结:整理不易,如果对你有帮助,可否点赞关注一下? 更多详细内容请参考:企业级K8s集群运维实战

    推荐阅读