《Kubernetes部署篇:基于docker使用kubeasz工具二进制离线部署高可用K8S集群(国内专网方案)》



一、部署背景简介

根据公司业务场景的不同,你可能需要部署几套或几十套 二进制K8S高可用集群,面对繁琐的部署步骤,你可能望而却步,急需自动化的K8S部署工具,kubeasz就可以很好的解决你的问题。

基于《Kubernetes部署篇:基于docker使用kubeasz工具二进制部署高可用K8S集群(互联网方案一)》参照部署,根据实际部署版本需求,有可能你需要部署的版本与默认版本不一致,或者说你需要部署的版本在kubeasz官方的docker仓库里也是没有的,那么该如何定制化自己k8s版本的高可用集群呢?

这里使用kubeasz-3.1.1版本,来部署k8s 1.22.8高可用集群,默认官方1.22版本最高支持1.22.5,请查看easzlab官方镜像仓库


二、部署工具介绍

说明:使用kubeasz-3.1.1,详情请右键点击打开超链接。

当前kubeasz工具版本要求如下:

注意1:确保各节点时区设置一致、时间同步。如果你的环境没有提供NTP 时间同步,推荐集成安装chrony
注意2:确保在干净的系统上开始安装,不要使用曾经装过kubeadm或其他k8s发行版的环境。
注意3:建议操作系统升级到新的稳定内核。
注意4:在公有云上创建多主集群,请结合阅读在公有云上部署kubeasz


三、部署方案介绍

根据网络环境及部署需求,综合有如下四种部署方案:
方案一:基于docker使用kubeasz工具在线部署二进制高可用kubernetes集群
方案一:基于containerd使用kubeasz工具在线部署二进制高可用kubernetes集群
方案三:基于docker使用kubeasz工具离线部署二进制高可用kubernetes集群
方案四:基于containerd使用kubeasz工具离线部署二进制高可用kubernetes集群


四、部署环境信息

说明:由于服务器资源有限,演示环境共五台服务器,按如下规划进行部署。

IP地址 主机名 操作系统 内核版本 K8S版本 角色
192.168.1.11 k8s-sdjw-ansible-190 centos7.6.1810 5.4.13 ansible-client
192.168.1.12 k8s-sdjw-ansible-191 centos7.6.1810 5.4.13 v1.22.2 控制节点
192.168.1.19 k8s-sdjw-test-192 centos7.6.1810 5.4.13 v1.22.2 控制节点
192.168.1.20 k8s-sdjw-test-193 centos7.6.1810 5.4.13 v1.22.2 工作节点
192.168.1.21 k8s-sdjw-test-194 centos7.6.1810 5.4.13 v1.22.2 工作节点

五、部署资源下载

说明:这里使用kubespray-3.1.1版本来安装K8S v1.22.8。
基于docker使用kubeasz工具部署高可用K8S集群(国内互联网方案二)部署资源包

资源信息列表如下:
在这里插入图片描述


六、部署准备工作

6.1、系统内核升级

说明:当前操作需在 所有主机上执行,执行更新后 必须重启服务器
在这里插入图片描述
如下所示:
在这里插入图片描述


6.2、设置主机名

说明:当前操作需在 所有主机上执行,请根据部署环境信息中的主机名 分别对部署主机进行主机名设置

[root@localhost ~]# hostnamectl set-hostname k8s-sdjw-ansible-190
[root@localhost ~]# hostnamectl set-hostname k8s-sdjw-test-191
[root@localhost ~]# hostnamectl set-hostname k8s-sdjw-test-192
[root@localhost ~]# hostnamectl set-hostname k8s-sdjw-test-193
[root@localhost ~]# hostnamectl set-hostname k8s-sdjw-test-194
[root@localhost ~]# hostnamectl set-hostname k8s-sdjw-test-198

6.3、环境初始化

说明:当前操作需在 所有主机上执行,环境初始化内容包括: 关闭防火墙、关闭selinux、关闭swap、内核参数 配置完成后需再次重启服务器,内核参数vm.swappiness重启才生效。
在这里插入图片描述


6.4、安装基础包

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


6.5、ssh多机互信

说明:当前操作只需在 ansible-主控端主机上执行,即当前环境192.168.1.190主机

1、使用ssh-keygen工具生成秘钥
在这里插入图片描述
2、执行脚本

[root@k8s-sdjw-ansible-190 basic-env]# ./ssh_key.sh root 192.168.1.191 123456 /root/.ssh/id_rsa.pub /root/.ssh/id_rsa 22
[root@k8s-sdjw-ansible-190 basic-env]# ./ssh_key.sh root 192.168.1.192 123456 /root/.ssh/id_rsa.pub /root/.ssh/id_rsa 22
[root@k8s-sdjw-ansible-190 basic-env]# ./ssh_key.sh root 192.168.1.193 123456 /root/.ssh/id_rsa.pub /root/.ssh/id_rsa 22
[root@k8s-sdjw-ansible-190 basic-env]# ./ssh_key.sh root 192.168.1.198 123456 /root/.ssh/id_rsa.pub /root/.ssh/id_rsa 22

如下图所示:
在这里插入图片描述


6.6、配置时间同步

说明:配置时间同步操作需在 所有主机上执行。,如果你有自己的时间同步服务器,可配置为自己的时间服务器地址。

crontab -e
*/2 * * * * /usr/sbin/ntpdate ntp1.aliyun.com &>/dev/null

说明:你也可以使用chrony工具来实现时间同步


6.7、安装ansible

说明:当前操作只需在 ansible-主控端主机上执行,即当前环境192.168.1.190主机。

# 注意pip 21.0以后不再支持python2和python3.5,需要如下安装
# To install pip for Python 2.7 install it from https://bootstrap.pypa.io/2.7/ :
[root@k8s-sdjw-ansible-190 ~]# curl -O https://bootstrap.pypa.io/pip/2.7/get-pip.py
[root@k8s-sdjw-ansible-190 ~]# python get-pip.py
[root@k8s-sdjw-ansible-190 ~]# python -m pip install --upgrade "pip < 21.0"
 
# pip安装ansible(国内如果安装太慢可以直接用pip阿里云加速)
[root@k8s-sdjw-ansible-190 basic-env]# pip install ansible -i https://mirrors.aliyun.com/pypi/simple/

如下图所示:
在这里插入图片描述


七、部署操作步骤

官方Github离线安装集群

说明: 在一台能够访问互联网的服务器上执行,在当前环境下为主机192.168.1.215,可上互联网

7.1、离线文件准备

1、下载工具脚本ezdown,举例使用kubeasz版本3.1.1

[root@k8s-sdjw-test-215 ~]# export release=3.1.1
[root@k8s-sdjw-test-215 ~]# curl -C- -fLO --retry 3 https://github.com/easzlab/kubeasz/releases/download/${release}/ezdown
chmod +x ./ezdown

2、使用工具脚本下载

#默认下载最新推荐k8s/docker等版本(更多关于ezdown的参数,运行./ezdown 查看)
[root@k8s-sdjw-test-215 ~]# ./ezdown -D

#可选下载离线系统包 (适用于无法使用yum/apt仓库情形)
[root@k8s-sdjw-test-215 ~]# ./ezdown -P

#可选下载harbor镜像
[root@k8s-sdjw-test-215 ~]# ./ezdown -R

说明:上述脚本运行成功后,所有文件(kubeasz代码、二进制、离线镜像)均已整理好放入目录/etc/kubeasz

#1、/etc/kubeasz 包含 kubeasz 版本为 ${release} 的发布代码
#2、/etc/kubeasz/bin 包含 k8s/etcd/docker/cni 等二进制文件
#3、/etc/kubeasz/down 包含集群安装时需要的离线容器镜像
#4、/etc/kubeasz/down/packages 包含集群安装时需要的系统基础软件
#离线文件不包括:管理端ansible 安装,但可以使用容器化方式运行kubeasz安装命令和其他更多kubernetes插件镜像	

3、默认下载的kubernetes版本为1.22.2,这里下载好kubernetes 1.22.8二进制包,解压后将server/bin目录下的kube-apiserver、kube-controller-manager、kube-scheduler、kubelet、kube-proxy、kubectl与/etc/kubeasz/bin目录下的相同文件进行替换,操作步骤如下:

#1、下载k8s 1.22.8版本二进制包
[root@k8s-sdjw-test-215 ~]# K8S_VER=v1.22.8
[root@k8s-sdjw-test-215 ~]# wget https://dl.k8s.io/$K8S_VER/kubernetes-server-linux-amd64.tar.gz
[root@k8s-sdjw-test-215 ~]# tar kubernetes-server-linux-amd64.tar.gz

#2、替换k8s相关二进制文件
[root@k8s-sdjw-test-215 ~]# \cp kubernetes/server/bin/{kubectl,kubelet,kube-proxy} /etc/kubeasz/bin/
[root@k8s-sdjw-test-215 ~]# \cp kubernetes/server/bin/{kube-apiserver,kube-controller-manager,kube-scheduler} /etc/kubeasz/bin/

4、将192.168.1.250主机上/etc/kubeasz目录拷贝到ansible主控端主机上,即为当前环境192.168.1.190主机上的/etc目录下。


7.2、创建集群配置实例

1、创建集群配置实例

[root@k8s-sdjw-ansible-190 kubeasz]# pwd
/etc/kubeasz
[root@k8s-sdjw-ansible-190 kubeasz]# ./ezctl new mycluster

如下图所示:
在这里插入图片描述
说明:然后根据提示配置/etc/kubeasz/clusters/mycluster/hosts 和 /etc/kubeasz/clusters/mycluster/config.yml;根据前面节点规划修改hosts文件和其他集群层面的主要配置选项;其他集群组件等配置项可以在config.yml文件中修改。


7.3、个性化配置

说明:hosts和config.yml文件需要根据自己部署需求和实际环境情况进行修改。

1、修改/etc/kubeasz/clusters/mycluster/hosts文件
说明:hosts文件的信息,主要是 [etcd] 、[kube_master]、[kube_node] 等信息

[root@k8s-sdjw-ansible-190 kubeasz]# vim /etc/kubeasz/clusters/mycluster/hosts
[etcd]
192.168.1.191 #此处必须修改
192.168.1.192 #此处必须修改
192.168.1.193 #此处必须修改
[kube_master]
192.168.1.191 #此处必须修改
192.168.1.192 #此处必须修改
[kube_node]
192.168.1.193 #此处必须修改
192.168.1.198 #此处必须修改
[harbor]
[ex_lb]
[chrony]
[all:vars]
SECURE_PORT="6443" #此处不修改
CONTAINER_RUNTIME="docker" #此处修改,根据实际情况修改,默认为docker
CLUSTER_NETWORK="calico" #此处修改,根据实际情况修改,默认为flannel
PROXY_MODE="ipvs" #此处不修改
SERVICE_CIDR="10.96.0.0/16" #此处修改,根据实际情况修改
CLUSTER_CIDR="10.48.0.0/16" #此处修改,根据实际情况修改
NODE_PORT_RANGE="30000-40000" #此处修改,根据实际情况修改
CLUSTER_DNS_DOMAIN="cluster.local" #此处不修改
bin_dir="/opt/kube/bin" #此处不修改
base_dir="/etc/kubeasz" #此处不修改
cluster_dir="{
    
    { base_dir }}/clusters/mycluster" #此处不修改,自动生成无需修改
ca_dir="/etc/kubernetes/ssl" #此处不修改

2、修改/etc/kubeasz/clusters/mycluster/config.yml文件
说明:config.yml 文件的信息,主要是CLUSTER_NAME 等信息

[root@k8s-sdjw-ansible-190 kubeasz]# vim /etc/kubeasz/clusters/mycluster/config.yml
INSTALL_SOURCE: "offline"  #设置离线安装
CALICO_IPV4POOL_IPIP: "always"  #默认不修改
IP_AUTODETECTION_METHOD: "interface=ens.*"  #网卡自动发现,选择此模式
DOCKER_STORAGE_DIR: "/data/k8s/docker"  #根据实际情况填写,建议选择磁盘空间最大分区下目录
INSECURE_REG: '["127.0.0.1/8"]'  #私有仓库地址,根据实际情况填写,我这里没有搭建私有仓库,就默认没有修改
ETCD_DATA_DIR: "/data/k8s/etcd" #根据实际情况填写,建议选择磁盘空间最大分区下目录
KUBELET_ROOT_DIR: "/data/k8s/kubelet"  #根据实际情况填写,建议选择磁盘空间最大分区下目录
dns_install: "yes" #这里必须安装,使用本地dns,解析速度快
metricsserver_install: "yes" #这里选择安装,根据实际情况修改
dashboard_install: "no"  #这里选择不安装,根据实际情况修改
ingress_install: "no" #这里选择不安装,根据实际情况修改
prom_install: "no" #这里选择不安装,根据实际情况修改
nfs_provisioner_install: "no" #这里选择不安装,根据实际情况修改

7.4、执行离线一键安装

说明:当前操作只需在 ansible-主控端主机上执行,即当前环境192.168.1.190主机。

#1、离线安装docker,检查本地文件,正常会提示所有文件已经下载完成
[root@k8s-sdjw-ansible-190 kubeasz]# ./ezdown -D

#2、启动kubeasz容器
[root@k8s-sdjw-ansible-190 kubeasz]# ./ezdown -S

#3、启动kubeasz容器
[root@k8s-sdjw-ansible-190 kubeasz]# docker exec -it kubeasz bash
bash-5.1# cd /etc/kubeasz
bash-5.1# ./ezctl setup mycluster all

一键部署全程无报错,如下图所示:
在这里插入图片描述


八、验证集群及组件状态

8.1、验证k8s集群状态

说明:controller-manager Unhealthy Get “https://127.0.0.1:10257/healthz”: dial tcp 127.0.0.1:10257: connect: connection refused
在这里插入图片描述
说明:出现这个报错是因为/etc/systemd/system/kube-controller-manager.servic配置文件种定义的配置–bind-address=192.168.1.192绑定的地址是192.168.1.192,不是127.0.0.1,由于后面需要搭建prometheus监控系统,如果设置为127.0.0.1,则无法监控到controller-manager这个组件,如果设置为0.0.0.0,则有点不太安全,所以你可以忽略它,如果你无法忽略它,则建议改成0.0.0.0。

根据上述图可以看出kube-controller-manager部署在192.168.1.191和192.168.1.192主机上,分别修改如下配置:

[root@k8s-sdjw-test-191 ~]# vi /etc/systemd/system/kube-controller-manager.service
--bind-address=0.0.0.0 \
[root@k8s-sdjw-test-191 ~]# systemctl daemon-reload
[root@k8s-sdjw-test-191 ~]# systemctl restart kube-controller-manager

[root@k8s-sdjw-test-192 ~]# vi /etc/systemd/system/kube-controller-manager.service
--bind-address=0.0.0.0 \
[root@k8s-sdjw-test-192 ~]# systemctl daemon-reload
[root@k8s-sdjw-test-192 ~]# systemctl restart kube-controller-manager

如下图所示,则表明成功解决
在这里插入图片描述
注意: 你也可以在ansible-主控端上执行docker exec -it kubeasz bash进容器查看k8s集群状态,即192.168.1.190主机上,如下图所示:
在这里插入图片描述


8.2、验证calico网络状态

验证calico网络状态

[root@k8s-sdjw-test-191 ~]# /opt/kube/bin/calicoctl node status
[root@k8s-sdjw-test-191 ~]# route -n
[root@k8s-sdjw-test-191 ~]# netstat -antlp|grep ESTABLISHED|grep 179
[root@k8s-sdjw-test-191 ~]# ip a

如下图所示:
在这里插入图片描述


8.2、验证etcd集群状态

验证etcd集群状态,三台 etcd 的输出均为 healthy 时表示集群服务正常。

#1、systemctl status etcd 查看服务状态
#2、journalctl -u etcd 查看运行日志
# 3、在任一 etcd 集群节点上执行如下命令
# 根据hosts中配置设置shell变量 $NODE_IPS
export NODE_IPS="192.168.1.191 192.168.1.192 192.168.1.193"
for ip in ${NODE_IPS}; do
  ETCDCTL_API=3 /opt/kube/bin/etcdctl \
  --endpoints=https://${ip}:2379  \
  --cacert=/etc/kubernetes/ssl/ca.pem \
  --cert=/etc/kubernetes/ssl/etcd.pem \
  --key=/etc/kubernetes/ssl/etcd-key.pem \
  endpoint health; done

如下图所示:
在这里插入图片描述


8.4、验证各组件状态

如下所示:

# 查看进程状态
systemctl status kube-apiserver
systemctl status kube-controller-manager
systemctl status kube-scheduler
# 查看进程运行日志
journalctl -u kube-apiserver
journalctl -u kube-controller-manager
journalctl -u kube-scheduler

总结:整理不易,如果对你有帮助,可否点赞关注一下?

更多详细内容请参考:企业级K8s集群运维实战

猜你喜欢

转载自blog.csdn.net/m0_37814112/article/details/124689158