先决条件#
- Kubernetes 集群 参考RKE安装k8s及部署高可用rancher之证书在外面的LB(nginx中)-CSDN博客
- CLI 工具
- Ingress Controller(仅适用于托管 Kubernetes)
创建集群k8s
[root@nginx locale]# cat rancher-cluster.yml
nodes:- 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: local
ignore_docker_version: true
prefix_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.0
kubernetes_version: v1.20.10-rancher1-1 #rke 1.2.12network:plugin: calicomtu: 0options:flannel_backend_type: vxlanprivate_registries:- url: harbor.jettech.comuser: adminpassword: Harbor12345is_default: true
[root@nginx locale]# rke up --config rancher-cluster.yml
1. 为 Rancher 创建 Namespace
[root@nginx ~]# kubectl create namespace cattle-syste
namespace/cattle-syste created
[root@nginx ~]# kubectl get ns
NAME STATUS AGE
cattle-syste Active 2s
default Active 4m1s
ingress-nginx Active 3m4s
kube-node-lease Active 4m3s
kube-public Active 4m3s
kube-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.crt
jetto.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.com
issuer= /C=CN/CN=localhost
查看Common Name
:
[root@nginx ok]# openssl x509 -noout -subject -in tls.crt
subject= /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]# ls
cacerts.pem cakey.pem jetto.jettech.com.crt jetto.jettech.com.key tls.crt
cacerts.srl create_self-signed-cert.sh jetto.jettech.com.csr openssl.cnf tls.key
[root@nginx ok]# kubectl -n cattle-system create secret tls tls-rancher-ingres --cert=tls.crt --key=tls.key
secret/tls-rancher-ingres created
[root@nginx ok]# kubectl -n cattle-system get secret
NAME TYPE DATA AGE
default-token-9wc8v kubernetes.io/service-account-token 3 22s
tls-rancher-ingres kubernetes.io/tls 2 13s
[root@nginx ok]# kubectl -n cattle-system describe secret tls-rancher-ingres
Name: tls-rancher-ingres
Namespace: cattle-system
Labels: <none>
Annotations: <none>Type: kubernetes.io/tlsData
====
tls.crt: 2343 bytes
tls.key: 1675 bytes[root@nginx ok]# kubectl -n cattle-system create secret tls tls-rancher-ingress --cert=tls.crt --key=tls.key
secret/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.pem
secret/tls-ca created
注意: Rancher 在启动时检索
tls-ca
密文。如果您的 Rancher Server 正在运行中,您需要重新启动 Rancher Server Pod 才能使新的 CA 生效。
4 helm安装rancher集群
[root@nginx ok]# helm install rancher 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-system
namespace/cattle-system created
[root@nginx ~]# kubectl -n cattle-system rollout status deploy/rancher
Waiting 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]# kubectl get all -A
NAMESPACE NAME READY STATUS RESTARTS AGE
cattle-system pod/helm-operation-5lqb9 0/2 Completed 0 28s
cattle-system pod/helm-operation-9rqd2 0/2 Completed 0 47s
cattle-system pod/helm-operation-jm52w 0/2 Completed 0 35s
cattle-system pod/helm-operation-rqcnc 0/2 Completed 0 21s
cattle-system pod/helm-operation-z52w5 0/2 Completed 0 41s
cattle-system pod/helm-operation-zvbjs 0/2 Completed 0 61s
cattle-system pod/rancher-65f6b5bbf6-bm2j2 1/1 Running 0 107s
cattle-system pod/rancher-65f6b5bbf6-bstsh 1/1 Running 0 107s
cattle-system pod/rancher-65f6b5bbf6-rh4bk 1/1 Running 0 107s
cattle-system pod/rancher-webhook-85f777cb65-275wx 1/1 Running 0 25s
fleet-system pod/fleet-agent-7cc65df565-hctpv 1/1 Running 0 23s
fleet-system pod/fleet-controller-54dd95c75b-22xfr 1/1 Running 0 54s
fleet-system pod/gitjob-86ccc9ddc9-h4mch 1/1 Running 0 54s
ingress-nginx pod/default-http-backend-565f86f5f9-8wwdg 1/1 Running 0 24m
ingress-nginx pod/nginx-ingress-controller-22vg8 1/1 Running 0 24m
ingress-nginx pod/nginx-ingress-controller-gnt2z 1/1 Running 0 24m
ingress-nginx pod/nginx-ingress-controller-plzrm 1/1 Running 0 24m
kube-system pod/calico-kube-controllers-b486cd75d-dnp4h 1/1 Running 1 24m
kube-system pod/calico-node-lz9tv 1/1 Running 0 24m
kube-system pod/calico-node-nlhfl 1/1 Running 0 24m
kube-system pod/calico-node-pks26 1/1 Running 0 24m
kube-system pod/coredns-56fdbbcdfc-tkw4m 1/1 Running 0 24m
kube-system pod/coredns-56fdbbcdfc-vjt27 1/1 Running 0 24m
kube-system pod/coredns-autoscaler-5c64bb75c8-4rp8f 1/1 Running 0 24m
kube-system pod/metrics-server-6b697547fc-tmcjf 1/1 Running 0 24m
kube-system pod/rke-coredns-addon-deploy-job-9qjtz 0/1 Completed 0 24m
kube-system pod/rke-ingress-controller-deploy-job-bm7qt 0/1 Completed 0 24m
kube-system pod/rke-metrics-addon-deploy-job-bm8kd 0/1 Completed 0 24m
kube-system pod/rke-network-plugin-deploy-job-dm4kd 0/1 Completed 0 24m
rancher-operator-system pod/rancher-operator-cccbf7f8-fgsm5 1/1 Running 0 32sNAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
cattle-system service/rancher ClusterIP 10.43.153.193 <none> 80/TCP,443/TCP 107s
cattle-system service/rancher-webhook ClusterIP 10.43.137.105 <none> 443/TCP 25s
default service/kubernetes ClusterIP 10.43.0.1 <none> 443/TCP 25m
fleet-system service/gitjob ClusterIP 10.43.43.108 <none> 80/TCP 54s
ingress-nginx service/default-http-backend ClusterIP 10.43.246.34 <none> 80/TCP 24m
kube-system service/kube-dns ClusterIP 10.43.0.10 <none> 53/UDP,53/TCP,9153/TCP <invalid>
kube-system service/metrics-server ClusterIP 10.43.187.147 <none> 443/TCP 24mNAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
ingress-nginx daemonset.apps/nginx-ingress-controller 3 3 3 3 3 <none> 24m
kube-system daemonset.apps/calico-node 3 3 3 3 3 kubernetes.io/os=linux 24mNAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE
cattle-system deployment.apps/rancher 3/3 3 3 107s
cattle-system deployment.apps/rancher-webhook 1/1 1 1 25s
fleet-system deployment.apps/fleet-agent 1/1 1 1 32s
fleet-system deployment.apps/fleet-controller 1/1 1 1 54s
fleet-system deployment.apps/gitjob 1/1 1 1 54s
ingress-nginx deployment.apps/default-http-backend 1/1 1 1 24m
kube-system deployment.apps/calico-kube-controllers 1/1 1 1 24m
kube-system deployment.apps/coredns 2/2 2 2 <invalid>
kube-system deployment.apps/coredns-autoscaler 1/1 1 1 <invalid>
kube-system deployment.apps/metrics-server 1/1 1 1 24m
rancher-operator-system deployment.apps/rancher-operator 1/1 1 1 32sNAMESPACE NAME DESIRED CURRENT READY AGE
cattle-system replicaset.apps/rancher-65f6b5bbf6 3 3 3 107s
cattle-system replicaset.apps/rancher-webhook-85f777cb65 1 1 1 25s
fleet-system replicaset.apps/fleet-agent-7cc65df565 1 1 1 23s
fleet-system replicaset.apps/fleet-agent-c46d75d6d 0 0 0 32s
fleet-system replicaset.apps/fleet-controller-54dd95c75b 1 1 1 54s
fleet-system replicaset.apps/gitjob-86ccc9ddc9 1 1 1 54s
ingress-nginx replicaset.apps/default-http-backend-565f86f5f9 1 1 1 24m
kube-system replicaset.apps/calico-kube-controllers-b486cd75d 1 1 1 24m
kube-system replicaset.apps/coredns-56fdbbcdfc 2 2 2 24m
kube-system replicaset.apps/coredns-autoscaler-5c64bb75c8 1 1 1 24m
kube-system replicaset.apps/metrics-server-6b697547fc 1 1 1 24m
rancher-operator-system replicaset.apps/rancher-operator-cccbf7f8 1 1 1 32sNAMESPACE NAME COMPLETIONS DURATION AGE
kube-system job.batch/rke-coredns-addon-deploy-job 1/1 1s 24m
kube-system job.batch/rke-ingress-controller-deploy-job 1/1 2s 24m
kube-system job.batch/rke-metrics-addon-deploy-job 1/1 2s 24m
kube-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 官方安装包中包含了这个模块。请参阅您的操作系统文档来了解如何在操作系统上安装和启用 NGINX stream
模块。
创建 NGINX 配置#
安装 NGINX 之后,您需要使用节点的 IP 地址更新 NGINX 配置文件nginx.conf
。
NGINX 配置示例
-
将下面的配置示例复制并粘贴到您喜欢的文本编辑器中,保存为
nginx.conf
。 -
在 nginx.conf 配置中,用之前准备的节点的 IP 替换
<IP_NODE_1>
,<IP_NODE_2>
和<IP_NODE_3>
。注意: 有关所有配置选项,请参见NGINX 文档:TCP 和 UDP 负载均衡。
[root@nginx nginx]# cat nginx.conf
worker_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
效果图: