前言:
Rancher 可以安装在任何 Kubernetes 集群上。这个集群可以使用上游 Kubernetes,也可以使用 Rancher 的 Kubernetes 发行版之一,也可以是来自 Amazon EKS 等提供商的托管 Kubernetes 集群。
将Rancher部署到eks集群上可以做到高可用,不会因为单个主机节点服务器的奔溃导致Rancher的数据丢失,而且设置横向的扩展会更加方便。
1. 添加 Helm Chart 仓库
使用helm repo add命令添加含有 Rancher Chart 的 Helm Chart 仓库。
将命令中的<CHART_REPO>,替换为latest,stable或alpha。更多信息,请查看选择 Rancher 版本来选择最适合你的仓库。
- latest: 建议在尝试新功能时使用。
- stable: 建议在生产环境中使用。(推荐)
- alpha: 未来版本的实验性预览。
注意:不支持从 Alpha 到 Alpha 之间的升级。
这里我们用stable的版本部署,每一次都部署都模拟成是生产环境的部署,会少踩许多坑。
helm repo add rancher-stable https://releases.rancher.com/server-charts/stable
国内用户,可以使用放在国内的 Rancher Chart 加速安装:
helm repo add rancher-stable http://rancher-mirror.oss-cn-beijing.aliyuncs.com/server-charts/stable
2. 为 Rancher 创建 Namespace
我们需要定义一个 Kubernetes Namespace,在 Namespace 中安装由 Chart 创建的资源。这个命名空间的名称为 cattle-system:
kubectl create namespace cattle-system
3.选择你的 SSL 选项
Rancher Server 默认需要 SSL/TLS 配置来保证访问的安全性。
提示:
-
Rancher 生成的 TLS 证书: 在这种情况下,你需要在集群中安装 cert-manager。 Rancher 利用 cert-manager 签发并维护证书。Rancher 将生成自己的 CA 证书,并使用该 CA 签署证书。然后 cert-manager 负责管理该证书。
-
Let’s Encrypt: Let’s Encrypt 选项也需要使用 cert-manager。但是,在这种情况下,cert-manager 与 Let’s Encrypt 的特殊颁发者相结合,该颁发者执行获取 Let’s Encrypt 颁发的证书所需的所有操作(包括请求和验证)。此配置使用 HTTP 验证(HTTP-01),因此负载均衡器必须具有可以从公网访问的公共 DNS 记录。
-
使用你已有的证书: 此选项使你可以使用自己的权威 CA 颁发的证书或自签名 CA 证书。 Rancher 将使用该证书来保护 WebSocket 和 HTTPS 流量。在这种情况下,你必须上传名称分别为tls.crt和tls.key的 PEM 格式的证书以及相关的密钥。如果使用私有 CA,则还必须上传该 CA 证书。这是由于你的节点可能不信任此私有 CA。 Rancher 将获取该 CA 证书,并从中生成一个校验和,各种 Rancher 组件将使用该校验和来验证其与 Rancher 的连接。
这里因为我们使用ingress创建的alb已经有了rancher域名的证书,所以我们不需要生成证书或者导入本地证书,可以直接跳过选择证书的阶段。
4.根据你选择的 SSL 选项,通过 Helm 安装 Rancher
在此选项中,将使用自己alb上绑定的证书以供 Rancher 使用。
运行这个命令时,hostname 选项必须与服务器证书中的 Common Name 或 Subject Alternative Names 条目匹配,否则 Ingress controller 将无法正确配置。
尽管技术上仅需要Subject Alternative Names中有一个条目,但是拥有一个匹配的 Common Name 可以最大程度的提高与旧版浏览器/应用程序的兼容性。
如果你想检查证书是否正确,请查看如何在服务器证书中检查 Common Name 和 Subject Alternative Names。
如上所述,为你的证书设置适当的hostname。
将replicas设置为 Rancher 部署所使用的复制数量。默认为 3;如果你的集群中少于 3 个节点,你应填写实际节点数量。
设置ingress.tls.source为secret。
要安装一个特定的 Rancher 版本,使用–version 标志,例如:–version 2.8。
先设置一个初始密码
helm install rancher rancher-stable/rancher \
--namespace cattle-system \
--set hostname=rancher.xxxx.xxx \
--set replicas=3 \
--set bootstrapPassword=wakewake123 \
--set ingress.tls.source=secret
注意的坑:
1.上面设置bootstrapPassword只是为了在secret里面出现bootstrap-secret,实际在eks集群部署Rancher中有很大的可能你设置的初始密码会不生效,导致自己锁在索要初始密码的界面。在设置了bootstrapPassword不生效后就可以是使用命令修改初始密码登录Rancher修改密码了。
修改密码指令:
kubectl -n cattle-system exec $(kubectl -n cattle-system get pods -l app=rancher | grep ‘1/1’ | head -1 | awk ‘{ print $1 }’) – reset-password
2.使用ambassador设置路由的时候需要增加参数,在mapping里面增加配置,允许websock访问,这样才能使用rancher的kubectl和查看pod日志等功能。
allow_upgrade:
- websocket
允许websock访问后,rancher的kubectl和查看pod日志功能就正常了
3.在rancher v2.9+的版本中,默认安装的rancher它的(agent-tls-mode)代理的证书验证的标准是严格的,需要将它改成System Store,不然在我们尝试导入k8s集群到rancher的时候会提示找不到本地的证书路径。因为使用ambassador路由流量,alb里面的证书,根本就没有用到rancher自己的证书。这样就会导致我们的agent 连不上rancher,导致无法在rancher管理我们的集群。
出现的错误:
$ kubectl logs cattle-cluster-agent-678bd7b8fb-6c9fw -c cluster-register -n cattle-system
INFO: Environment: CATTLE_ADDRESS=10.42.6.5 CATTLE_CA_CHECKSUM= CATTLE_CLUSTER=true CATTLE_CLUSTER_AGENT_PORT=tcp://10.43.5.109:80 CATTLE_CLUSTER_AGENT_PORT_443_TCP=tcp://10.43.5.109:443 CATTLE_CLUSTER_AGENT_PORT_443_TCP_ADDR=10.43.5.109 CATTLE_CLUSTER_AGENT_PORT_443_TCP_PORT=443 CATTLE_CLUSTER_AGENT_PORT_443_TCP_PROTO=tcp CATTLE_CLUSTER_AGENT_PORT_80_TCP=tcp://10.43.5.109:80 CATTLE_CLUSTER_AGENT_PORT_80_TCP_ADDR=10.43.5.109 CATTLE_CLUSTER_AGENT_PORT_80_TCP_PORT=80 CATTLE_CLUSTER_AGENT_PORT_80_TCP_PROTO=tcp CATTLE_CLUSTER_AGENT_SERVICE_HOST=10.43.5.109 CATTLE_CLUSTER_AGENT_SERVICE_PORT=80 CATTLE_CLUSTER_AGENT_SERVICE_PORT_HTTP=80 CATTLE_CLUSTER_AGENT_SERVICE_PORT_HTTPS_INTERNAL=443 CATTLE_CLUSTER_REGISTRY= CATTLE_INGRESS_IP_DOMAIN=sslip.io CATTLE_INSTALL_UUID=884f1cad-164d-4e49-85ca-ab80cd5fea48 CATTLE_INTERNAL_ADDRESS= CATTLE_IS_RKE=false CATTLE_K8S_MANAGED=true CATTLE_NODE_NAME=cattle-cluster-agent-678bd7b8fb-6c9fw CATTLE_RANCHER_PROVISIONING_CAPI_VERSION= CATTLE_RANCHER_WEBHOOK_VERSION=104.0.0+up0.5.0 CATTLE_SERVER=https://<REDACTED DOMAIN> CATTLE_SERVER_VERSION=v2.9.0
INFO: Using resolv.conf: search cattle-system.svc.cluster.local svc.cluster.local cluster.local home nameserver 10.43.0.10 options ndots:5
INFO: https://<REDACTED DOMAIN>/ping is accessible
INFO: <REDACTED DOMAIN> resolves to <REDACTED IP>
time="2024-08-23T00:53:05Z" level=info msg="Listening on /tmp/log.sock"
time="2024-08-23T00:53:05Z" level=info msg="Rancher agent version v2.9.0 is starting"
time="2024-08-23T00:53:05Z" level=error msg="unable to read CA file from /etc/kubernetes/ssl/certs/serverca: open /etc/kubernetes/ssl/certs/serverca: no such file or directory"
time="2024-08-23T00:53:05Z" level=error msg="Strict CA verification is enabled but encountered error finding root CA"
解决方法:
****
部署完成后,需要重新设置rancher 的SVC,chart里面默认使用clusterIP的方式。需要将Rancher的80端口改成nodePort的方式,后面ingress创建的时候才能生成alb地址.
最后展示效果:
5.Rancher导入EKS集群
主要是增加aws的创建集群时的access-key跟选择需要导入的eks集群,其他没什么注意的。
注意:
因为我们创建的alb是用默认的安全组的,所以80跟443端口只开放了AWS自己的IP地址,我们的EKS集群的API server没有开放,但是都是通过private vpc网段的3个nat网关地址出去的,所以在导入eks集群的时候,rancher自己的alb地址需要开放EKS集群3个nat网关IP地址,这样rancher才能完成跟EKS集群API服务的交互,至此EKS集群就导入到rancher上了。
评论区