根据公司业务场景的不同,你可能需要部署几套或几十套K8S高可用集群,面对繁琐的部署步骤,你可能望而却步,急需自动化的K8S部署工具,kubespray就可以很好的解决你的问题。由于当前网络环境是专网环境,无法联通外部网络,所以要实现使用kubespray专网部署K8S,还是有一定难度的,在很多的网上文章中,其实写得并不是很详细。这里我将详细得介绍如何在专网环境下离线部署高可用K8S集群。
要实现在专网环境下离线部署高可用K8S集群,有4大难点:
问题一、离线安装环境依赖包
问题二、使用内部docker yum仓库安装docker
问题三、使用内部Nginx服务提供部署安装包下载
问题四、使用内部私有镜像仓库下载镜像
针对上面四个问题,分别给出实现方案
1、问题一解决方案:
问题一解决方案:《Kubernetes部署篇:使用kubespray工具部署高可用K8S集群方案操作指南》
,参考这篇的互联网部署方案,部署前开启yum 缓存配置,部署完成后分别到/var/cache/yum/x86_64/7/base/packages、/var/cache/yum/x86_64/7/extras/packages/、/var/cache/yum/x86_64/7/updates/packages/三个目录下将所有的rpm包传到专网主机上,在专网环境下使用kubespray部署k8s集群前在所有主机上安装这些系统环境依赖包。当前你也可以找到这些所依赖的服务包然后制作本地yum源,当然这个还是比较费时间的,除非你对kubespray工具的源码非常了解,可以对配置文件进行修改。
二、问题二解决方案:
问题二解决方案:在kubespray工具中,默认是使用官方yum仓库来安装docker服务的,在专网环境下肯定是不行,你需要将docker服务构建本地yum源,通过本地yum仓库进行部署。具体制作过程清参考《Linux运维总结:docker离线安装以及本地yum源构建》
三、问题三解决方案:
问题三解决方案:使用kubespray工具部署k8s集群,需要安装很多如calicoctl、cni-plugins、containerd、etcd等等还有很多类似这样的工具,在内网环境下你是无法访问外网,所以这里的解决方案是,找一台能够下载这些文件的服务器,下载完成后,上传到Nginx主机上的根目录,或者自己定义一个根目录,来提供内网环境的部署文件包下载。
四、问题四解决方案:
问题四解决方案:使用kubespray工具部署k8s集群,需要pull一些镜像,如kube-apiserver、kube-controller-manager、kube-proxy、kube-scheduler等等还有很多镜像,在内网环境下你是无法访问外网,所以这里的解决方案是,找一台能够下载这些镜像的服务器,下载完成后,save以下,然后上传到专网环境服务器上,然后这台专网环境服务器上部署registry私有镜像服务,这里使用docker来部署registry,部署完成后将这些镜像load,然后重新打上tag,上传到私有镜像仓库地址中。这样内网环境就可以通过私有仓库地址对这些镜像进行下载。
总结:解决了上述这些问题后,在不经常更换k8s版本的情况下,使用kubespray工具部署高可用k8s集群还是非常快的。总之,第一次部署可能比较费时间,尤其是整理系统环境依赖包、部署相关安装包内网下载、docker服务本地yum源构建、私有镜像仓库部署、下载官方镜像、上传镜像到私有镜像仓库。将这些工作做好之后,后面需要部署新的k8s环境就会非常轻松。 整理这些非常不容易,看似清楚简单的操作步骤后面都是大量的时间验证,希望能给你带来帮助。
说明:使用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 | 内网文件下载+内网镜像仓库+内网yum源仓库 |
说明:当前kubespray-v2.18.1版本默认安装的是K8S版本为v1.22.8,方便大家,特意找了一台能pull镜像及文件的服务器下载好了相关部署安装包及镜像。
基于docker使用kubespray工具部署高可用K8S集群(国内专网方案)部署资源包
1、资源信息列表
[root@k8s-sdjw-ansible-11 kubernetes-tools]# ll
总用量 1736
drwxr-xr-x 5 root root 129 4月 25 08:57 basic-env #部署准备工作中需要执行自动化脚本
drwxr-xr-x 3 root root 116 4月 29 13:05 docker #docker服务自动化部署工具
drwxr-xr-x 8 root root 150 4月 28 10:02 download #mv至nginx默认根目录下,k8s部署相关的文件
drwxr-xr-x 4 root root 137 4月 27 11:29 files_images #1.22.8所有相关的官方镜像,tag及push至私有仓库脚本
drwxr-xr-x 2 root root 38 4月 29 16:23 images #kubespray镜像,解决ansible及python环境问题
-rw-r--r-- 1 root root 1771993 4月 14 15:53 kubespray-2.18.1.zip #官方kubespray-2.18.1源码
drwxr-xr-x 3 root root 33 4月 27 15:24 registry #私有镜像仓库registry镜像及部署脚本
2、资源包分发
说明:basic-env目录中的执行脚本,所有机器都需要操作,docker 、download、files_images 、registry 可分发到当前环境中的192.168.1.23主机上,这台主机主要做内部文件下载+私有镜像仓库,kubespray-2.18.1.zip这个文件只需要在ansbile-client主机上即可。
说明:当前操作需在 所有主机上执行,执行更新后 必须重启服务器。
如下所示:
说明:当前操作需在 所有主机上执行,请根据部署环境信息中的主机名 分别对部署主机进行主机名设置。
[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
说明:当前操作需在 所有主机上执行,环境初始化内容包括: 关闭防火墙、关闭selinux、关闭swap、内核参数。 配置完成后需再次重启服务器,内核参数vm.swappiness才生效。
注意事项:如果服务器默认开启dnsmasq服务,请关闭dnsmasq(否则可能导致容器无法解析域名),命令如下:
[root@localhost ~]# service dnsmasq stop && systemctl disable dnsmasq
说明:当前操作只需在 ansible-client主机上执行。
[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
说明:当前操作需在 所有主机上执行。注意sshpass、expect 、rsync、ntpdate、k8s-depend等目录下为为必须要安装的包。
说明:配置时间同步操作需在 所有主机上执行。如果你有自己的时间同步服务器,可配置为自己的时间服务器地址。 如果没有时间服务器,清一定要确认所有主机时间是否相同。
crontab -e
*/2 * * * * /usr/sbin/ntpdate ntp.sdxw.com &>/dev/null
说明:当前操作只需在 ansible-client主机和k8s-sdjw-download-23上执行。
1、ansible-client主机离线部署docker服务来用来部署ansible及python环境,避免与本地ansible及python环境版本冲突,因为在专网环境下,你可能无法很好快速的解决这些问题。
2、k8s-sdjw-download-23主机离线部署docker服务是用来搭建内网环境私有镜像仓库registry。
3、你也可以按照自己的方法来在专网环境下部署docekr服务。
说明:我提供的资源包里包含kubespray-2.18.1.zip,也是在github上下载的,你可以自己手动从github下载。当前操作只在 ansible-client主机上执行。建议找一台能够下载github资源的机器下载kubespray源码包,然后上传到专网主机上。
[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
说明: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
如上图所示,知道了需要下载的文件地址及镜像地址,你可以找一台能够下载这些资源的服务器或这找到这些资源版本的国内地址在自己电脑上下载。
文件下载地址,如下图所示:
镜像下载地址,如下图所示:
说明:通过这种方式查看当前需要下载的文件及镜像地址,唯一不足的是不能够根据使用docker或containerd来个性化的展示需要下载的文件及镜像地址,只能一股脑全部下载。
说明:在企业内部环境中,通过内网下载部署速度会快,对于需要在企业内部多次部署的场景,强烈建议搭建内网环境http下载服务器,这里使用Nginx来提供内网环境文件下载服务。 当前操作只在k8s-sdjw-download-23主机上执行,即当前部署环境192.168.1.23主机上。这里要说明以下,部署Nginx你可以通过源码编译、rpm包、内部yum源三种方式安装。这里我的不介绍了。我这里的k8s-sdjw-download-23是可以上外网的,节约部署时间,就没有采用离线部署的方式,所以用官方yum源的方式部署。在专网环境下,建议使用内部yum源方式。
部署步骤如下:
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
说明:这里为什么创建这些目录呢,在kubespray部署工具中,离线部署K8S集群的配置文件offline.yml中定义的文件路径都是这个路径,为了避免改动麻烦,我就按照这些路径地址创建存储这些文件的目录。当然你也可以自己按照自己的想法创建存储目录路径,前提是你要自己手动修改offline.yml配置文件。
4、这里我已经使用提前其它服务器下载好了相关文件,并分别上传到专网主机Nginx文件服务相应目录下,如下图所示:
5、如果你觉得创建目录很麻烦,你也可以将我提供的资源包中的download资源目录mv至/usr/share/nginx/html目录下,如下图所示:
说明:在企业内部环境中,通过内网下载部署速度会快,对于需要在企业内部多次部署的场景,强烈建议搭建内网环境私有仓库,这里使用registry来提供镜像下载服务。 如果你使用的是基于containerd来部署k8s服务的,你也可以部署registry或harbor镜像仓库,在kubespray-v2.18.1版本中基于docker部署目前只支持registry私有仓库。 当前操作只在k8s-sdjw-download-23主机上执行,即当前部署环境192.168.1.23主机上。
1、这里采用docker来部署私有仓库,需提前安装好docker,这里默认已经提前下载好了registry镜像,只需load即可,操作步骤如下:
[root@k8s-sdjw-download-23 ~]# docker load -i registry.tar.gz
[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
如下图所示,则表明私有仓库部署成功。
2、将提前下载好的镜像上传到k8s-sdjw-download-23主机上,并使用docker load命令导入镜像,操作步骤如下:
[root@k8s-sdjw-download-23 images]# for i in `ls`;do docker load -i $i;done
如下图所示:
3、将官方镜像重新打tag,这里使用的是play_tag.sh脚本,执行脚本即可,对于脚本中的my_images_register_url变量,请根据你实际环境中的私有仓库地址进行修改,操作步骤如下:
[root@k8s-sdjw-download-23 files_images]# sh 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 tag docker.io/mirantis/k8s-netchecker-server:v1.2.2 ${my_images_register_url}/mirantis/k8s-netchecker-server:v1.2.2
docker tag docker.io/mirantis/k8s-netchecker-agent:v1.2.2 ${my_images_register_url}/mirantis/k8s-netchecker-agent:v1.2.2
docker tag quay.io/coreos/etcd:v3.5.0 ${my_images_register_url}/coreos/etcd:v3.5.0
docker tag quay.io/cilium/cilium:v1.9.11 ${my_images_register_url}/cilium/cilium:v1.9.11
docker tag quay.io/cilium/cilium-init:2019-04-05 ${my_images_register_url}/cilium/cilium-init:2019-04-05
docker tag quay.io/cilium/operator:v1.9.11 ${my_images_register_url}/cilium/operator:v1.9.11
docker tag ghcr.io/k8snetworkplumbingwg/multus-cni:v3.8 ${my_images_register_url}/k8snetworkplumbingwg/multus-cni:v3.8
docker tag quay.io/coreos/flannel:v0.15.1-amd64 ${my_images_register_url}/coreos/flannel:v0.15.1-amd64
docker tag quay.io/calico/node:v3.20.3 ${my_images_register_url}/calico/node:v3.20.3
docker tag quay.io/calico/cni:v3.20.3 ${my_images_register_url}/calico/cni:v3.20.3
docker tag quay.io/calico/pod2daemon-flexvol:v3.20.3 ${my_images_register_url}/calico/pod2daemon-flexvol:v3.20.3
docker tag quay.io/calico/kube-controllers:v3.20.3 ${my_images_register_url}/calico/kube-controllers:v3.20.3
docker tag quay.io/calico/typha:v3.20.3 ${my_images_register_url}/calico/typha:v3.20.3
docker tag docker.io/weaveworks/weave-kube:2.8.1 ${my_images_register_url}/weaveworks/weave-kube:2.8.1
docker tag docker.io/weaveworks/weave-npc:2.8.1 ${my_images_register_url}/weaveworks/weave-npc:2.8.1
docker tag docker.io/kubeovn/kube-ovn:v1.8.1 ${my_images_register_url}/kubeovn/kube-ovn:v1.8.1
docker tag docker.io/cloudnativelabs/kube-router:v1.3.2 ${my_images_register_url}/cloudnativelabs/kube-router:v1.3.2
docker tag k8s.gcr.io/pause:3.3 ${my_images_register_url}/pause:3.3
docker tag docker.io/xueshanf/install-socat:latest ${my_images_register_url}/xueshanf/install-socat:latest
docker tag docker.io/library/nginx:1.21.4 ${my_images_register_url}/library/nginx:1.21.4
docker tag docker.io/library/haproxy:2.4.9 ${my_images_register_url}/library/haproxy:2.4.9
docker tag k8s.gcr.io/coredns/coredns:v1.8.0 ${my_images_register_url}/coredns/coredns:v1.8.0
docker tag k8s.gcr.io/dns/k8s-dns-node-cache:1.21.1 ${my_images_register_url}/dns/k8s-dns-node-cache:1.21.1
docker tag k8s.gcr.io/cpa/cluster-proportional-autoscaler-amd64:1.8.5 ${my_images_register_url}/cpa/cluster-proportional-autoscaler-amd64:1.8.5
docker tag docker.io/library/registry:2.7.1 ${my_images_register_url}/library/registry:2.7.1
docker tag k8s.gcr.io/metrics-server/metrics-server:v0.5.0 ${my_images_register_url}/metrics-server/metrics-server:v0.5.0
docker tag k8s.gcr.io/addon-resizer:1.8.11 ${my_images_register_url}/addon-resizer:1.8.11
docker tag k8s.gcr.io/sig-storage/local-volume-provisioner:v2.4.0 ${my_images_register_url}/sig-storage/local-volume-provisioner:v2.4.0
docker tag quay.io/external_storage/cephfs-provisioner:v2.1.0-k8s1.11 ${my_images_register_url}/external_storage/cephfs-provisioner:v2.1.0-k8s1.11
docker tag quay.io/external_storage/rbd-provisioner:v2.1.1-k8s1.11 ${my_images_register_url}/external_storage/rbd-provisioner:v2.1.1-k8s1.11
docker tag docker.io/rancher/local-path-provisioner:v0.0.19 ${my_images_register_url}/rancher/local-path-provisioner:v0.0.19
docker tag k8s.gcr.io/ingress-nginx/controller:v1.0.4 ${my_images_register_url}/ingress-nginx/controller:v1.0.4
docker tag docker.io/amazon/aws-alb-ingress-controller:v1.1.9 ${my_images_register_url}/amazon/aws-alb-ingress-controller:v1.1.9
docker tag quay.io/jetstack/cert-manager-controller:v1.5.4 ${my_images_register_url}/jetstack/cert-manager-controller:v1.5.4
docker tag quay.io/jetstack/cert-manager-cainjector:v1.5.4 ${my_images_register_url}/jetstack/cert-manager-cainjector:v1.5.4
docker tag quay.io/jetstack/cert-manager-webhook:v1.5.4 ${my_images_register_url}/jetstack/cert-manager-webhook:v1.5.4
docker tag k8s.gcr.io/sig-storage/csi-attacher:v3.3.0 ${my_images_register_url}/sig-storage/csi-attacher:v3.3.0
docker tag k8s.gcr.io/sig-storage/csi-provisioner:v3.0.0 ${my_images_register_url}/sig-storage/csi-provisioner:v3.0.0
docker tag k8s.gcr.io/sig-storage/csi-snapshotter:v4.2.1 ${my_images_register_url}/sig-storage/csi-snapshotter:v4.2.1
docker tag k8s.gcr.io/sig-storage/snapshot-controller:v4.2.1 ${my_images_register_url}/sig-storage/snapshot-controller:v4.2.1
docker tag k8s.gcr.io/sig-storage/csi-resizer:v1.3.0 ${my_images_register_url}/sig-storage/csi-resizer:v1.3.0
docker tag k8s.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 tag docker.io/k8scloudprovider/cinder-csi-plugin:v1.22.0 ${my_images_register_url}/k8scloudprovider/cinder-csi-plugin:v1.22.0
docker tag docker.io/amazon/aws-ebs-csi-driver:v0.5.0 ${my_images_register_url}/amazon/aws-ebs-csi-driver:v0.5.0
docker tag docker.io/kubernetesui/dashboard-amd64:v2.4.0 ${my_images_register_url}/kubernetesui/dashboard-amd64:v2.4.0
docker tag docker.io/kubernetesui/metrics-scraper:v1.0.7 ${my_images_register_url}/kubernetesui/metrics-scraper:v1.0.7
docker tag k8s.gcr.io/kube-apiserver:v1.22.8 ${my_images_register_url}/kube-apiserver:v1.22.8
docker tag k8s.gcr.io/kube-controller-manager:v1.22.8 ${my_images_register_url}/kube-controller-manager:v1.22.8
docker tag k8s.gcr.io/kube-scheduler:v1.22.8 ${my_images_register_url}/kube-scheduler:v1.22.8
docker tag k8s.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
如下图所示:
《Linux运维总结:docker离线安装以及本地yum源构建》
说明:通过上述链接的文章中构建docker本地yum源,这里使用的docekr版本为20.10.11,之前测试在互联网环境下kubespray-v2.18.1版本默认安装的docekr版本为20.10.11。
问题一:docker 20.10.11离线安装包中的containerd.io版本为1.5.11,但是在kubespray-v2.18.1版本中默认安装的最新版本为1.4.12。如何解决这些问题呢?
问题二:使用内部docker本地yum源,需要修改哪些配置文件呢?
Don’t worry. We’ll figure it out !
说明:配置文件都生成好了,虽然可以直接用,但并不能完全满足大家的个性化需求,比如用docker还是containerd,docker的工作目录是否用默认的/var/lib/docker等等。
1、copy一份demo配置,准备自定义
[root@k8s-sdjw-ansible-11 kubespray-2.18.1]# cp -rpf inventory/sample inventory/mycluster
2、默认使用containerd修改为docker
[root@k8s-sdjw-ansible-11 kubespray-2.18.1]# vim inventory/mycluster/group_vars/k8s_cluster/k8s-cluster.yml
container_manager: docker
3、修改docker数据存储目录
[root@k8s-sdjw-ansible-11 kubespray-2.18.1]# vim inventory/mycluster/group_vars/all/docker.yml
docker_daemon_graph: "/data/docker"
4、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
5、修改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
6、附加组件(可选操作,当前环境是没有部署dashborad和ingress)
[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
说明: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"
#docker服务本地yum源地址
yum_repo: "http://192.168.1.23/localyum"
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"
docker_rh_repo_base_url: "{{ yum_repo }}"
说明:由于我们的私有镜像仓库未配置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
说明:由于当前环境是专网环境,无法联通外网,官方yum源及阿里云yum源无法使用,这里采用本地yum方式。
1、docker-ce本地yum配置如下
[docker-ce]
name=Docker-CE Repository
baseurl=http://192.168.1.23/localyum
enabled=1
gpgcheck=0
2、修改默认docker-ce repo模板,修改后的模板需要与上面docker-ce本地yum配置保持一致,当前系统是centos,所以是rh_docker.repo.j2
vim roles/container-engine/docker/templates/rh_docker.repo.j2
#修改前
[docker-ce]
name=Docker-CE Repository
baseurl={{ docker_rh_repo_base_url }}
enabled=0
gpgcheck={{ '1' if docker_rh_repo_gpgkey else '0' }}
keepcache={{ docker_rpm_keepcache | default('1') }}
gpgkey={{ docker_rh_repo_gpgkey }}
{% if http_proxy is defined %}
proxy={{ http_proxy }}
{% endif %}
#修改后
[docker-ce]
name=Docker-CE Repository
baseurl={{ docker_rh_repo_base_url }}
enabled=1
gpgcheck=0
3、由于安装docker 20.10.11版本 本地yum中的containerd.io版本为1.5.11,而官方kubespray-v2.18.1版本中的最新只支持1.4.12版本,所以需要修改kubespray工具中配置信息
[root@k8s-sdjw-ansible-11 kubespray-2.18.1]# vim roles/container-engine/docker/vars/redhat.yml
containerd_versioned_pkg:
'latest': "{{ containerd_package }}"
'1.3.7': "{{ containerd_package }}-1.3.7-3.1.el{{ ansible_distribution_major_version }}"
'1.3.9': "{{ containerd_package }}-1.3.9-3.1.el{{ ansible_distribution_major_version }}"
'1.4.3': "{{ containerd_package }}-1.4.3-3.2.el{{ ansible_distribution_major_version }}"
'1.4.4': "{{ containerd_package }}-1.4.4-3.1.el{{ ansible_distribution_major_version }}"
'1.4.6': "{{ containerd_package }}-1.4.6-3.1.el{{ ansible_distribution_major_version }}"
'1.4.9': "{{ containerd_package }}-1.4.9-3.1.el{{ ansible_distribution_major_version }}"
'1.4.12': "{{ containerd_package }}-1.4.12-3.1.el{{ ansible_distribution_major_version }}"
'1.5.11': "{{ containerd_package }}-1.5.11-3.1.el{{ ansible_distribution_major_version }}"
'stable': "{{ containerd_package }}-1.5.11-3.1.el{{ ansible_distribution_major_version }}"
'edge': "{{ containerd_package }}-1.5.11-3.1.el{{ ansible_distribution_major_version }}"
修改前
修改后
4、修改默认docker_containerd_version 1.4.12为1.5.11
[root@k8s-sdjw-ansible-11 kubespray-2.18.1]# vim ./roles/download/defaults/main.yml
docker_containerd_version: 1.5.11
说明: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,路由信息如下:
说明:如果当前机器已经通过系统包安装了ansible,通过安装的其他python包pip install -r requirements.txt将转到与/usr/local/lib/python2.7/dist-packagesAnsible不同的目录树,此,ansible-playbook命令将失败,并显示ERROR! no action detected in task. This often indicates a misspelled module name, or incorrect module path,这里采用docker来安装ansbile环境,并通过绑定挂载的方式将目录及ssh密钥放入容器,从而避免ansible环境冲突问题。
1、下载镜像(找一台能下载的主机pull镜像,这里默认已经导入镜像)
[root@k8s-sdjw-ansible-11 kubespray-2.18.1]# docker pull quay.io/kubespray/kubespray:v2.17.1
2、使用绑定挂载将目录和ssh密钥放入容器
[root@k8s-sdjw-ansible-11 kubespray-2.18.1]# docker run --rm -it --mount type=bind,source="${HOME}"/.ssh/id_rsa,dst=/root/.ssh/id_rsa --mount type=bind,source=/data/kubernetes-tools/kubespray-2.18.1,dst=/kubespray quay.io/kubespray/kubespray:v2.17.1 bash
root@e487037428a6:/kubespray#
3、使用真实的hostname,(否则会自动把你的hostname改成node1/node2...这种)
root@e487037428a6:/kubespray# export USE_REAL_HOSTNAME=true
3、指定配置文件位置
root@e487037428a6:/kubespray# export CONFIG_FILE=inventory/mycluster/hosts.yaml
4、定义ip列表(你的服务器内网ip地址列表,3台及以上,前两台默认为master节点)
root@e487037428a6:/kubespray# 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@6a97c8fa970c:/kubespray# python3 contrib/inventory_builder/inventory.py ${IPS[@]}
操作步骤如下所示:
查看主机名,确认USE_REAL_HOSTNAME=true生效
root@e487037428a6:/kubespray# cat inventory/mycluster/hosts.yaml
root@e487037428a6:/kubespray# ansible-playbook -i inventory/mycluster/hosts.yaml --become --become-user=root cluster.yml
或带详细日志
root@e487037428a6:/kubespray# ansible-playbook -i inventory/mycluster/hosts.yaml --become --become-user=root cluster.yml -vvvv
1.查看节点状态
2.查看pod信息
3.查看集群各组件状态
4.查看docker及containerd版本
说真的,离线部署kubespray真的很不容易,当然我不是说有多难,只是离线部署要考虑的东西比较多,需要你有耐心的进行一次次的是错,一次次的验证。这篇文档,个人感觉应该算是比较全了。这里将部署注意的事项列出来,避免大家踩坑。
1、docker 20.10.11本地yum源制作
在kubespray-v2.18.1版本中默认安装的docker版本为为20.10,在roles/container-engine/docker/vars/redhat.yml文件中可以看到,docker-ce支持的最新版本为20.10.11,docker-ce-cli支持的最新版本为20.10.11,以及依赖包containerd.io支持的最新版本为1.4.12,当然这些也是默认安装的版本,但是我们在通过下载docekr-ce 20.10.11和docker-ce-cli 20.10.11时离线rpm包时,发现containerd.io的版本为1.5.11,我尝试过下载1.4.12版本,但是部署失败,所以只能修改源码,将支持的最新版本修改1.4.12版本修改为1.5.12,同时也将默认安装的containerd.io修改为1.5.12
2、修改docker本地yum配置
在kubespray工具中,docker默认使用的是官方yum源,如果你要修改为本地yum源,你需要修改roles/container-engine/docker/templates/rh_docker.repo.j2中的repo模板,这个必须跟你内网环境中docker-ce 内部本地yum源配置信息保持一致。
3、系统依赖环境包
使用kubespray工具部署k8s集群,需要安装一些系统依赖包,内网环境下,可能无法获取或版本不支持,建议你在互联网环境部署,将主机yum 缓存开启,将所有的rpm包进行汇总,在内网主机部署k8s集群前,将这些依赖包提前安装好。
更多详细内容请参考:企业级K8s集群运维实战