[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
Rancher Server 默认需要 SSL/TLS 配置来保证访问的安全性
提示
如果你想在外部终止 SSL/TLS,请参考:RKE安装k8s及部署高可用rancher之证书在外面的LB(nginx中)-CSDN博客。
你可以从以下三种证书来源中选择一种,证书将用来在 Rancher Server 中终止 TLS:
cert-manager
。 Rancher 利用?cert-manager
?签发并维护证书。Rancher 将生成自己的 CA 证书,并使用该 CA 签署证书。然后?cert-manager
?负责管理该证书。cert-manager
。但是,在这种情况下,cert-manager 与 Let's Encrypt 的特殊颁发者相结合,该颁发者执行获取 Let's Encrypt 颁发的证书所需的所有操作(包括请求和验证)。此配置使用 HTTP 验证(HTTP-01
),因此负载均衡器必须具有可以从公网访问的公共 DNS 记录。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 的运维成本。
注意: 可以使用?CSDN来快速生成符合 rancher 要求的自签名证书
在此选项中,将使用你自己的证书来创建 Kubernetes secret,以供 Rancher 使用。
运行这个命令时,hostname
?选项必须与服务器证书中的?Common Name
?或?Subject Alternative Names
?条目匹配,否则 Ingress controller 将无法正确配置。
尽管技术上仅需要Subject Alternative Names
中有一个条目,但是拥有一个匹配的?Common Name
?可以最大程度的提高与旧版浏览器/应用程序的兼容性。
Common Name
?和?Subject Alternative Names
?查看Common Name
:
openssl x509 -noout -subject -in cert.pem
subject= /CN=jetto.jettech.com
查看Subject Alternative Names
:
openssl x509 -noout -in cert.pem -text | grep DNS
DNS:jetto.jettech.com
hostname
。replicas
设置为 Rancher 部署所使用的复制数量。默认为 3;如果你的集群中少于 3 个节点,你应填写实际节点数量。ingress.tls.source
为secret
。--version
?标志,例如:--version 2.5.8
。--devel
选项。?注意: 可以使用?一键生成 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/tls
Data
====
tls.crt: 2343 bytes
tls.key: 1675 bytes
提示:?如果您想要更换证书,您可以使用?
kubectl -n cattle-system delete secret tls-rancher-ingress
?来删除?tls-rancher-ingress
?密文,之后使用上面的命令创建一个新的密文。如果您使用的是私有 CA 签发的证书,仅当新证书与当前证书是由同一个 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 生效。
[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 32s
NAMESPACE 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 24m
NAMESPACE 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 24m
NAMESPACE 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 32s
NAMESPACE 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 32s
NAMESPACE 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
我们将使用 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 集群上,则仅需要两个节点。
首先在负载均衡器主机上安装 NGINX,NGINX 具有适用于所有已知操作系统的软件包。我们测试了1.14
和1.15
版本。有关安装 NGINX 的帮助,请参阅安装文档。
stream
模块是必需的,在 NGINX 官方安装包中包含了这个模块。请参阅您的操作系统文档来了解如何在操作系统上安装和启用 NGINX?stream
模块。
安装 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
效果图:
?