本文永久链接: https://www.xtplayer.cn/rancher/install/ha-nodeport-external-l7/

架构说明

节点软硬件要求

节点硬件要求请参考:https://docs.rancher.cn/docs/rancher2/installation_new/requirements/_index/

节点基础环境配置

请参考 基础环境配置

同步镜像

如果你是在离线环境安装,请先访问rancher 离线安装镜像同步,按照方法同步所有镜像到离线私有镜像仓库。如果主机能够直接拉取镜像,则跳过此步骤。

创建 rke 配置文件

使用下面的示例创建 rancher-cluster.yml 文件,使用创建的 3 个节点的 IP 地址或域名替换列表中的 IP 地址。

注意: 如果节点有公网地址 和 内网地址地址,建议手动设置 internal_address:以便 Kubernetes 将内网地址用于集群内部通信。如果需要开启自动配置安全组或防火墙,某些服务(如 AWS EC2)需要设置 internal_address:

nodes:
- address: 165.227.114.x
internal_address: 172.16.22.x
user: ubuntu
role: [controlplane,worker,etcd]
- address: 165.227.116.x
internal_address: 172.16.32.x
user: ubuntu
role: [controlplane,worker,etcd]
- address: 165.227.127.x
internal_address: 172.16.42.x
user: ubuntu
role: [controlplane,worker,etcd]

# 如果要使用私有仓库中的镜像,配置以下参数来指定默认私有仓库地址。
##private_registries:
## - url: registry.com
## user: Username
## password: password
## is_default: true

services:
etcd:
# 扩展参数 https://github.com/etcd-io/etcd/blob/master/Documentation/op-guide/configuration.md
extra_args:
auto-compaction-mode: periodic
auto-compaction-retention: 60m
# 修改空间配额为$((6*1024*1024*1024)),默认 2G,最大 8G
quota-backend-bytes: '6442450944'
snapshot-count: 50000
# 自动备份
## rke 版本小于 0.2.x 或 rancher 版本小于 v2.2.0 时使用
snapshot: true
creation: 6h
retention: 24h
## rke 版本大于等于 0.2.x 或 rancher 版本大于等于 v2.2.0 时使用(两段配置二选一)
backup_config:
enabled: true # 设置 true 启用 ETCD 自动备份,设置 false 禁用;
interval_hours: 12 # 快照创建间隔时间,不加此参数,默认 5 分钟;
retention: 6 # etcd 备份保留份数;

更多 etcd 配置请参考: etcd 优化

RKE 节点参数说明

参数必须描述
addressyes公共域名或 IP 地址
useryes可以运行 docker 命令的用户
roleyes分配给节点的 Kubernetes 角色列表
internal_addressno内部集群通信的私有域名或 IP 地址
ssh_key_pathno用于对节点进行身份验证的 SSH 私钥的路径(默认为~/.ssh/id_rsa)

镜像仓库配置

如果需要使用自己镜像仓库的镜像或者是离线安装,那么可以在 private_registries 字段中配置私有镜像仓库信息。

选项描述
url‘’镜像仓库地址
user‘’镜像仓库用户名
password‘’镜像仓库密码
is_defaulttrue/false这个参数很重要,当配置这个参数后,
rke 会自动为系统镜像添加镜像仓库前缀,
比如 rancher/rancher 会变为 192.168.1.1/rancher/rancher,
用于离线环境或者使用自己的私有仓库构建集群。

完整的配置示例,请参考完整-cluster-yml-示例

高级配置

RKE 有许多配置选项可用于自定义安装以适合您的特定环境,有关选项和功能的完整列表,请查看RKE 文档

安装 rke、kubectl、helm 工具

需要选择一个节点用来运行 rke、kubectl、helm 等命令,你可以叫它为 操作节点。这个节点可以是 local 集群中的任意一台,也可以是专门准备的独立的一个节点。

# rke
sudo curl -o /usr/local/bin/rke http://rancher-mirror.cnrancher.com/rke/v1.2.4/rke_linux-amd64
sudo chmod +x /usr/local/bin/rke
# kubectl
sudo curl -o /usr/local/bin/kubectl http://rancher-mirror.cnrancher.com/kubectl/v1.20.0/linux-amd64-v1.20.0-kubectl
sudo chmod +x /usr/local/bin/kubectl
# helm
cd /tmp
sudo curl -O http://rancher-mirror.cnrancher.com/helm/v3.5.0/helm-v3.5.0-linux-amd64.tar.gz;
sudo tar -zxf helm*tar.gz;
sudo cp -rf /tmp/linux-amd64/helm /usr/local/bin/helm
sudo chmod +x /usr/local/bin/helm

或者访问 http://mirror.cnrancher.com/ 下载 rke、kubectl、helm 二进制文件,然后放在操作节点/usr/local/bin 目录下,并给与执行权限。

创建 Kubernetes 集群

运行 RKE 命令创建 Kubernetes 集群

rke up --config ./rancher-cluster.yml

完成后,它应显示:Finished building Kubernetes cluster successfully

测试集群

RKE 会自动创建 kube_config_rancher-cluster.yml。这个文件包含 kubectl 和 helm 访问 K8S 的凭据,请妥善保管。

注意: 如果您使用的文件不叫 rancher-cluster.yml, 那么这个 kubeconfig 配置文件将被命名为 kube_config_<FILE_NAME>.yml

通过 kubectl 测试您的连接,并查看您的所有节点是否处于 Ready 状态。

kubectl --kubeconfig=kube_config_xxx.yml get nodes

NAME STATUS ROLES AGE VERSION
165.227.114.63 Ready controlplane,etcd,worker 11m v1.10.1
165.227.116.167 Ready controlplane,etcd,worker 11m v1.10.1
165.227.127.226 Ready controlplane,etcd,worker 11m v1.10.1

检查集群 Pod 的运行状况

  • Pods 是 Running 或者 Completed 状态。
  • READY 列显示所有正在运行的容器 (i.e. 3/3),STATUS 显示 POD 是 Running
  • Pods 的 STATUSCompletedrun-one Jobs,这些 podsREADY 应该为 0/1
kubectl --kubeconfig=kube_config_xxx.yml get pods -A

NAMESPACE NAME READY STATUS RESTARTS AGE
ingress-nginx nginx-ingress-controller-tnsn4 1/1 Running 0 30s
ingress-nginx nginx-ingress-controller-tw2ht 1/1 Running 0 30s
ingress-nginx nginx-ingress-controller-v874b 1/1 Running 0 30s
kube-system canal-jp4hz 3/3 Running 0 30s
kube-system canal-z2hg8 3/3 Running 0 30s
kube-system canal-z6kpw 3/3 Running 0 30s
kube-system kube-dns-7588d5b5f5-sf4vh 3/3 Running 0 30s
kube-system kube-dns-autoscaler-5db9bbb766-jz2k6 1/1 Running 0 30s
kube-system metrics-server-97bc649d5-4rl2q 1/1 Running 0 30s
kube-system rke-ingress-controller-deploy-job-bhzgm 0/1 Completed 0 30s
kube-system rke-kubedns-addon-deploy-job-gl7t4 0/1 Completed 0 30s
kube-system rke-metrics-addon-deploy-job-7ljkc 0/1 Completed 0 30s
kube-system rke-network-plugin-deploy-job-6pbgj 0/1 Completed 0 30s

Helm 安装 Rancher

有的场景,外部有七层负载均衡器作为 ssl 终止,常见用法是把负载均衡器的 443 端口代理到内部应用的非 https 端口上,比如 80

为了保证网络转发性能,这里禁用了内置的 ingress 服务,以 NodePort 方式 把 Rancher Server 容器的 80 端口映射到宿主机 30303 端口上。再把外部七层负载均衡器的 443 端口反向代理到 Rancher Server 对应的 NodePort 端口上。访问外部七层负载均衡器的 443 端口的流量将转发到 Rancher Server 容器的 80 端口。

准备 chart

Chart 地址: https://gitee.com/rancher/server-chart.git

  • 本 Chart 基于 https://github.com/rancher/server-chart/ 修改,当前支持版本为 rancher v2.1.7、v2.1.8、v2.1.9、v2.2.0、v2.2.1、v2.2.2、v2.2.3、v2.2.4、v2.2.5、v2.2.6 v2.2.7 v2.2.8 v2.2.9 v2.3.3
  • 不支持 LetsEncrypt、cert-manager 提供证书,需手动通过 Secret 导入证书, 默认开启审计日志功能。

制作自签名证书或重命名权威认证证书

  • 仓库根目录有一键创建自签名证书脚本,会自动创建 cacerts.pemtls.keytls.crt
--ssl-domain: 生成 ssl 证书需要的主域名,如不指定则默认为 www.rancher.local,如果是 ip 访问服务,则可忽略;
--ssl-trusted-ip: 一般 ssl 证书只信任域名的访问请求,有时候需要使用 ip 去访问 server,那么需要给 ssl 证书添加扩展 IP,多个 IP 用逗号隔开;
--ssl-trusted-domain: 如果想多个域名访问,则添加扩展域名(TRUSTED_DOMAIN),多个 TRUSTED_DOMAIN 用逗号隔开;
--ssl-size: ssl 加密位数,默认 2048;
--ssl-cn: 国家代码(2 个字母的代号),默认 CN;
使用示例:
./create_self-signed-cert.sh --ssl-domain=www.test.com --ssl-trusted-domain=www.test2.com \
--ssl-trusted-ip=1.1.1.1,2.2.2.2,3.3.3.3 --ssl-size=2048 --ssl-date=3650
  • 如果使用权威认证证书,需要重命名 crt 和 key 为 tls.crttls.key

准备 SSL 证书密文

把 CA 证书作为密文导入 K8S,如果是使用权威认证证书,可以跳过此步骤。

# 指定 kubeconfig 配置文件路径
kubeconfig=xxx

# 创建 cattle-system 命名空间
kubectl --kubeconfig=$kubeconfig \
create namespace cattle-system

# 创建 CA 证书密文
## 如果是使用权威认证证书,可以跳过此步骤。
kubectl --kubeconfig=$kubeconfig \
-n cattle-system create \
secret generic tls-ca \
--from-file=cacerts.pem

helm 安装 Rancher

  • helm 3.x 安装
git clone -b v2.4.11 https://gitee.com/rancher/server-chart.git

kubeconfig=xxx.yml
kubectl --kubeconfig=$kubeconfig create namespace cattle-system

helm --kubeconfig=$kubeconfig \
install rancher \
--namespace cattle-system \
--set rancherImage=rancher/rancher \
--set busyboxImage=rancher/busybox \
--set service.type=NodePort \
--set service.ports.nodePort=30303 \
--set tls=external \
--set privateCA=true \
--set useBundledSystemChart=true \
server-chart/rancher

注意:

  1. 通过 --kubeconfig=指定 kubectl 配置文件;
  2. 如果使用权威 ssl 证书,则去除 --set privateCA=true;
  3. 如果为离线安装,设置 --set privateRegistry=true 使用私有仓库,并且使用 --set systemDefaultRegistry=指定离线私有仓库地址,注意不要添加协议头(http 或者 https);
  4. 如果镜像名非标准 rancher 镜像名,可通过 --set rancherImage=指定镜像名称,不要指定镜像版本,系统会根据 chart 版本自动获取镜像版本;
  5. 默认自动获取 chart 版本号作为 Rancher 镜像版本号,如果想指定镜像版本号,可通过配置 --set rancherImageTag=v2.3.x 来指定;
  6. 点击查看更多Chart 设置参数;
  7. 如果 rancher server 要访问自签名 ssl 证书的服务,比如自签名证书的 git 服务,那么需要提前把 CA 文件映射到 rancher server 容器从,rancher server 可以通过此 CA 去校验自签名 ssl 证书。

配置外部七层负载均衡器

NGINX 负载均衡器

默认情况下,rancher 容器会将 80 端口上的请求重定向到 443 端口上。如果 Rancher Server 通过负载均衡器来代理,这个时候请求是通过负载均衡器发送给 Rancher Server,而并非客户端直接访问 Rancher Server。在非全局 https 的环境中,如果以外部负载均衡器作为 ssl 终止,这个时候通过负载均衡器的 https 请求将需要被反向代理到 Rancher Server http(80)上。在负载均衡器上配置 X-Forwarded-Proto: https 参数,Rancher Server http(80)上收到负载均衡器的请求后,就不会再重定向到 https(443)上。

负载均衡器或代理必须支持以下参数:

  • WebSocket 连接
  • SPDY/HTTP/2协议
  • 传递/设置以下 headers:
HeaderValue描述
Host传递给 Rancher 的主机名识别客户端请求的主机名。
X-Forwarded-Protohttps识别客户端用于连接负载均衡器的协议。注意:如果存在此标头,rancher/rancher 不会将 HTTP 重定向到 HTTPS。
X-Forwarded-PortPort used to reach Rancher.识别客户端用于连接负载均衡器的端口。
X-Forwarded-ForIP of the client connection.识别客户端的原始 IP 地址。

nginx 配置示例

worker_processes 4;
worker_rlimit_nofile 40000;
events {
worker_connections 8192;
}
http {
upstream rancher {
server IP_NODE_1:30303;
server IP_NODE_2:30303;
server IP_NODE_3:30303;
}
map $http_upgrade $connection_upgrade {
default Upgrade;
'' close;
}
server {
listen 443 ssl http2; # 如果是升级或者全新安装 v2.2.2,需要禁止 http2,其他版本不需修改。
server_name FQDN;
ssl_certificate <tls.crt>; # 这里使用安装 Rancher 时候创建的自签名或者权威 ssl 证书。
ssl_certificate_key <tls.key>;
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;
# This allows the ability for the execute shell window to remain open for up to 15 minutes.
## Without this parameter, the default is 1 minute and will automatically close.
proxy_read_timeout 900s;
proxy_buffering off;
}
}
server {
listen 80;
server_name FQDN;
return 301 https://$server_name$request_uri;
}
}

为了减少网络传输的数据量,可以在七层代理的 http 定义中添加 GZIP 功能。

# Gzip Settings
gzip on;
gzip_disable "msie6";
gzip_disable "MSIE [1-6]\.(?!.*SV1)";
gzip_vary on;
gzip_static on;
gzip_proxied any;
gzip_min_length 0;
gzip_comp_level 8;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types
text/xml application/xml application/atom+xml application/rss+xml application/xhtml+xml image/svg+xml application/font-woff
text/javascript application/javascript application/x-javascript
text/x-json application/json application/x-web-app-manifest+json
text/css text/plain text/x-component
font/opentype application/x-font-ttf application/vnd.ms-fontobject font/woff2
image/x-icon image/png image/jpeg;

F5 七层代理

本文档基于 BIGIP-15.0.1-0.0.11.ALL-vmware 虚拟机版本编写。

配置健康检查

点击 Local Traffice,然后点击 Monitors 旁边的。Type 中选择类型为 http,在 Send String 中填写参数为:GET /healthz \r\n

添加节点(可选)

可以在添加 node pool 的时候添加节点,所以当前这一步可以跳过。也可以在这一步配置好节点,添加 node pool 的时候直接选择节点。

  1. 点击 Local Traffice,然后点击 Nodes > Nodes List 旁边的

  2. 配置节点信息

    注意 Health Monitors 设置为 None

添加 pool

  1. 点击 Local Traffice > Pools > Pool List 旁边的

  2. 配置节点池

    1. 设置节点池名称;
    2. Health Monitors 选择前面步骤创建的健康检查;
    3. New Members 中选择 Node List,选择开始添加的节点,点击下方的 Add,端口以实际 Rancher 暴露的端口为准;

添加 irule

  1. 待添加内容

    when HTTP_REQUEST {
    HTTP::header insert “X-Forwarded-Proto” “https”;
    HTTP::header insert “X-Forwarded-Port” 443;
    HTTP::header insert “X-Forwarded-For” [IP::client_addr];
    }
  2. 点击 Local Traffice > iRules > iRules List 旁边的

  3. 设置 irule 名称,粘贴以下内容

添加证书

  1. 访问 system > Certificate Management > Traffic Certificate Management > SSL Certificate List > Import

  2. 分别选择导入类型为 key 和 certificate,然后选择导入文件。

    注意: 权威证书会有中间链 CA 证书,所以这里会多一个 CA 证书,如果是自签名证书则可以忽略这个 CA 证书。

添加 SSL Profile

  1. 点击 Local Traffice > Profiles > SSL > client 旁边的

  2. 配置 SSL 相关参数

    1. 设置 Name

    2. Configuration 选择高级,并点击右侧自定义

    3. Certificate Key Chain 处点击 Add,然后选择对应的证书和私钥;

      添加之后

    4. 其他参数保持默认。

配置 Rancher Virtual Servers

  1. 点击 Local Traffice > Virtual Servers > Virtual Server List 旁边的

  2. 配置 Name;

  3. 保持 Type 为默认;

  4. 配置 Source Address0.0.0.0/0;

  5. 根据实际情况配置 Destination Address/Mask;

  6. Service Port 设置为 443/https;

  7. Configuration 选择高级;

  8. HTTP Profile (Client)设置为 http

  9. SSL Profile (Client)选择之前创建的 SSL Profile;

  10. WebSocket Profile 选择 WebSocket

  11. Source Address Translation 选择 auto map

  12. Resources\iRules 中选择之前创建 iRules 规则;

  13. Default Pool 选择之前创建的主机池;

  14. 完整配置

HTTP 重定向 HTTPS

点击 Local Traffice > Virtual Servers > Virtual Server List 旁边的

  1. 配置 Name;
  2. 保持 Type 为默认;
  3. 配置 Source Address0.0.0.0/0;
  4. 根据实际情况配置 Destination Address/Mask;
  5. Service Port 设置为 80/http;
  6. Configuration 选择基础
  7. HTTP Profile (Client)设置为 http
  8. Resources\iRules 中选择_sys_https_redirect