本篇记录使用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/, 如下是官方给出的配置步骤。

helm 手动部署postgresql helm kubernetes部署_helm


我们就在官方给的步骤基础上进行修改以满足我们的部署需求:

  1. 参考官方文档,采用kubernetes+helm+rancher-chart方式部署
  2. rancher-chart默认ingress的controller由nginx通过配置参数的方式修改为traefik
  3. 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证书。模式示意图如下:

helm 手动部署postgresql helm kubernetes部署_helm 手动部署postgresql_02

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模式。我这里初始访问没有记录下来,这里是之后登录的情况。

helm 手动部署postgresql helm kubernetes部署_helm 手动部署postgresql_03

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

问题描述

  1. 在rancher里面查看集群状态显示组件 controller manager, scheduler是非健康状态,如图
  2. 使用kubectl指令查看,也显示这2个组件是非健康状态

解决方法

修改controller-manager以及scheduler的容器启动参数,改完参数稍等下 相关容器会自动重新启动好

helm 手动部署postgresql helm kubernetes部署_kubernetes_04

参考

  1. https://rancher.com/docs/rancher/v2.x/en/installation/install-rancher-on-k8s/#8-save-your-options
  2. https://rancher.com/docs/rancher/v2.x/en/installation/install-rancher-on-k8s/chart-options/#external-tls-termination
  3. https://rancher.com/docs/rancher/v2.x/en/installation/resources/advanced/rke-add-on/layer-7-lb/