《Kubernetes部署篇:基于docker使用kubeasz工具二进制离线部署高可用K8S集群(国内专网方案)》
文章目录一、部署背景简介二、部署工具介绍三、部署方案介绍四、部署环境信息五、部署资源下载六、部署准备工作6.1、系统内核升级6.2、设置主机名6.3、环境初始化6.4、安装基础包6.5、ssh多机互信6.6、配置时间同步6.7、安装ansible七、部署操作步骤7.1、下载项目源码、二进制及离线镜像7.2、创建集群配置实例7.3、个性化配置7.4、执行一键安装八、验证集群及组件状态8.1、验证k8
文章目录
一、部署背景简介
根据公司业务场景的不同,你可能需要部署几套或几十套 二进制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/
如下图所示:
七、部署操作步骤
说明: 在一台能够访问互联网的服务器上执行,在当前环境下为主机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网络状态
[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集群运维实战
更多推荐
所有评论(0)