离线安装高可用K3S与Rancher
最近我一个同事问我如何安装Rancher和K3S?同事一边问一边抱怨资料不好找,官方文档不明所以,然后各种技术群也没有什么有效指导文件。我去检索了一下,突然发现貌似真的没有谁的博客写了完整的流程,我直接惊了,随后我记得我当年部署有记录笔记的,所以就去翻了一下我多年来积累的笔记,发现里面确实现成的,所以就把笔记整理了一下发出来,给大家参考。
安装部署K3S
首先是下载二进制文件和镜像文件:https://github.com/k3s-io/k3s/releases
然后就是导入镜像:
docker image load k3s-airgap-images-amd64.tar.zst
将k3s二进制文件放到/usr/local/bin路径下,同时给执行权限
chmod +x /usr/local/bin/k3s
将安装脚本放到本地,地址:https://get.k3s.io/
执行主控的安装命令
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"
如果需要创建工作节点进入集群:
# 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
如果需要创建其他主控进入集群
# 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文件不在默认位置需要手动复制一下
cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
然后正常安装helm的二进制文件即可,下载地址:https://github.com/helm/helm/releases
检查一下是否正常
helm ls --all-namespaces
安装cert-manager
添加helm仓库
helm repo add jetstack https://charts.jetstack.io
直接安装
helm install cert-manager jetstack/cert-manager \ --namespace cert-manager \ --create-namespace \ --set crds.enabled=true
检查是否正常
kubectl get pods --namespace cert-manager
安装Rancher
添加helm仓库
helm repo add rancher-stable https://releases.rancher.com/server-charts/stable
安装rancher(自动创建证书)
# 如果使用rancher自签名证书直接安装即可,需要cert-manager helm install rancher rancher-stable/rancher \ --namespace cattle-system \ --set hostname=rancher.my.com \ --set bootstrapPassword=xxxxxxx
安装rancher(自签名证书)
# 如果使用自签名的证书,无需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
如果是自签名证书,需要手动配置一下证书
kubectl -n cattle-system create secret tls tls-rancher-ingress \ --cert=tls.crt \ --key=tls.key
如果是自签名的CA证书,需要配置这个证书到rancher,然后重启即可,rancher会自动创建证书
kubectl -n cattle-system create secret generic tls-ca \ --from-file=cacerts.pem=./cacerts.pem
检查安装是否正常完成
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会定期自行更新。