先决条件#
- 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.crt
和tls.key
的 PEM 格式的证书以及相关的密钥。如果使用私有 CA,则还必须上传该 CA 证书。这是由于你的节点可能不信任此私有 CA。 Rancher 将获取该 CA 证书,并从中生成一个校验和,各种 Rancher 组件将使用该校验和来验证其与 Rancher 的连接。
设置 | Chart 选项 | 描述 | 是否需要 cert-manager |
---|---|---|---|
Rancher 生成的证书(默认) | ingress.tls.source=rancher | 使用 Rancher 生成的 CA 签发的自签名证书此项为默认选项 | 是 |
Let’s Encrypt | ingress.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 Name
或Subject Alternative Names
条目匹配,否则 Ingress controller 将无法正确配置。
尽管技术上仅需要Subject Alternative Names
中有一个条目,但是拥有一个匹配的Common Name
可以最大程度的提高与旧版浏览器/应用程序的兼容性。
3.1 如何查看服务器证书的Common Name
和Subject 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.source
为secret
。 - 要安装一个特定的 Rancher 版本,使用
--version
标志,例如:--version 2.5.8
。 - 如果你安装的是 alpha 版本,Helm 要求在命令中加入
--devel
选项。
3.2添加 TLS Secret(千万不要遗漏该步):现在已经部署了 Rancher,还需参考添加 TLS Secret发布证书文件,以便 Rancher 和 ingress 控制器可以使用它们
注意: 可以使用一键生成 ssl 自签名证书脚本来快速生成符合 rancher 要求的自签名证书。该脚本会自动生成本文中所需要的
tls.crt
、tls.key
和cacerts.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
网络模式运行,并默认监听了80
和443
端口,所以默认情况下会出现端口冲突。如果一定要将 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.14
和1.15
版本。有关安装 NGINX 的帮助,请参阅安装文档。
stream
模块是必需的,在 NGINX 官方安装包中包含了这个模块。请参阅您的操作系统文档来了解如何在操作系统上安装和启用 NGINXstream
模块。
创建 NGINX 配置#
安装 NGINX 之后,您需要使用节点的 IP 地址更新 NGINX 配置文件nginx.conf
。
NGINX 配置示例
将下面的配置示例复制并粘贴到您喜欢的文本编辑器中,保存为
nginx.conf
。在 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
效果图: