本篇记录使用helm在kubernetes集群上部署rancher v2.5.5 注意:rancher v2.5.5的helm chart目前不支持kubernetes 1.20.x版本,默认支持版本是1.19.x
.官方配置文档:https://rancher.com/docs/rancher/v2.x/en/installation/install-rancher-on-k8s/, 如下是官方给出的配置步骤。
我们就在官方给的步骤基础上进行修改以满足我们的部署需求:
- 参考官方文档,采用kubernetes+helm+rancher-chart方式部署
- rancher-chart默认ingress的controller由nginx通过配置参数的方式修改为traefik
- rancher-chart模式的https模式采用
external
模式,通过外部的load balancer(netscaler)处理TLS证书(即TLS will be terminated on a load balancer)
我们用来集成部署rancher的kubernetes集群信息
# kubectl get node -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
ejucsmaster-shylf-1 Ready master 25h v1.19.8 10.116.72.7 CentOS Linux 7 (Core) 3.10.0-1160.11.1.el7.x86_64 docker://19.3.14
ejucsmaster-shylf-2 Ready master 25h v1.19.8 10.116.72.8 CentOS Linux 7 (Core) 3.10.0-1160.11.1.el7.x86_64 docker://19.3.14
ejucsmaster-shylf-3 Ready master 25h v1.19.8 10.116.72.9 CentOS Linux 7 (Core) 3.10.0-1160.11.1.el7.x86_64 docker://19.3.14
ejucsnode-shylf-11 Ready node 25h v1.19.8 10.116.72.11 CentOS Linux 7 (Core) 3.10.0-1160.11.1.el7.x86_64 docker://19.3.14
ejucsnode-shylf-12 Ready node 25h v1.19.8 10.116.72.12 CentOS Linux 7 (Core) 3.10.0-1160.11.1.el7.x86_64 docker://19.3.14
ejucsnode-shylf-13 Ready node 25h v1.19.8 10.116.72.13 CentOS Linux 7 (Core) 3.10.0-1160.11.1.el7.x86_64 docker://19.3.14
1. 安装需要的CLI工具 [Install the Required CLI Tools]
1.1 kubectl配置
我们实验工作直接在kubernetes的一个master节点执行,kubectl默认已经配置完成。
1.2 helm配置
在执行操作的master节点配置helm [helm+kubectl也可以单独部署一个用于工作的服务器,与节点隔离开,防止误操作]
wget https://get.helm.sh/helm-v3.5.2-linux-amd64.tar.gz
tar zxvf helm-v3.5.2-linux-amd64.tar.gz
cd linux-amd64
cp helm /usr/local/bin/
chmod +x /usr/local/bin/helm
helm version
version.BuildInfo{Version:"v3.5.2", GitCommit:"167aac70832d3a384f65f9745335e9fb40169dc2", GitTreeState:"dirty", GoVersion:"go1.15.7"}
2. 添加Helm chart仓库 [Add the Helm chart repository]
使用helm repo add
添加Rancher chart仓库用于配置rancher, rancher仓库分为Latest,Stable, Alpha版本,我们使用Stable版本仓库
helm repo add rancher-latest https://releases.rancher.com/server-charts/latest
helm repo list
NAME URL
stable https://apphub.aliyuncs.com/stable
rancher-stable https://releases.rancher.com/server-charts/stable # rancher chart repository
3. 在kubernetes为rancher创建命名空间 [Create a namespace for Rancher]
我们需要为rancher chart安装配置创建命名空间namespace
, 这个命名空间应该使用固定名称cattle-system
kubectl create namespace cattle-system
# kubectl get ns
NAME STATUS AGE
cattle-system Active 28h
... # 其他省略显示
4. 选择SSL配置 [Choose your SSL configuration]
4.1 ssl配置模式选择
rancher模式是安全模式,需要SSL/TLS证书配置。有多种配置解析处理SSL/TLS证书的方式,我们参考的官方访问上有3种推荐的模式,但不是我们需要的。我们选择使用外部的Load balancer (使用的硬件产品netscaler,如果没有也可以直接使用nginx作为LoadBalancer)来处理TLS证书
。模式示意图如下:
4.2 负载均衡器配置
我这边实际产线使用的是netscaler具体配置就不再这里展示了。我这里展示使用nginx作为外部7层负载均衡器(load balancer的配置),我使用的域名是rancher.ejuops.com, 根据实际使用域名进行修改配置。
- 准备SSL/TLS证书
我们没有准备证书,采用自定义证书,生成过程如下
1. 生成CA证书私钥
openssl genrsa -out ca.key 4096
2. 生成CA证书
openssl req -x509 -new -nodes -sha512 -days 3650 -subj "/C=CN/ST=Shanghai/L=Shanghai/O=eju/OU=ops/CN=rancher.ejuops.com" -key ca.key -out ca.crt
3. 生成服务证书
3.1 生成私钥
openssl genrsa -out rancher.ejuops.com.key 4096
3.2 生成证书签名请求
openssl req -sha512 -new -subj "/C=CN/ST=Shanghai/L=Shanghai/O=eju/OU=ops/CN=rancher.ejuops.com" -key rancher.ejuops.com.key -out rancher.ejuops.com.csr
3.3 生成x509 v3扩展文件
cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1=rancher.ejuops.com
EOF
3.4 生成证书
openssl x509 -req -sha512 -days 3650 -extfile v3.ext -CA ca.crt -CAkey ca.key -CAcreateserial -in rancher.ejuops.com.csr -out rancher.ejuops.com.crt
3.5 将生成的证书放在nginx可以访问到的位置
cp rancher.ejuops.com.crt rancher.ejuops.com.key /certs/
- nginx配置参考 [参考官方文档 这里]
vi nginx.conf
... # 省略
http {
... # 省略
map $http_upgrade $connection_upgrade {
default Upgrade;
'' close;
}
include upstream/*.conf;
include vhost.d/*.conf;
}
vi vhost.d/rancher.ejuops.com.conf rancher.ejuops.com.conf
server {
listen 80;
server_name rancher.ejuops.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name rancher.ejuops.com;
ssl_certificate /certs/rancher.ejuops.com.crt; #TLS证书
ssl_certificate_key /certs/rancher.ejuops.com.key; #TLS证书私钥
location / {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://rancher;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_read_timeout 900s;
proxy_buffering off;
}
}
vi upstream/rancher.ejuops.com.conf rancher.ejuops.com.conf
upstream rancher {
# traefik service 采用NodePort映射服务到集群外,这为kubernetes节点地址以及traefik服务对应的NodePort地址
server 10.116.72.11:30080;
server 10.116.72.12:30080;
server 10.116.72.13:30080;
}
4.3 匹配SSL选择的helm+rancher部署参考
# 1. 使用外部负载均衡,而且这样就不用部署cert-manager了。
--set tls=external
# 2. helm+rancher替换ingress由默认的nginx controller到traefik controller
--set ingress.extraAnnotations.'kubernetes\.io/ingress\.class'=ops-production-ingress \ # 在traefik配置文件中指定,这里要一致
--set ingress.extraAnnotations.'traefik\.ingress\.kubernetes\.io/router\.entrypoints'=http \ # 在traefik配置文件中指定的entrypoint
--set ingress.extraAnnotations.'kubernetes\.io/ingress\.allow-http'=\"true\" \
--set ingress.extraAnnotations.'ingress\.kubernetes\.io/ssl-redirect'=\"false\" \
--set ingress.extraAnnotations.'traefik\.ingress\.kubernetes\.io/frontend-entry-points'=\"http\" \
--set ingress.extraAnnotations.'ingress\.kubernetes\.io/whitelist-x-forwarded-for'=\"true\" \
--set ingress.extraAnnotations.'ingress\.kubernetes\.io/protocol'=https
5. 使用Helm安装Rancher [Install Rancher with Helm and your chosen certificate option]
根据我们前面架构的选择指定参数配置启动rancher, rancher chart的更多参数仓库 这里
helm install rancher rancher-stable/rancher \
--namespace cattle-system \
--set hostname=rancher.ejuops.com \
--set tls=external \
--set ingress.extraAnnotations.'kubernetes\.io/ingress\.class'=ops-production-ingress \
--set ingress.extraAnnotations.'kubernetes\.io/ingress\.allow-http'=\"true\" \
--set ingress.extraAnnotations.'ingress\.kubernetes\.io/ssl-redirect'=\"false\" \
--set ingress.extraAnnotations.'traefik\.ingress\.kubernetes\.io/frontend-entry-points'=\"http\" \
--set ingress.extraAnnotations.'traefik\.ingress\.kubernetes\.io/router\.entrypoints'=http \
--set ingress.extraAnnotations.'ingress\.kubernetes\.io/whitelist-x-forwarded-for'=\"true\" \
--set ingress.extraAnnotations.'ingress\.kubernetes\.io/protocol'=https
观察rancher启动状态
kubectl -n cattle-system rollout status deploy/rancher
Waiting for deployment "rancher" rollout to finish: 0 of 3 updated replicas are available
...
deployment "rancher" successfully rolled out
6. 验证rancher正确配置 [Verify that the Rancher server is successfully deployed]
6.1 kubectl查看deployment状态
kubectl -n cattle-system get deploy rancher
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
rancher 3 3 3 3 3m
6.2 浏览器访问
初次访问要求设置admin密码以及选择是否Multi-cluster模式。我这里初始访问没有记录下来,这里是之后登录的情况。
7. 保持Helm安装rancher参数 [Save Your Options]
后面根据需要还要升级或者修改rancher 的部署,需要将helm命令记录下来报错,为之后使用。
helm install rancher rancher-stable/rancher \
--namespace cattle-system \
--set hostname=rancher.ejuops.com \
--set tls=external \
--set ingress.extraAnnotations.'kubernetes\.io/ingress\.class'=ops-production-ingress \
--set ingress.extraAnnotations.'kubernetes\.io/ingress\.allow-http'=\"true\" \
--set ingress.extraAnnotations.'ingress\.kubernetes\.io/ssl-redirect'=\"false\" \
--set ingress.extraAnnotations.'traefik\.ingress\.kubernetes\.io/frontend-entry-points'=\"http\" \
--set ingress.extraAnnotations.'traefik\.ingress\.kubernetes\.io/router\.entrypoints'=http \
--set ingress.extraAnnotations.'ingress\.kubernetes\.io/whitelist-x-forwarded-for'=\"true\" \
--set ingress.extraAnnotations.'ingress\.kubernetes\.io/protocol'=https
troubleshooting
问题描述
- 在rancher里面查看集群状态显示组件
controller manager
,scheduler
是非健康状态,如图 - 使用kubectl指令查看,也显示这2个组件是非健康状态
解决方法
修改controller-manager以及scheduler的容器启动参数,改完参数稍等下 相关容器会自动重新启动好
参考
- https://rancher.com/docs/rancher/v2.x/en/installation/install-rancher-on-k8s/#8-save-your-options
- https://rancher.com/docs/rancher/v2.x/en/installation/install-rancher-on-k8s/chart-options/#external-tls-termination
- https://rancher.com/docs/rancher/v2.x/en/installation/resources/advanced/rke-add-on/layer-7-lb/