第四步上:安装rancher,搭建K8s集群
第四步比较复杂,因此准备分上中下三篇文章来介绍,本次采用rancher来部署K8s集群,选择rancher如下:
1)部署K8s简单,有一个不是那么复杂的管理界面
2)rancher自带了,监控,存储,告警应用,可以直接在管理界面部署,不用额外找方案
具体部署环境如下
服务器IP | 用途 | 环境说明 |
10.10.10.5 | 部署rancher | centos 8 安装docker |
10.10.10.6 | k8s-master1 ,etcd | centos 8 安装docker |
10.10.10.7 | k8s-master2 ,etcd | centos 8 安装docker |
10.10.10.8 | k8s-master3,etcd | centos 8 安装docker |
10.10.10.9 | k8s-node1,worker | centos 8 安装docker |
10.10.10.10 | k8s-node2,worker | centos 8 安装docker |
1、部署rancher,选用rancher2.7.1
在10.10.10.5 运行如下命令:
docker run -itd -p 80:80 -p 443:443 -v /opt/rancher:/var/lib/rancher --restart=unless-stopped --privileged=true --name rancher -e CATTLE_AGENT_IMAGE="registry.cn-hangzhou.aliyuncs.com/rancher/rancher-agent:v2.7.1" registry.cn-hangzhou.aliyuncs.com/rancher/rancher:v2.7.1
通过docker log,发现rancher无法启动,可以尝试运行如下命令,具体这两个命令有什么用,我也不清楚,我是在rancehr github上面看到帖子,每次我重启rancher后都会无法正常启动,都是通过运行这两条命令后,就正常了
modprobe ip_tables
echo 'ip_tables' >> /etc/modules
如果一切正常,在浏览器访问 https://10.10.10.5 ,按照提示,用docker log找到密码,登录rancher
2、在10.10.10.6 k8s-master1作如下准备工作
1)、 安装docker,编辑配置文件,加入镜像仓库地址,然后重启docker,
vim /etc/docker/daemon.json,输入如下内容
{
"insecure-registries":["10.10.10.3:3443"], #10.10.10.3是harbor安装地址,可以参考步骤3
"data-root":"/home/software/docker" #修改docker文件存放路径
}
systemctl daemon-reload && systemctl enable docker && systemctl enable containerd && systemctl restart docker
2)、 按顺序输入如下命令:
#设置机器hostname
hostnamectl set-hostname master-1 #根据用途设置主机名
#关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
#关闭selinux(linux的安全机制)
sed -i 's/enforcing/disabled/' /etc/selinux/config
setenforce 0
getenforce #关闭后确认,输出Permissive表示已经关闭
#关闭swap(关闭内存交换)
swapoff -a
sed -ri 's/.*swap.*/#&/' '/etc/fstab'
free -m # 检查,确保swap里面显示是0
#安装IPVS模块,允许 iptables 桥接流量
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack_ipv4
EOF
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
EOF
sysctl --system #是上述配置生效
#启动时间同步
systemctl start chronyd
systemctl enable chronyd
date
#重启服务器,然后输入如下命令验证
lsmod | grep br_netfilter
lsmod | grep -e ip_vs -e nf_conntrack_ipv4
最终结果如下图:
3、在rancher新建k8s集群,具体步骤如下
1)、选择rke1集群,曾经试过选择rke2,但从来没有成功部署过,但如果不通过rancher 部署,通过下载rke2离线安装包,就能成功部署,估计是拉不到镜像造成的,不过rke2不用docker,不太习惯,最终还是选择了rke1
2),录入k8s集群配置,这里要注意如下几个配置
具体关于minio可以参考如何通过开源项目搭建私有云平台--第一步:安装Minio_一个平凡的农民工的博客-CSDN博客
3、如果上述配置完成就会生成安装命令,根据需要选择节点角色,然后复制命令到10.10.10.6 运行,具体如下图:
4、修改网络配置,第一个master安装成功后,k8s集群已经成功部署了,不要那么快安装其他节点,先把网络配置修改,让集群支持IPVS和BGP,具体做法如下
1)在进群管理,编辑某个集群yaml文件,找到如下配置
把kube-proxy配置,改成如下,具体如下图:
kubeproxy:
extra_args:
proxy-mode: ipvs
extra_binds:
- '/lib/modules:/lib/modules:ro'
2) 在master1节点,重启docker restart kube-proxy,安装 yum install ipvsadm -y,运行如下命令验证 ip add|grep ipvs 和 ipvsadm -Ln,具体如下图
3)找到calico deamonset,修改calico配置,支持BGP,具体如下图:
点击“编辑配置”,进入编辑界面,将环境变量CALICO_IPV4POOL_IPIP 设置Off,添加新环境变量FELIX_IPINIPENABLED为 false,具体如下图:
4)、重启master1机器,这里就是为什么部署第一节点后,不要那么快部署其他节点,如果不预先配置好网络,等整个集群部署完了,需要每台机器都要重启,现在只需要重启1次,后面新加入的机器自动就会支持BGP,重启完后,在master1机器上进行验证
修改之前如下图:
修改之后并重启后如下图:
5)、由于网络配置发生了变化,要去rancher安装的服务器上,重启rancher容器,如果不重启,可能会造成rancher无法远程接入容器,如果重启后rancher无法正常启动,运行安装时提到的两条命令
5、重复第2步,修改剩余的机器的配置,并从rancher复制安装命令到每个机器上运行,搭建整个K8s集群
6、验证备份,进入具体某个K8s集群,尝试生成快照,会显示在S3保存快照,打开Minio对应的桶,能看到备份文件,具体如下图:
7、为了后续方便管理,随便找一台master节点,安装kubectl,具体步骤如下:
1)下载kubectl
curl -LO https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl
2)下载后,运行如下命令进行部署:
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
3)从rancher进入某个集群,点击右上角按钮,下载k8s集群配置文件 ,具体如下图:
注意下载后要把集群配置文件里面,将涉及rancher地址的环境删除掉,只保留master地址,具体做法如下:
在配置文件找到rancher安装的IP地址,然后把整块-name删除掉
确保最后一行current-context: 后面不是被删除的名字,可以换成contexts:下面的与rancher不相关的其他名字
这一步比较重要,因为默认K8s集群是通过rancher来转发请求的,如果rancher所在的服务器down了,kubectl就无法发出命令了,要直接改成master相关的上下文。
4)在服务器建立目录/root/.kube/config,将从rancher下载的配置文件上传到该目录
5)进入root目录,vim .bash_profile(前面有一个点),添加如下行
export KUBECONFIG=/root/.kube/config/<rancher下载配置文件名>.yaml
6) 运行 source .bash_profile 使配置生效,运行kubectl get pod -A验证是否能显示所有pod