对于生产环境,需以高可用的配置安装 Rancher,确保用户始终可以访问 Rancher Server。当安装在Kubernetes集群中时,Rancher将与集群的 etcd 集成,并利用Kubernetes 调度实现高可用。

为确保高可用,本文所部署的 Kubernetes 集群将专用于运行 Rancher ,Rancher 运行起来后,可再创建或导入集群以运行具体的工作负载。

1. 推荐架构

  • Rancher的DNS 应解析到 4层(TCP) 负载均衡上。
  • 负载均衡应将端口 TCP/80 和 TCP/443 转发到 Kubernetes 集群中的所有3个节点。
  • Ingress-controller 将 HTTP 重定向到HTTPS并终止端口 TCP/443 上的 SSL/TLS(SSL数字证书在这里部署)。
  • Ingress-controller 将流量转发到 pod 的 TCP/80 端口。

下面是一张从官网拉过来的图片,更直观一些。

2. 准备工作

2.1 服务器准备

  1. 1台 Linux服务器,配置不用很高,用于四层负载均衡
  2. 3台 Linux服务器,Rancker-server-node 节点
  3. n台 Linux服务器,Rancker-agent-node 节点(n<=50)

节点服务器的硬件配置,可根据实际情况依据该表自行选择。

规模 集群 节点 CPU 内存
最多5个 高达50 2
最多15个 最多200 4
高达50 最多500个 8
超大 最多100个 高达1000 32
更大规模 100+ 1000+ 联系 Rancher

2.2工具安装

这里按自己习惯,我这里把所有文件部署到/data/rke/rke2.2.2

2.2.1 安装 kubectl

这是一个 kubernetes 命令行工具

1
2
3
4
5
6
# 下载目前最新版
curl -LO https://dl.k8s.io/release/v1.14.3/bin/linux/amd64/kubectl
# 设置执行权限
chmod +x ./linux-amd64-v1.14.3-kubectl
# 改短名字
sudo mv ./linux-amd64-v1.14.3-kubectl kubectl

2.2.2 安装 RKE

RKE 全称 Rancher Kubernetes Engine,是一个用于构建 kubernets 集群的命令行工具。

1
2
3
4
5
6
7
8
# 下载目前最新版
curl -LO https://github.com/rancher/rke/releases/download/v0.2.6/rke_linux-amd64
# 设置执行权限
chmod +x rke_linux-amd64
# 改短名字
sudo mv rke_linux-amd64 rke
# 验证安装
./rke --version # rke version v0.2.6

2.2.3 安装 helm

helm 是Kubernetes的包管理器。

1
2
3
4
5
6
# 网络原因,切换到 github 提供的镜像连接
curl -LO https://get.helm.sh/helm-v2.13.1-linux-amd64.tar.gz
# 解压
tar -zxvf helm-v2.0.0-linux-amd64.tgz
# 改短名字
mv linux-amd64/helm helm

3. 创建节点和负载均衡

这些节点须在同一个网络区域或数据中心。

3.1 节点准备

操作系统

所有节点安装 ubuntu 16.04(64-bit x86)

网络要求
注意参考 官网放行相关端口。本文 ip 清单(仅用于演示):

NODE IP 备注
NODE-LB 公网 168.168.168.1 / 内网 10.0.0.1
NODE-SERVER 公网 168.168.168.6 / 内网 10.0.0.6
NODE-SERVER 公网 168.168.168.7 / 内网 10.0.0.7
NODE-SERVER 公网 168.168.168.8 / 内网 10.0.0.8
NODE-WORKER 公网 168.168.168.16 / 内网 10.0.0.16
NODE-WORKER 公网 168.168.168.17 / 内网 10.0.0.17
NODE-WORKER 公网 168.168.168.18 / 内网 10.0.0.18

docker-ce

并安装最新stable版 docker-ce:18.06.3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# step 1: 安装必要的一些系统工具
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# step 2: 安装GPG证书
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# Step 3: 写入软件源信息
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# Step 4: 更新并安装Docker-CE
sudo apt-get -y update
sudo apt-get -y install docker-ce=5:18.09.2~3-0~ubuntu-xenial

# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# apt-cache madison docker-ce
# docker-ce | 17.03.1~ce-0~ubuntu-xenial | https://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
# docker-ce | 17.03.0~ce-0~ubuntu-xenial | https://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
# Step 2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.1~ce-0~ubuntu-xenial)
# sudo apt-get -y install docker-ce=[VERSION]

# 配置docker

root@iZ2zegfpsrzdc0fhgcv2w3Z:~# cat /etc/docker/daemon.json
{
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
},
"max-concurrent-downloads": 10,
"max-concurrent-uploads": 10,
"registry-mirrors": ["https://7bezldxe.mirror.aliyuncs.com"],
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}

3.2 配置四层负载均衡

RKE 将会在每个节点上配置一个 Ingress-controller pod,这个 pod 将绑定到该节点的 TCP/80 和 TCP/443 端口,作为 Rancher-server 的HTTPS流量入口点。

将负载均衡器配置为基本的第4层TCP转发器,这里采用 NGINX 作四层负载均衡。

安装 Nginx

1
2
3
4
5
sudo apt-get install nginx
# /usr/sbin/nginx:主程序
# /etc/nginx:存放配置文件
# /usr/share/nginx:存放静态文件
# /var/log/nginx:存放日志

更新配置文件 /etc/nginx/nginx.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
worker_processes 4;
worker_rlimit_nofile 40000;

events {
worker_connections 8192;
}

stream {
upstream rancher_servers_http {
least_conn;
server 10.0.0.6:80 max_fails=3 fail_timeout=5s;
server 10.0.0.7:80 max_fails=3 fail_timeout=5s;
server 10.0.0.8:80 max_fails=3 fail_timeout=5s;
}
server {
listen 80;
proxy_pass rancher_servers_http;
}

upstream rancher_servers_https {
least_conn;
server 10.0.0.6:443 max_fails=3 fail_timeout=5s;
server 10.0.0.7:443 max_fails=3 fail_timeout=5s;
server 10.0.0.8:443 max_fails=3 fail_timeout=5s;
}

server {
listen 443;
proxy_pass rancher_servers_https;
}
}

注意:将local群集专用于Rancher。
勿将此负载均衡(即local群集Ingress)对 Rancher 以外的应用程序进行负载转发。

4. 使用 RKE 安装 kubernetes

下面使用 RKE(Kubernetes Engine) 安装高可用的 Kubernetes。

4.1 NODE-SERVER 之间建立 ssh 信任

我们目前有三台服务器用作 local 集群,首先要确保我们主机能够通过 ssh 访问到另外两台主机并执行相关操作。比如执行 docker 命令,还记得前面我们加入 docker 用户组的用户吧。

1
2
3
4
5
6
7
# 根据需求配置相关信息生成 rsa 公钥密钥
ssh-keygen

# 复制当前主机上的公钥到另外两台上面,实现免密码登录
ssh-copy-id -i ~/.ssh/id_rsa.pub user@x.x.x.x

# 要注意这里也要跟自己注册注册一下 :ssh-copy-id -i ~/.ssh/id_rsa.pub user@本机ip

4.2 创建 rke 配置文件

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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 备份保留份数;

4.2.1 RKE 节点参数说明

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

4.2.2 镜像仓库配置

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

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

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

根据以上样例,执行命令生成配置文件

1
2
# 根据提示一步一步生成配置
./rke config --name cluster.yml

4.3 运行 RKE 构建 kubernetes 集群

1
2
3
4
rke up

# 验证:返回类似下面的消息则说明执行成功,有问题欢迎留言交流。
# Finished building Kubernetes cluster successfully.

执行成功会在当前目录生成一个文件 kube_config_rancher-cluster.yml

4.4 配置环境变量

1
2
3
4
5
6
7
8
9
[root@localhost rke]# vim /etc/profile.d/rke.sh
export KUBECONFIG=/data/rke/rke2.2.2/kube_config_cluster.yml

[root@localhost rke]# vim /root/.bashrc
alias kubectl='/data/rke/rke2.2.2/kubectl'
alias helm='/data/rke/rke2.2.2/helm'

. /root/.bashrc
. /etc/profile.d/rke.sh

4.5 测试集群

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

1
2
3
4
5
6
root@iZ2zeasfsez3jw7rpiqh8fZ:~/rke# kubectl get node -o wide
# 返回下面信息说明集群创建成功
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
192.168.0.81 Ready controlplane,etcd,worker 7m4s v1.14.3 192.168.0.81 <none> Ubuntu 16.04.7 LTS 4.4.0-210-generic docker://18.9.2
192.168.0.82 Ready controlplane,etcd,worker 7m3s v1.14.3 192.168.0.82 <none> Ubuntu 16.04.7 LTS 4.4.0-210-generic docker://18.9.2
192.168.0.83 Ready controlplane,etcd,worker 7m4s v1.14.3 192.168.0.83 <none> Ubuntu 16.04.7 LTS 4.4.0-210-generic docker://18.9.2

4.6 保存好相关配置文件

当排除故障、升级群集时需要用到以下文件,请将其副本保存在一个安全的位置。
rancher-cluster.yml:RKE集群配置文件。
kube_config_rancher-cluster.yml:群集的Kubeconfig文件,此文件包含完全访问群集的凭据。
rancher-cluster.rkestate:Kubernetes群集状态文件,此文件包含完全访问群集的凭据。

4.7 初始化 Helm

一开始,我们安装了 Helm ,Helm 是 Kubernetes 首选的包管理工具。为了能够使用 Helm,需要在群集上安装服务器端组件 tiller。
Kubernetes APIServer 开启了 RBAC 访问控制,所以需要创建 tiller 使用的service account: tiller 并分配合适的角色给它。

1
2
3
4
5
6
7
8
9
10
11
12
13
# 在 kube-system 命名空间下创建一个 serviceaccount ,并将角色绑定给 tiller
kubectl -n kube-system create serviceaccount tiller
# 创建一个clusterrolebinding绑定管理员权限
kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller

# 然后, heml 就可以在集群上安装 tiller 了
# 同样,网络原因,我们需要配置一个镜像仓库地址
helm init --upgrade -i registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.13.1 --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts

# 输出:$HELM_HOME has been configured at /home/ubuntu/.helm.

# 应用程序设置serviceAccount 注意:默认情况下,部署舵柄与一个不安全的“允许未经身份验证的用户”政策。
kubectl patch deploy --namespace kube-system tiller-deploy -p '{"spec":{"template":{"spec":{"serviceAccount":"tiller"}}}}'

4.8 测试 tiller 安装是否成功

1
2
3
4
5
6
kubectl -n kube-system  rollout status deploy/tiller-deploy
# 输出 deployment "tiller-deploy" successfully rolled out

helm version
# Client: &version.Version{SemVer:"v2.13.1", GitCommit:"618447cbf203d147601b4b9bd7f8c37a5d39fbb4", GitTreeState:"clean"}
# Server: &version.Version{SemVer:"v2.13.1", GitCommit:"618447cbf203d147601b4b9bd7f8c37a5d39fbb4", GitTreeState:"clean"}

5. 自签CA证书(内网自建使用)

生成自签名 SSL 证书

创建脚本
create_self-signed-cert.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
#!/bin/bash -e

help ()
{
echo ' ================================================================ '
echo ' --ssl-domain: 生成ssl证书需要的主域名,如不指定则默认为www.rancher.local,如果是ip访问服务,则可忽略;'
echo ' --ssl-trusted-ip: 一般ssl证书只信任域名的访问请求,有时候需要使用ip去访问server,那么需要给ssl证书添加扩展IP,多个IP用逗号隔开;'
echo ' --ssl-trusted-domain: 如果想多个域名访问,则添加扩展域名(SSL_TRUSTED_DOMAIN),多个扩展域名用逗号隔开;'
echo ' --ssl-size: ssl加密位数,默认2048;'
echo ' --ssl-cn: 国家代码(2个字母的代号),默认CN;'
echo ' 使用示例:'
echo ' ./create_self-signed-cert.sh --ssl-domain=www.test.com --ssl-trusted-domain=www.test2.com \ '
echo ' --ssl-trusted-ip=1.1.1.1,2.2.2.2,3.3.3.3 --ssl-size=2048 --ssl-date=3650'
echo ' ================================================================'
}

case "$1" in
-h|--help) help; exit;;
esac

if [[ $1 == '' ]];then
help;
exit;
fi

CMDOPTS="$*"
for OPTS in $CMDOPTS;
do
key=$(echo ${OPTS} | awk -F"=" '{print $1}' )
value=$(echo ${OPTS} | awk -F"=" '{print $2}' )
case "$key" in
--ssl-domain) SSL_DOMAIN=$value ;;
--ssl-trusted-ip) SSL_TRUSTED_IP=$value ;;
--ssl-trusted-domain) SSL_TRUSTED_DOMAIN=$value ;;
--ssl-size) SSL_SIZE=$value ;;
--ssl-date) SSL_DATE=$value ;;
--ca-date) CA_DATE=$value ;;
--ssl-cn) CN=$value ;;
esac
done

# CA相关配置
CA_DATE=${CA_DATE:-3650}
CA_KEY=${CA_KEY:-cakey.pem}
CA_CERT=${CA_CERT:-cacerts.pem}
CA_DOMAIN=cattle-ca

# ssl相关配置
SSL_CONFIG=${SSL_CONFIG:-$PWD/openssl.cnf}
SSL_DOMAIN=${SSL_DOMAIN:-'www.rancher.local'}
SSL_DATE=${SSL_DATE:-3650}
SSL_SIZE=${SSL_SIZE:-2048}

## 国家代码(2个字母的代号),默认CN;
CN=${CN:-CN}

SSL_KEY=$SSL_DOMAIN.key
SSL_CSR=$SSL_DOMAIN.csr
SSL_CERT=$SSL_DOMAIN.crt

echo -e "\033[32m ---------------------------- \033[0m"
echo -e "\033[32m | 生成 SSL Cert | \033[0m"
echo -e "\033[32m ---------------------------- \033[0m"

if [[ -e ./${CA_KEY} ]]; then
echo -e "\033[32m ====> 1. 发现已存在CA私钥,备份"${CA_KEY}"为"${CA_KEY}"-bak,然后重新创建 \033[0m"
mv ${CA_KEY} "${CA_KEY}"-bak
openssl genrsa -out ${CA_KEY} ${SSL_SIZE}
else
echo -e "\033[32m ====> 1. 生成新的CA私钥 ${CA_KEY} \033[0m"
openssl genrsa -out ${CA_KEY} ${SSL_SIZE}
fi

if [[ -e ./${CA_CERT} ]]; then
echo -e "\033[32m ====> 2. 发现已存在CA证书,先备份"${CA_CERT}"为"${CA_CERT}"-bak,然后重新创建 \033[0m"
mv ${CA_CERT} "${CA_CERT}"-bak
openssl req -x509 -sha256 -new -nodes -key ${CA_KEY} -days ${CA_DATE} -out ${CA_CERT} -subj "/C=${CN}/CN=${CA_DOMAIN}"
else
echo -e "\033[32m ====> 2. 生成新的CA证书 ${CA_CERT} \033[0m"
openssl req -x509 -sha256 -new -nodes -key ${CA_KEY} -days ${CA_DATE} -out ${CA_CERT} -subj "/C=${CN}/CN=${CA_DOMAIN}"
fi

echo -e "\033[32m ====> 3. 生成Openssl配置文件 ${SSL_CONFIG} \033[0m"
cat > ${SSL_CONFIG} <<EOM
[req]
req_extensions = v3_req
distinguished_name = req_distinguished_name
[req_distinguished_name]
[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
extendedKeyUsage = clientAuth, serverAuth
EOM

if [[ -n ${SSL_TRUSTED_IP} || -n ${SSL_TRUSTED_DOMAIN} || -n ${SSL_DOMAIN} ]]; then
cat >> ${SSL_CONFIG} <<EOM
subjectAltName = @alt_names
[alt_names]
EOM
IFS=","
dns=(${SSL_TRUSTED_DOMAIN})
dns+=(${SSL_DOMAIN})
for i in "${!dns[@]}"; do
echo DNS.$((i+1)) = ${dns[$i]} >> ${SSL_CONFIG}
done

if [[ -n ${SSL_TRUSTED_IP} ]]; then
ip=(${SSL_TRUSTED_IP})
for i in "${!ip[@]}"; do
echo IP.$((i+1)) = ${ip[$i]} >> ${SSL_CONFIG}
done
fi
fi

echo -e "\033[32m ====> 4. 生成服务SSL KEY ${SSL_KEY} \033[0m"
openssl genrsa -out ${SSL_KEY} ${SSL_SIZE}

echo -e "\033[32m ====> 5. 生成服务SSL CSR ${SSL_CSR} \033[0m"
openssl req -sha256 -new -key ${SSL_KEY} -out ${SSL_CSR} -subj "/C=${CN}/CN=${SSL_DOMAIN}" -config ${SSL_CONFIG}

echo -e "\033[32m ====> 6. 生成服务SSL CERT ${SSL_CERT} \033[0m"
openssl x509 -sha256 -req -in ${SSL_CSR} -CA ${CA_CERT} \
-CAkey ${CA_KEY} -CAcreateserial -out ${SSL_CERT} \
-days ${SSL_DATE} -extensions v3_req \
-extfile ${SSL_CONFIG}

echo -e "\033[32m ====> 7. 证书制作完成 \033[0m"
echo
echo -e "\033[32m ====> 8. 以YAML格式输出结果 \033[0m"
echo "----------------------------------------------------------"
echo "ca_key: |"
cat $CA_KEY | sed 's/^/ /'
echo
echo "ca_cert: |"
cat $CA_CERT | sed 's/^/ /'
echo
echo "ssl_key: |"
cat $SSL_KEY | sed 's/^/ /'
echo
echo "ssl_csr: |"
cat $SSL_CSR | sed 's/^/ /'
echo
echo "ssl_cert: |"
cat $SSL_CERT | sed 's/^/ /'
echo

echo -e "\033[32m ====> 9. 附加CA证书到Cert文件 \033[0m"
cat ${CA_CERT} >> ${SSL_CERT}
echo "ssl_cert: |"
cat $SSL_CERT | sed 's/^/ /'
echo

echo -e "\033[32m ====> 10. 重命名服务证书 \033[0m"
echo "cp ${SSL_DOMAIN}.key tls.key"
cp ${SSL_DOMAIN}.key tls.key
echo "cp ${SSL_DOMAIN}.crt tls.crt"
cp ${SSL_DOMAIN}.crt tls.crt

执行脚本生成自签证书

1
2
3
4
5
6
7
8
9
10
--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

./create_self-signed-cert.sh --ssl-domain=cloud.jfjbapp.cn --ssl-trusted-domain=cloud.jfjbapp.cn --ssl-trusted-ip=192.168.10.20,192.168.10.10 --ssl-size=2048 --ssl-date=36500

注意: 申请证书对应的域名需要与 hostname 选项匹配,否则 ingress 将无法代理访问 Rancher。

生成的证书文件

5.1 导入证书到集群

添加 TLS 密文

只有当我们在 cattle-system 命名空间,将自签名证书和对应密钥配置到 tls-rancher-ingress 的密文中,Kubernetes 才会为 Rancher 创建所有的对象和服务。

1
2
3
kubectl -n cattle-system create secret tls tls-rancher-ingress \
--cert=tls.crt \
--key=tls.key

如果您使用的是私有 CA,Rancher 需要您提供 CA 证书的副本,用来校验 Rancher Agent 与 Server 的连接。

1
2
kubectl -n cattle-system create secret generic tls-ca \
--from-file=cacerts.pem=./cacerts.pem

5.2 安装 Rancher

这里注意选择 stable 版本,首先添加 heml 源仓库。

1
helm repo add rancher-stable https://releases.rancher.com/server-charts/stable

5.3 部署 Rancher 并配置 SSL 数字证书

1
2
3
4
5
6
7
8
9
10
# 创建命名空间
kubectl create ns cattle-system

helm install rancher-stable/rancher \
--name rancher \
--namespace cattle-system \
--set hostname=cloud.jfjbapp.cn \
--version 2.2.2 \
--set ingress.tls.source=secret \
--set privateCA=true # 用于私有CA

5.4 检查 rancher 是否成功可用

1
2
3
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

5.5 为 Agent Pod 添加主机别名(/etc/hosts)

通过 kubectl --kubeconfig=xxx.yaml -n cattle-system get pod 应该是可以看到 agent pod 一直无法正常运行,查看 agent pod 日志会发现是因为连接不上 rancher server url。

解决方法

可以通过给 cattle-cluster-agent Podcattle-node-agent pod 添加主机别名(/etc/hosts),让其可以正常通过 Rancher Server URL 与 Rancher Server 通信(前提是 IP 地址可以互通)。

  • cattle-cluster-agent pod

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    kubectl --kubeconfig=$kubeconfig -n cattle-system \
    patch deployments cattle-cluster-agent --patch '{
    "spec": {
    "template": {
    "spec": {
    "hostAliases": [
    {
    "hostnames":
    [
    "cloud.jfjbapp.cn"
    ],
    "ip": "192.168.10.20"
    }
    ]
    }
    }
    }
    }'
  • cattle-node-agent pod

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    kubectl --kubeconfig=$kubeconfig -n cattle-system \
    patch daemonsets cattle-node-agent --patch '{
    "spec": {
    "template": {
    "spec": {
    "hostAliases": [
    {
    "hostnames":
    [
    "cloud.jfjbapp.cn"
    ],
    "ip": "192.168.10.20"
    }
    ]
    }
    }
    }
    }'

5.6 访问 Rancher UI

浏览器打开 https://your.doamin,为 admin账户设置初始密码,并登入系统。提示设置server-url,确保你的地址无误,确认即可。随后稍等皮片刻,待系统完成初始化。

如果出现local集群一直停留在等待状态,并提示 Waiting for server-url setting to be set,可以尝试点击 全局->local->升级->添加一个成员角色(admin/ClusterOwner)->保存即可。

6 结语

至此,已完成 Rancher 2.2.2 的 HA 安装,后续再做一些安全加固,检查各项配置确保无安全风险,即可开始提供服务。