离线安装高可用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没有高可用的能力,如果你已经有了一个集群那肯定是之间运行在集群里面方便一点。下面是基础的安装需要:

  1. 不是所有的k3s都可以部署rancher的,有一个版本对应关系,参考https://www.suse.com/suse-rancher/support-matrix/all-supported-versions/rancher-v2-9-2/
  2. 需要一个helm的工具终端,基于k8s部署那肯定是使用helm是最合理的
  3. 需要自行准备证书或者安装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会定期自行更新。

留下回复