先决条件#
- 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
效果图:
