官网的话:Rancher 是为使用容器的公司打造的容器管理平台。

安装 Rancher

Docker 单节点安装

如果容器内的 80 端口映射到宿主机的 8xxx,那么容器内的 443 端口要映射到宿主机的 8443。
如果容器内的 80 端口映射到宿主机的 9xxx,那么容器内的 443 端口要映射到宿主机的 9443。

  • docker
1
2
3
4
5
6
##############使用存储卷###############
docker run -d --privileged --name rancher-server \
--restart=unless-stopped \
-p 8080:80 -p 8443:443 \
-v /opt/rancher:/var/lib/rancher \
rancher/rancher:v2.6.3
  • docker-compose
1
2
3
4
5
6
7
8
9
10
11
services:
rancher-server:
image: rancher/rancher:v2.6.3
container_name: rancher-server
privileged: true
restart: "no"
ports:
- "8080:80"
- "8443:443"
volumes:
- /opt/rancher:/var/lib/rancher

基于 Helm 安装 Rancher

如果能使用非自建证书,那将会省下你绝大部分时间去折腾,相信我!!!

ps: 对应版本这块截至 2022 年 2 月 28 日,官方版本还是存在问题的 rancher2.6.3,v1.21.7+k3s1 别用了

现在测试 v2.5.12,v1.20.14+k3s1 没问题

问题已得到解决:https://github.com/rancher/rancher/issues/36589

K3s 集群安装参照 K3s 高可用安装即可

loadbalence: nginx(为 rancher lb 到 443 端口)

1
2
3
4
5
6
7
8
9
10
11
stream {
upstream rancher_servers_https {
least_conn;
server 10.0.2.15:443 max_fails=3 fail_timeout=5s;
server 10.0.2.6:443 max_fails=3 fail_timeout=5s;
}
server {
listen 443;
proxy_pass rancher_servers_https;
}
}

在两台安装完 K3s server 节点上确保安装 Helm

  • helm,可到 Helm 官网下载二进制包直接使用;
  • 添加 Helm Chart 仓库
1
2
3
4
# latest: 建议在尝试新功能时使用。
# stable: 建议在生产环境中使用。(推荐)
# alpha: 未来版本的实验性预览。
helm repo add rancher-<CHART_REPO> http://rancher-mirror.oss-cn-beijing.aliyuncs.com/server-charts/<CHART_REPO>
  • 安装证书

由于 Rancher Server 默认需要 SSL/TLS 配置来保证访问的安全性。

Rancher 中国技术支持团队建议您使用"您已有的证书" ingress.tls.source=secret 这种方式,从而减少对 cert-manager 的运维成本。

Rancher 官方提供的证书生成脚本(https://docs.rancher.cn/docs/rancher2/installation/resources/advanced/self-signed-ssl/_index/#4-%E5%A6%82%E4%BD%95%E7%94%9F%E6%88%90%E8%87%AA%E7%AD%BE%E5%90%8D%E8%AF%81%E4%B9%A6)

1
2
3
4
5
6
7
8
9
--ssl-domain: 生成 ssl 证书需要的主域名,如不指定则默认为 www.rancher.local
--ssl-trusted-ip: 一般 ssl 证书只信任域名的访问请求,有时候需要使用 ip 去访问 server,那么需要给 ssl 证书添加扩展 IP,多个 IP 用逗号隔开;
--ssl-trusted-domain: 如果想多个域名访问,则添加扩展域名(TRUSTED_DOMAIN),多个 TRUSTED_DOMAIN 用逗号隔开;
--ssl-size: ssl 加密位数,默认 2048;
--ssl-cn: 国家代码(2 个字母的代号),默认 CN;

例子:
sh create_self-signed-cert.sh --ssl-domain=rancher.k3s.cn \
--ssl-trusted-ip=114.132.226.171,10.104.30.197 --ssl-trusted-domain=rancher.k3s.cn,www.test.com --ssl-size=2048 --ssl-date=3650
  • 验证 openssl,应该返回状态为 ok
1
openssl verify -CAfile cacerts.pem tls.crt
  • 在 K3s 中创建 Rancher 的命名空间(Namespace)
1
kubectl create namespace cattle-system
  • 添加 TLS
1
2
3
4
5
6
7
kubectl -n cattle-system create secret tls tls-rancher-ingress \
--cert=tls.crt \
--key=tls.key
cp cacerts.pem ca-additional.pem
kubectl -n cattle-system create secret generic tls-ca-additional --from-file=ca-additional.pem=./ca-additional.pem
kubectl -n cattle-system create secret generic tls-ca \
--from-file=cacerts.pem=./cacerts.pem
1
2
3
4
5
6
7
8
helm install rancher rancher-stable/rancher \
--version v2.6.3 \
--namespace cattle-system \
--set hostname=rancher.k3s.cn \
--set bootstrapPassword=admin \
--set ingress.tls.source=secret \
--set privateCA=true \
--set additionalTrustedCAs=true
  • 检查完成状态
1
2
3
4
5
kubectl -n cattle-system rollout status deploy/rancher
# Waiting for deployment "rancher" rollout to finish: 0 of 3 updated replicas are available...
# deployment "rancher" successfully rolled out

kubectl -n cattle-system get deploy rancher

卸载

为了在 Local 集群上彻底卸载掉 Rancher HA,我们可以先筛选出哪些 namespaces 是由 Rancher HA 创建的,然后再通过 system-tools remove --kubeconfig <$KUBECONFIG> --namespace <NAMESPACE> 来删除对应的 namespace 和相关资源。经过测试发现,通过 system-tools 移除 namespace 后,namespace 的状态始终为 Terminating,还需要手动的移除掉 .spec.finalizers.metadata.finalizers,然后才能彻底的将 namespace 删除。

为此,笔者准备了一个 shell 脚本来完成以上的删除流程:

注意:

  • 本脚本只基于 Rancher v2.5.8 上进行测试,理论上 v2.5.x 系列版本均支持。其他版本(例如:2.4.x)需要修改步骤 4 中对应的 NS 参数来设置要删除的 namespace
  • 本脚本在 Local 集群为 k3s 和 rke 集群上做过验证,如 Local 集群为其他 K8s 集群,需要确认步骤 4 中对应的 NS 参数来设置要删除的 namespace
  • Rancher HA 会创建 c-p-user- 开头的 namespace,这些不需要用户关注,当通过 system-tools 移除 cattle-system 会自动将这些 namespace 移除
  1. 下载脚本
1
wget https://raw.githubusercontent.com/kingsd041/some_script/master/remove-rancher-ha/remove_r_ha.sh
  1. 在该主机上安装 kubectljqsystem-tools,并且创建 kubeconfig 文件。

  2. 编辑脚本,设置 KUBE_CONFIG 目录

1
KUBE_CONFIG='/root/.kube/config'
  1. 编辑脚本,确认 NS 变量设置的 namespace 是否为将要被删除的 namespace,避免误删 namespace。
1
NS="cattle-system|*fleet*|rancher-operator-system|cattle-global-nt|cattle-global-data"
  1. 执行脚本,卸载 Rancher HA
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
./remove_r_ha.sh

# cattle-system
# cattle-global-data
# cattle-global-nt
# rancher-operator-system
# fleet-clusters-system
# fleet-local
# cluster-fleet-local-local-1a3d67d0a899
# fleet-system
# fleet-default
# cluster-fleet-default-c-9zwzq-dd029f17f988
# Are you sure to remove the above namespace? [y/n] y
# INFO[0000] Removing Rancher management plane in namespace: [cattle-system]
# INFO[0000] Getting connection configuration
# INFO[0000] Removing Cattle deployment
# INFO[0000] Removed Cattle deployment succuessfully
# INFO[0000] Removing ClusterRoleBindings
# ...
# ...

大约 5 分钟,脚本执行完成。此时,可以通过 kubectl get ns 来确认 Rancher HA 是否被卸载:

1
2
3
4
5
6
kubectl get ns
# NAME STATUS AGE
# kube-public Active 65m
# default Active 65m
# kube-node-lease Active 65m
# kube-system Active 65m

后记

虽然 Rancher v2.5 开始可以将 Rancher HA 安装在任何经过 CNCF 认证的 K8s 集群上,但还是建议大家在生产环境上将 Rancher HA 安装在一个独立的 Local 集群上,这样可以避免 Rancher HA 和业务集群相互影响。如果你将 Rancher HA 安装到了业务 K8s 集群上,可以使用本文的方式去完美的卸载 Rancher HA,对原集群不会有任何影响。

问题记录

  • 当安装完集群后,随机部署了 NodeLocalCache,但发现 Rancher 控制台的 app install 部分出现 Waiting for Kubernetes API to be available 错误,卸载掉 NodeLocalCache 得到解决,原因尚未知晓

  • 可能会遇到 local 集群(Rancher-Docker 本身默认是运行在 K3s 集群内的)无法下载镜像的情况,可以手动进入容器配置下镜像源,然后重启容器即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
vim /etc/rancher/k3s/registries.yaml

mirrors:
"xxx:5000":
endpoint:
- "http://xxx:5000"
"docker.io":
endpoint:
- "https://mirror.ccs.tencentyun.com"
configs:
"xxx:5000":
auth:
username: admin
password: xxx