离线安装高可用K3S与Rancher
最近我一个同事问我如何安装Rancher和K3S?同事一边问一边抱怨资料不好找,官方文档不明所以,然后各种技术群也没有什么有效指导文件。我去检索了一下,突然发现貌似真的没有谁的博客写了完整的流程,我直接惊了,随后我记得我当年部署有记录笔记的,所以就去翻了一下我多年来积累的笔记,发现里面确实现成的,所以就把笔记整理了一下发出来,给大家参考。
安装部署K3S
首先是下载二进制文件和镜像文件:https://github.com/k3s-io/k3s/releases
然后就是导入镜像:
1
docker image load k3s-airgap-images-amd64.tar.zst
将k3s二进制文件放到/usr/local/bin路径下,同时给执行权限
1
chmod +x /usr/local/bin/k3s
将安装脚本放到本地,地址:https://get.k3s.io/
执行主控的安装命令
1
2
3
4
5
INSTALL_K3S_SKIP_DOWNLOAD=true ./install.sh
# 一般来说还是使用docker作为容器运行时需要添加:
INSTALL_K3S_SKIP_DOWNLOAD=true INSTALL_K3S_EXEC="--docker" ./install.sh
# 如果需要使用第三方独立的数据库则添加(默认使用ETCD数据库,相对安全但是资源占用较大):
K3S_DATASTORE_ENDPOINT="mysql://username:password@tcp(hostname:3306)/database-name"
如果需要创建工作节点进入集群:
1
2
# toekn值需要在主控节点的/var/lib/rancher/k3s/server/token获取
INSTALL_K3S_SKIP_DOWNLOAD=true INSTALL_K3S_EXEC="--docker" K3S_URL=https://主控IP:6443 K3S_TOKEN=token ./install.sh
如果需要创建其他主控进入集群
1
2
# toekn值需要在主控节点的/var/lib/rancher/k3s/server/token获取
INSTALL_K3S_SKIP_DOWNLOAD=true INSTALL_K3S_EXEC="server --docker" K3S_URL=https://主控IP:6443 K3S_TOKEN=token ./install.sh
在集群部署Rancher
rancher可以直接部署在docker上而不需要必须放到一个k8s集群里面,但是单机部署的rancher没有高可用的能力,如果你已经有了一个集群那肯定是之间运行在集群里面方便一点。下面是基础的安装需要:
-
不是所有的k3s都可以部署rancher的,有一个版本对应关系,参考https://www.suse.com/suse-rancher/support-matrix/all-supported-versions/rancher-v2-9-2/
-
需要一个helm的工具终端,基于k8s部署那肯定是使用helm是最合理的
-
需要自行准备证书或者安装cert-manager自动创建证书
安装helm
首先k8s和标准的k8s的不同,kubeconfig文件不在默认位置需要手动复制一下
1
cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
然后正常安装helm的二进制文件即可,下载地址:https://github.com/helm/helm/releases
检查一下是否正常
1
helm ls --all-namespaces
安装cert-manager
添加helm仓库
1
helm repo add jetstack https://charts.jetstack.io
直接安装
1
2
3
4
helm install cert-manager jetstack/cert-manager \
--namespace cert-manager \
--create-namespace \
--set crds.enabled=true
检查是否正常
1
kubectl get pods --namespace cert-manager
安装Rancher
添加helm仓库
1
helm repo add rancher-stable https://releases.rancher.com/server-charts/stable
安装rancher(自动创建证书)
1
2
3
4
5
# 如果使用rancher自签名证书直接安装即可,需要cert-manager
helm install rancher rancher-stable/rancher \
--namespace cattle-system \
--set hostname=rancher.my.com \
--set bootstrapPassword=xxxxxxx
安装rancher(自签名证书)
1
2
3
4
5
6
7
8
9
10
11
12
13
# 如果使用自签名的证书,无需cert-manager,注意这里的ingress.tls.source=secret是固定字符串值,而不是让你把secret改为密钥
helm install rancher rancher-stable/rancher \
--namespace cattle-system \
--set hostname=rancher.my.com \
--set bootstrapPassword=xxxxxxx \
--set ingress.tls.source=secret
# 如果使用的是自签名的机构证书,无需cert-manager
helm install rancher rancher-<CHART_REPO>/rancher \
--namespace cattle-system \
--set hostname=rancher.my.com \
--set bootstrapPassword=admin \
--set ingress.tls.source=secret \
--set privateCA=true
如果是自签名证书,需要手动配置一下证书
1
2
3
kubectl -n cattle-system create secret tls tls-rancher-ingress \
--cert=tls.crt \
--key=tls.key
如果是自签名的CA证书,需要配置这个证书到rancher,然后重启即可,rancher会自动创建证书
1
2
kubectl -n cattle-system create secret generic tls-ca \
--from-file=cacerts.pem=./cacerts.pem
检查安装是否正常完成
1
kubectl -n cattle-system get deploy rancher
这里再说一下配置自签名证书和CA证书的区别:
-
自签名证书:这个证书就仅仅是rancher使用的而已,比如说我们这个配置就是rancher.my.com的证书,当然可以是通配证书,相当于告诉k8s的ingress使用这个证书给rancher创建ingress服务;
-
CA证书:这个证书给rancher之后,后续rancher-agent会使用CA证书自行签名服务证书给自己用,相关续签等事项rancher-agent都会自行完成
关于证书的补充:
虽然说官方提供了自签名和CA两种模式,但是实际上两者的作用范围和安全性本质上没有什么区别所以部署CA的意义其实不大,个人建议使用自签名即可。
这里证书还有一点迷惑性,众所周知,rancher在与k8s集群通信的时候内部还有一个证书,这个证书与我们这会儿配置的证书不是同一个东西,安装时配置的证书只是ingress的https服务使用的证书,rancher内部的证书是其自行管理的,哪怕你外面的https证书过期时间是100年,内部证书的有效期也只有1年而已,rancher会定期自行更新。