K8S集群中安装rancher
Rancher 是一个为使用容器的公司打造的容器管理平台。Rancher 使得开发者可以随处运行 Kubernetes(Run Kubernetes Everywhere),满足 IT 需求规范,赋能 DevOps 团队
环境准备:当前已存在k3s集群,直接在集群中安装rancher
| k3s版本 | v1.34 |
| cert-manager版本 | v1.15.5 |
| rancher版本 | v2.14.1 |
1、安装证书管理工具,如下:
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.15.5/cert-manager.crds.yaml
helm repo add jetstack https://charts.jetstack.io
helm repo update
helm install cert-manager jetstack/cert-manager \
--namespace cert-manager \
--create-namespace --version v1.15.5
注:可将yaml下载回来然后执行也行
需要下载两个镜像回来,否则会提示镜像下载失败,如下:
quay.io/jetstack/cert-manager-webhook:v1.15.5
quay.io/jetstack/cert-manager-controller:v1.15.5
quay.io/jetstack/cert-manager-startupapicheck:v1.15.5
quay.io/jetstack/cert-manager-cainjector:v1.15.5
运行成功后,如图:

2、安装rancher,单实例版本,如下:
#添加仓库
helm repo add rancher-latest https://releases.rancher.com/server-charts/latest
kubectl create namespace cattle-system
helm install rancher rancher-latest/rancher \
--namespace cattle-system \
--version 2.14.1 \
--set hostname=rancher.oa.com \
--set replicas=1 \
--set certmanager.install=false \
--timeout 30m0s --wait
- hostname : 指定一个域名
- bootstrapPassword: rancher UI 的登录密码
需要拉取的镜像有:
docker.io/rancher/rancher:v2.14.1
docker.io/rancher/shell:v0.7.0
docker.io/rancher/rancher-webhook:v0.10.4
docker.io/rancher/system-upgrade-controller:v0.19.1
docker.io/rancher/cluster-api-controller:v1.12.2
rancher/fleet:v0.15.1
rancher/fleet-agent:v0.15.1
rancher/turtles:v0.26.1
rancher/kuberlr-kubectl:v7.0.3

给ingress加上注解(不一定有用):
kubectl -n cattle-system annotate ingress rancher \
nginx.ingress.kubernetes.io/backend-protocol="HTTPS" \
nginx.ingress.kubernetes.io/proxy-ssl-verify="false" \
nginx.ingress.kubernetes.io/proxy-connect-timeout="300" \
nginx.ingress.kubernetes.io/proxy-read-timeout="300" \
--overwrite
3、通过域名https://rancher.oa.com打开页面,图中的kubectl get secret可以获取密码,如图:

登录到达设置密码界面,如图:

如果一直卡在正在保存中,可以查看kube-apiserver的日志,日志位置一般在
/var/log/pods/kube-system_kube-apiserver
日志出现大量 Skipping API ... because it has no resources.是正常的,K8s在清理/跳过未启用的API版本。
出现 error resolving cattle-system/imperative-api-extension: service "imperative-api-extension" not found和 calico-apiserver/calico-api: service "calico-api" not found。这是因为集群安装了 Rancher 和 Calico,它们注册了自定义的 APIService(即 v1.ext.cattle.io和 v3.projectcalico.org),但是对应的 Extension API Server(即处理这些 API 的后端服务 Pod)还没有启动完成或者不存在。
日志最后导致了一系列错误:failing or missing response from https://10.96.213.155:6666/apis/ext.cattle.io/v1: Get ... dial tcp 10.96.213.155:6666: connect: connection refused。这说明 kube-apiserver 试图将 ext.cattle.io的请求转发给一个 Pod(IP 10.96.213.155,端口 6666),但该端口拒绝连接
综合来看,这是一个典型的死锁问题:
Kube-apiserver 启动,加载 APIService。
发现 v1.ext.cattle.ioAPIService,尝试将请求路由到 imperative-api-extensionService。
请求到达后端 Pod(即 Rancher Pod),但 Rancher Pod 此时正在启动,并且它需要向 Kube-apiserver 请求资源(List-Watch)。
由于某种原因(也许是 Apiserver 的负载较高,或者 Rancher 的 6666 端口还没就绪),两边都在等待对方,导致死锁
造成死锁的逻辑推演
Kube-apiserver 启动:它加载了集群中的所有 API 资源定义,其中包括 Rancher 注册的 v1.ext.cattle.io。
Apiserver 检查聚合 API 健康状态:Apiserver 会不断地去探测 v1.ext.cattle.io(即 Rancher Pod 的 6666 端口)是否存活。
Rancher Pod 启动:Rancher 启动后,需要向 Kube-apiserver 发起 List-Watch请求,拉取集群的现有资源(比如你刚才点击“保存”时写入的配置)。
发生死锁:
Apiserver 觉得:“Rancher 的扩展 API 没活,我不能正常对外提供服务,我要一直重试等它活过来。”
Rancher 觉得:“Apiserver 一直不给我返回完整的资源列表(Bookmark),我没法完成初始化,我的 6666 端口也就没法就绪。”
结果:两边互相等待,谁也无法进入正常工作状态。
解决方案:
(1)、删除卡死的聚合 API 注册(在 Master 节点执行),把这两个导致 Apiserver 无限报错和等待的 APIService 暂时删掉:
kubectl delete apiservice v1.ext.cattle.io
kubectl delete apiservice v3.projectcalico.org
注:不用担心,这不会影响现有的业务 Pod,只是 Apiserver 暂时不暴露这两个特定的 API 组而已
(2)重启 Kube-apiserver,删除 APIService 后,Apiserver 的负载会立刻减轻。如果你用的是 kubeadm 部署的 K8s,Apiserver 是以 Static Pod 运行的,直接删除它的 Pod 即可(它会自动重新拉起):
# 找到 apiserver 的 pod 名字
kubectl get pods -n kube-system | grep kube-apiserver
# 删除它(会自动重建)
kubectl delete pod -n kube-system kube-apiserver-xxxx
(3)、重启 Rancher Pod,等 Apiserver 重新就绪(大概 10-30 秒),我们再让 Rancher 重新注册它的 API:
kubectl delete pod -n cattle-system -l app=rancher
再次访问,可以正常进入到界面中,如图:



