先决条件#

  • Kubernetes 集群参考RKE安装k8s及部署高可用rancher之证书在外面的LB(nginx中)-CSDN博客
  • CLI 工具
  • Ingress Controller(仅适用于托管 Kubernetes)

创建集群k8s

[root@nginx locale]# cat rancher-cluster.ymlnodes:- address: 192.168.1.65internal_address: 192.168.1.65user: wuborole: [controlplane, worker, etcd]ssh_key_path: /home/wubo/.ssh/id_rsaport: 22services:etcd:extra_args:auto-compaction-retention: 240 #(单位小时)quota-backend-bytes: '6442450944'backup_config:enabled: true # 设置true启用ETCD自动备份,设置false禁用;interval_hours: 12# 快照创建间隔时间,不加此参数,默认5分钟;retention: 6# etcd备份保留份数;snapshot: truecreation: 6hretention: 24hingress:provider: nginx#options:#use-forwarded-headers: "true"##hostnetwork: truecluster_name: localignore_docker_version: trueprefix_path: /opt/rke#kubernetes_version: v1.13.5-rancher1-2 #rke 0.2.2 https://github.com/rancher/rke/releases/tag/v1.1.0#kubernetes_version: v1.17.4-rancher1-3 #rke 1.1.0kubernetes_version: v1.20.10-rancher1-1 #rke 1.2.12network:plugin: calicomtu: 0options:flannel_backend_type: vxlanprivate_registries: - url: harbor.jettech.com user: admin password: Harbor12345 is_default: true
[root@nginx locale]# rke up --config rancher-cluster.yml

1. 为 Rancher 创建 Namespace

[root@nginx ~]# kubectl create namespace cattle-systenamespace/cattle-syste created[root@nginx ~]# kubectl get nsNAMESTATUS AGEcattle-systeActive 2sdefault Active 4m1singress-nginx Active 3m4skube-node-lease Active 4m3skube-public Active 4m3skube-system Active 4m3s

2 选择你的 SSL 选项#

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

提示

如果你想在外部终止 SSL/TLS,请参考:RKE安装k8s及部署高可用rancher之证书在外面的LB(nginx中)-CSDN博客。

你可以从以下三种证书来源中选择一种,证书将用来在 Rancher Server 中终止 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.crttls.key的 PEM 格式的证书以及相关的密钥。如果使用私有 CA,则还必须上传该 CA 证书。这是由于你的节点可能不信任此私有 CA。 Rancher 将获取该 CA 证书,并从中生成一个校验和,各种 Rancher 组件将使用该校验和来验证其与 Rancher 的连接。
设置Chart 选项描述是否需要 cert-manager
Rancher 生成的证书(默认)ingress.tls.source=rancher使用 Rancher 生成的 CA 签发的自签名证书此项为默认选项
Let’s Encryptingress.tls.source=letsEncrypt使用Let’s Encrypt颁发的证书
你已有的证书ingress.tls.source=secret使用你的自己的证书(Kubernetes 密文)
重要

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

3 根据你选择的 SSL 选项,通过 Helm 安装 Rancher

注意: 可以使用CSDN来快速生成符合 rancher 要求的自签名证书

在此选项中,将使用你自己的证书来创建 Kubernetes secret,以供 Rancher 使用。

运行这个命令时,hostname选项必须与服务器证书中的Common NameSubject Alternative Names条目匹配,否则 Ingress controller 将无法正确配置。

尽管技术上仅需要Subject Alternative Names中有一个条目,但是拥有一个匹配的Common Name可以最大程度的提高与旧版浏览器/应用程序的兼容性。

3.1 如何查看服务器证书的Common NameSubject Alternative Names技术问题 | Rancher文档

如何检查我的证书链是有效的

[root@nginx ok]# openssl verify -CAfile cacerts.pem jetto.jettech.com.crtjetto.jettech.com.crt: OK

上述命令执行后,如何您收到unable to get local issuer certificate的错误,则证书链是不完整的。这通常意味着您的服务器证书中含有中间 CA 证书。如果您拥有该中间证书,可以采用下述的方法验证。

[root@nginx ok]# openssl verify -CAfile cacerts.pem -untrusted intermediate.pem jetto.jettech.com.crt

如何您仍然遇到验证验证错误,您可以通过以下命令获取服务器证书的颁布者和主题

[root@nginx ok]# openssl x509 -noout -subject -issuer -in jetto.jettech.com.crt subject= /C=CN/CN=jetto.jettech.comissuer= /C=CN/CN=localhost

查看Common Name

[root@nginx ok]# openssl x509 -noout -subject -intls.crtsubject= /C=CN/CN=jetto.jettech.com

查看Subject Alternative Names

[root@nginx ok]# openssl x509 -noout -in tls.crt -text | grep DNSDNS:jetto.jettech.com, DNS:jetto.jettech.com, IP Address:172.16.10.21, IP Address:192.168.1.65, IP Address:172.16.10.59, IP Address:172.16.10.33

技术问题 | Rancher文档

  • 如上所述,为你的证书设置适当的hostname
  • replicas设置为 Rancher 部署所使用的复制数量。默认为 3;如果你的集群中少于 3 个节点,你应填写实际节点数量。
  • 设置ingress.tls.sourcesecret
  • 要安装一个特定的 Rancher 版本,使用--version标志,例如:--version 2.5.8
  • 如果你安装的是 alpha 版本,Helm 要求在命令中加入--devel选项。
3.2添加 TLS Secret(千万不要遗漏该步):现在已经部署了 Rancher,还需参考添加 TLS Secret发布证书文件,以便 Rancher 和 ingress 控制器可以使用它们

注意: 可以使用一键生成 ssl 自签名证书脚本来快速生成符合 rancher 要求的自签名证书。该脚本会自动生成本文中所需要的tls.crttls.keycacerts.pem

只有当我们在cattle-system命名空间,将自签名证书和对应密钥配置到tls-rancher-ingress的密文中,Kubernetes 才会为 Rancher 创建所有的对象和服务。

将服务器证书和任何所需的中间证书合并到名为tls.crt的文件中,将您的证书密钥拷贝到名称为tls.key的文件中。

例如,acme.sh在fullchain.cer文件中提供了服务器证书和中间证书。在这种情况下,您应该将fullchain.cer文件重命名为tls.crt,将证书秘钥文件重命名为tls.key

使用kubectl创建tls类型的密文。

[root@nginx ok]# lscacerts.pemcakey.pem jetto.jettech.com.crtjetto.jettech.com.keytls.crtcacerts.srlcreate_self-signed-cert.shjetto.jettech.com.csropenssl.cnftls.key[root@nginx ok]# kubectl -n cattle-system create secret tls tls-rancher-ingres --cert=tls.crt --key=tls.keysecret/tls-rancher-ingres created[root@nginx ok]# kubectl -n cattle-system get secret NAMETYPEDATA AGEdefault-token-9wc8v kubernetes.io/service-account-token 322stls-rancher-ingreskubernetes.io/tls 213s[root@nginx ok]# kubectl -n cattle-system describe secrettls-rancher-ingresName: tls-rancher-ingresNamespace:cattle-systemLabels: Annotations:Type:kubernetes.io/tlsData====tls.crt:2343 bytestls.key:1675 bytes[root@nginx ok]# kubectl -n cattle-system create secret tls tls-rancher-ingress --cert=tls.crt --key=tls.keysecret/tls-rancher-ingress created

RKE部署Rancher v2.5.8 HA高可用集群 以及常见错误解决_rkecontrolplane was already initialized but no etc-CSDN博客

提示:如果您想要更换证书,您可以使用kubectl -n cattle-system delete secret tls-rancher-ingress来删除tls-rancher-ingress密文,之后使用上面的命令创建一个新的密文。如果您使用的是私有 CA 签发的证书,仅当新证书与当前证书是由同一个 CA 签发的,才可以替换。

3.3使用私有 CA 签发证书

如果您使用的是私有 CA,Rancher 需要您提供 CA 证书的副本,用来校验 Rancher Agent 与 Server 的连接。

拷贝 CA 证书到名为cacerts.pem的文件,使用kubectl命令在cattle-system命名空间中创建名为tls-ca的密文。

[root@nginx ok]# kubectl -n cattle-system create secret generic tls-ca --from-file=cacerts.pem=./cacerts.pemsecret/tls-ca created

注意:Rancher 在启动时检索tls-ca密文。如果您的 Rancher Server 正在运行中,您需要重新启动 Rancher Server Pod 才能使新的 CA 生效。

4 helm安装rancher集群

[root@nginx ok]# helm installrancher rancher-stable/rancher --namespace cattle-system --set hostname=jetto.jettech.com --set bootstrapPassword=123456aA --set rancherImage=harbor.jettech.com/rancher/rancher --set rancherImageTag=v2.5.8 --set ingress.tls.source=secret--set replicas=3 --set privateCA=true --set systemDefaultRegistry=harbor.jettech.com --set useBundledSystemChart=true

如果您使用的是由私有 CA 签名的证书,则在--set ingress.tls.source=secret之后添加--set privateCA=true

查看:

[root@nginx ~]# kubectl create namespace cattle-systemnamespace/cattle-system created[root@nginx ~]# kubectl -n cattle-system rollout status deploy/rancherWaiting for deployment "rancher" rollout to finish: 0 of 3 updated replicas are available...Waiting for deployment "rancher" rollout to finish: 1 of 3 updated replicas are available...Waiting for deployment spec update to be observed...Waiting for deployment "rancher" rollout to finish: 1 of 3 updated replicas are available...Waiting for deployment "rancher" rollout to finish: 2 of 3 updated replicas are available...deployment "rancher" successfully rolled out[root@nginx ok]# kubectlget all -ANAMESPACE NAMEREADY STATUSRESTARTS AGEcattle-system pod/helm-operation-5lqb90/2 Completed 028scattle-system pod/helm-operation-9rqd20/2 Completed 047scattle-system pod/helm-operation-jm52w0/2 Completed 035scattle-system pod/helm-operation-rqcnc0/2 Completed 021scattle-system pod/helm-operation-z52w50/2 Completed 041scattle-system pod/helm-operation-zvbjs0/2 Completed 061scattle-system pod/rancher-65f6b5bbf6-bm2j21/1 Running 0107scattle-system pod/rancher-65f6b5bbf6-bstsh1/1 Running 0107scattle-system pod/rancher-65f6b5bbf6-rh4bk1/1 Running 0107scattle-system pod/rancher-webhook-85f777cb65-275wx1/1 Running 025sfleet-systempod/fleet-agent-7cc65df565-hctpv1/1 Running 023sfleet-systempod/fleet-controller-54dd95c75b-22xfr 1/1 Running 054sfleet-systempod/gitjob-86ccc9ddc9-h4mch 1/1 Running 054singress-nginx pod/default-http-backend-565f86f5f9-8wwdg 1/1 Running 024mingress-nginx pod/nginx-ingress-controller-22vg81/1 Running 024mingress-nginx pod/nginx-ingress-controller-gnt2z1/1 Running 024mingress-nginx pod/nginx-ingress-controller-plzrm1/1 Running 024mkube-system pod/calico-kube-controllers-b486cd75d-dnp4h 1/1 Running 124mkube-system pod/calico-node-lz9tv 1/1 Running 024mkube-system pod/calico-node-nlhfl 1/1 Running 024mkube-system pod/calico-node-pks26 1/1 Running 024mkube-system pod/coredns-56fdbbcdfc-tkw4m1/1 Running 024mkube-system pod/coredns-56fdbbcdfc-vjt271/1 Running 024mkube-system pod/coredns-autoscaler-5c64bb75c8-4rp8f 1/1 Running 024mkube-system pod/metrics-server-6b697547fc-tmcjf 1/1 Running 024mkube-system pod/rke-coredns-addon-deploy-job-9qjtz0/1 Completed 024mkube-system pod/rke-ingress-controller-deploy-job-bm7qt 0/1 Completed 024mkube-system pod/rke-metrics-addon-deploy-job-bm8kd0/1 Completed 024mkube-system pod/rke-network-plugin-deploy-job-dm4kd 0/1 Completed 024mrancher-operator-system pod/rancher-operator-cccbf7f8-fgsm5 1/1 Running 032sNAMESPACE NAME TYPECLUSTER-IPEXTERNAL-IP PORT(S)AGEcattle-system service/rancherClusterIP 10.43.153.193 80/TCP,443/TCP 107scattle-system service/rancher-webhookClusterIP 10.43.137.105 443/TCP25sdefault service/kubernetes ClusterIP 10.43.0.1 443/TCP25mfleet-systemservice/gitjob ClusterIP 10.43.43.10880/TCP 54singress-nginx service/default-http-backend ClusterIP 10.43.246.3480/TCP 24mkube-system service/kube-dns ClusterIP 10.43.0.1053/UDP,53/TCP,9153/TCP kube-system service/metrics-server ClusterIP 10.43.187.147 443/TCP24mNAMESPACE NAMEDESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTORAGEingress-nginx daemonset.apps/nginx-ingress-controller 3 3 3 33  24mkube-system daemonset.apps/calico-node3 3 3 33 kubernetes.io/os=linux 24mNAMESPACE NAMEREADY UP-TO-DATE AVAILABLE AGEcattle-system deployment.apps/rancher 3/3 33 107scattle-system deployment.apps/rancher-webhook 1/1 11 25sfleet-systemdeployment.apps/fleet-agent 1/1 11 32sfleet-systemdeployment.apps/fleet-controller1/1 11 54sfleet-systemdeployment.apps/gitjob1/1 11 54singress-nginx deployment.apps/default-http-backend1/1 11 24mkube-system deployment.apps/calico-kube-controllers 1/1 11 24mkube-system deployment.apps/coredns 2/2 22 kube-system deployment.apps/coredns-autoscaler1/1 11 kube-system deployment.apps/metrics-server1/1 11 24mrancher-operator-system deployment.apps/rancher-operator1/1 11 32sNAMESPACE NAMEDESIRED CURRENT READY AGEcattle-system replicaset.apps/rancher-65f6b5bbf63 3 3 107scattle-system replicaset.apps/rancher-webhook-85f777cb651 1 1 25sfleet-systemreplicaset.apps/fleet-agent-7cc65df5651 1 1 23sfleet-systemreplicaset.apps/fleet-agent-c46d75d6d 0 0 0 32sfleet-systemreplicaset.apps/fleet-controller-54dd95c75b 1 1 1 54sfleet-systemreplicaset.apps/gitjob-86ccc9ddc9 1 1 1 54singress-nginx replicaset.apps/default-http-backend-565f86f5f9 1 1 1 24mkube-system replicaset.apps/calico-kube-controllers-b486cd75d 1 1 1 24mkube-system replicaset.apps/coredns-56fdbbcdfc2 2 2 24mkube-system replicaset.apps/coredns-autoscaler-5c64bb75c8 1 1 1 24mkube-system replicaset.apps/metrics-server-6b697547fc 1 1 1 24mrancher-operator-system replicaset.apps/rancher-operator-cccbf7f8 1 1 1 32sNAMESPACE NAMECOMPLETIONS DURATION AGEkube-system job.batch/rke-coredns-addon-deploy-job1/1 1s 24mkube-system job.batch/rke-ingress-controller-deploy-job 1/1 2s 24mkube-system job.batch/rke-metrics-addon-deploy-job1/1 2s 24mkube-system job.batch/rke-network-plugin-deploy-job 1/1 8s 24m

1. 配置基础设施和私有镜像仓库 | Rancher文档

5 配置 NGINX 负载均衡

我们将使用 NGINX 作为L4层负载均衡器(TCP),它将请求轮训转发到后端的 Rancher server 节点。在此配置中,负载均衡器位于 Rancher server 节点的前面。负载均衡器可以是任何能够运行 NGINX 的主机。我们不建议使用任意一个 Rancher server 节点作为负载均衡器节点,因为默认配置下每个 K8S 节点都会运行 ingress 控制器,而 ingress 控制器以为host网络模式运行,并默认监听了80443端口,所以默认情况下会出现端口冲突。如果一定要将 NGINX 安装在 Rancher server 某个节点上,那么可以编辑 ingress 控制器配置文件,在args中添加参数,端口根据实际情况修改--http-port=8880 --http-port=8443。 ingress 控制器修改默认端口后,nginx 配置中代理的后端 server 端口也需要一并修改。

说明:在这些示例中,负载均衡器将被配置为将流量定向到三个 Rancher Server 节点。如果将 Rancher 安装在 RKE Kubernetes 集群上,则需要三个节点。如果将 Rancher 安装在 K3s Kubernetes 集群上,则仅需要两个节点。

5.1 安装 NGINX#

首先在负载均衡器主机上安装 NGINX,NGINX 具有适用于所有已知操作系统的软件包。我们测试了1.141.15版本。有关安装 NGINX 的帮助,请参阅安装文档。

stream模块是必需的,在 NGINX 官方安装包中包含了这个模块。请参阅您的操作系统文档来了解如何在操作系统上安装和启用 NGINXstream模块。

创建 NGINX 配置#

安装 NGINX 之后,您需要使用节点的 IP 地址更新 NGINX 配置文件nginx.conf

NGINX 配置示例

  1. 将下面的配置示例复制并粘贴到您喜欢的文本编辑器中,保存为nginx.conf

  2. 在 nginx.conf 配置中,用之前准备的节点的 IP 替换

    注意:有关所有配置选项,请参见NGINX 文档:TCP 和 UDP 负载均衡。

[root@nginx nginx]# cat nginx.confworker_processes 4;worker_rlimit_nofile 40000;events {worker_connections 8192;}stream {upstream rancher_servers_http {least_conn;server 192.168.1.65:80 max_fails=3 fail_timeout=5s;server 172.16.10.59:80 max_fails=3 fail_timeout=5s;server 172.16.10.33:80 max_fails=3 fail_timeout=5s;}server {listen 80;proxy_pass rancher_servers_http;}upstream rancher_servers_https {least_conn;server 192.168.1.65:443 max_fails=3 fail_timeout=5s;server 172.16.10.59:443 max_fails=3 fail_timeout=5s;server 172.16.10.33:443 max_fails=3 fail_timeout=5s;}server {listen 443;proxy_pass rancher_servers_https;}}

将 NGINX 作为 Docker 容器运行

[root@nginx nginx]# docker run --name wubo --privileged=true --restart=unless-stopped -p 80:80 -p 443:443 -it -v /home/wubo/rancher/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /etc/localtime:/etc/localtime-d harbor.jettech.com/jettechtools/nginx:1.21.4

效果图: