准备工作
- 准备一个k8s集群
建议所有节点提前导入rancher镜像,减少部署时间,以rancher 2.5.6为例:
docker pull uhub.service.ucloud.cn/ucloud_pts/nginx-ingress:1.10.0
docker tag uhub.service.ucloud.cn/ucloud_pts/nginx-ingress:1.10.0 nginx/nginx-ingress:1.10.0
docker pull uhub.service.ucloud.cn/ucloud_pts/rancher:v2.5.6
docker tag uhub.service.ucloud.cn/ucloud_pts/rancher:v2.5.6 rancher/rancher:v2.5.6
- 安装 helm
wget https://get.helm.sh/helm-v3.2.4-linux-amd64.tar.gz #或
wget https://mirrors.huaweicloud.com/helm/v3.5.2/helm-v3.5.2-linux-amd64.tar.gz
tar -xf helm-v3.5.2-linux-amd64.tar.gz
mv linux-amd64/helm /usr/bin/
- 安装nginx-ingress
helm repo add nginx-stable https://helm.nginx.com/stable
helm repo update
kubectl create namespace nginx-ingress
helm install controller nginx-stable/nginx-ingress -n nginx-ingress
- 准备SSL/TLS证书,这里是自签名的证书
#!/bin/bash
openssl req -newkey rsa:2048 \
-keyout ca.key \
-out ca.crt \
-days 3650 \
-x509 \
-passout pass:ca_key_xxxxx \
-subj '/C=CN/ST=beijing/L=BJ/O=RD/OU=RDTEAM/CN=admin.com'
for cert_name in rancher
do
openssl genrsa -out ${cert_name}.key 2048 \
-passout pass:111111
openssl req -new -key ${cert_name}.key \
-out ${cert_name}.csr \
-passin pass:111111 \
-subj "/C=CN/ST=beijing/L=BJ/O=RD/OU=RDTEAM/CN=${cert_name}.admin.com"
openssl x509 -req -sha256 \
-extensions v3_req \
-days 3650 \
-in ${cert_name}.csr \
-CAkey ca.key \
-CA ca.crt \
-CAcreateserial \
-passin pass:ca_key_xxxxx \
-out ${cert_name}.crt
done
cat ca.crt >> rancher.crt
- 创建 ingress需要的secret
rancher-server 在 k8s 环境中只提供 http 协议端口,tls 证书在ingress 中卸载,因此需要在ingress-nginx运行的命名空间,创建存放证书的 secret
kubectl -n nginx-ingress create secret generic tls-ca --from-file=cacerts.pem=./ca.crt
kubectl -n nginx-ingress create secret tls tls-rancher-ingress --cert=rancher.crt --key=rancher.key
部署 Rancher
- 创建Rancher Server 的 Secret
kubectl create namespace cattle-system
kubectl -n cattle-system create secret generic tls-ca --from-file=cacerts.pem=./ca.crt
kubectl -n cattle-system create secret tls tls-rancher-ingress --cert=rancher.crt --key=rancher.key
- 完成 Rancher Server的部署
helm repo add rancher-stable https://releases.rancher.com/server-charts/stable
helm repo update
helm install rancher rancher-stable/rancher \
--namespace cattle-system \
--set privateCA=true \
--set ingress.tls.source=tls-rancher-ingress \
--set hostname=rancher.admin.com
- 配置说明
- 创建 rancher 的 namespace
- --set privateCA=true 使用自签证书是必选项
- --set ingress.tls.source=ls-rancher-secret rancher-server服务用到的证书和密钥
- --set hostname=rancher.my.com 配置访问 rancher-server 的域名,这个域名配置在 ingress 中,如果域名没有解析到 ingress 节点,也可以绑个 host 访问
- 其他可选配置
kubectl -n ingress-nginx create secret generic tls-ca-additional --from-file=ca-additional.pem= ca-additional.crt
--set additionalTrustedCAs=true (可选)访问各种 tls (https) 时额外信任的 ca 证书,比如自使用签证书的镜像仓库、git仓库、s3 对象存储,亦或是类似公司出网白名单代理网关、fiddler 抓 https 包之类的需要安装 ca 证书的情况
安装后配置
- 查看集群中的ingressClass
[root@10-9-156-147 ]# kubectl get ingressClass
NAME CONTROLLER PARAMETERS AGE
nginx nginx.org/ingress-controller <none> 44m
- 修改 ingress 配置,添加自定义 ingressClass配置
由于是自建的 ingress,修改ingress是配置正确,执行命令: kubectl edit ingress -n cattle-system 在 annotations 处添加一行注解: ( 修改为和集群中名称一致的 ingressClass,这里名为 nginx )
kubernetes.io/ingress.class: nginx
- 修改 ingress 配置,添加websocket支持
执行命令: kubectl edit ingress -n cattle-system 在 annotations 处添加注解:
nginx.org/websocket-services: rancher
nginx.ingress.kubernetes.io/configuration-snippet: |
proxy_set_header Upgrade "websocket";
proxy_set_header Connection "Upgrade";
验证
- 检查 rancher ingress 配置 kubectl get ingress rancher -n cattle-system
- 检查 ingress-controller 配置,kubectl get svc -n nginx-ingress
- 确认 EXTERNAL-IP 和 ADDRESS 一致,说明配置正确
- 将 ADDRESS_IP 添加到rancher.admin.com 域名的DNS解析A记录,或本地域名解析
- 浏览器或系统导入创建的自签名根证书 ca.crt, 并设置为始终信任
- 浏览器访问 https://rancher.admin.com 检查是否能登陆成功,以及各项功能是否正常