本文最后更新于:2024年7月24日 晚上
一 基础信息
1.1 前提
- 本次安装的为 20220129 最新版:Rancher v2.6.3
- VM 版本为 RHEL 7.8, 7.9 或 8.2, 8.3, 8.4(Rancher 官网要求)
- VM YUM 仓库:已配置对应版本的 RHEL 和 EPEL YUM 仓库
- VM 提供 root 权限
- 已配置 ntp(防止因为时间不一致导致的诡异问题)
- 提供 Proxy 访问互联网 Rancher 相关域名;
- 端口要求,为了正常运行,Rancher 需要在 Rancher 节点和下游 Kubernetes 集群节点上开放一些端口。端口需求列出了不同集群类型的 Rancher 和下游集群的所有必要端口。具体如下表:
Rancher 节点的入站规则
协议 |
端口 |
源 |
目的 |
描述 |
TCP |
80 |
客户端,操作机 |
Rancher 节点 |
使用外部 SSL 终端时的 Rancher UI/API |
TCP |
443 |
客户端,操作机,所有 K3S 节点 |
Rancher 节点 |
Rancher agent,Rancher UI/API,kubectl |
Rancher 节点的出站规则
协议 |
端口 |
源 |
目的 |
描述 |
TCP |
22 |
Rancher 节点 |
所有 K3S 节点 |
使用 Node Driver 对节点进行 SSH 配置 |
TCP |
2376 |
Rancher 节点 |
所有 K3S 节点 |
Docker Machine 使用的 Docker daemon TLS 端口 |
TCP |
6443 |
Rancher 节点 |
K3S Server |
Kubernetes API server |
✅ 成功:
如果以上前期条件均已满足。
即可以通过「离线 - 有代理」方式进行安装。
1.2 VM 信息
ℹ️ 信息:
OS 配置 Proxy 过程略
1.2 Proxy 信息
1 2 3
| ftp_proxy="http://192.168.0.1:8080" http_proxy="http://192.168.0.1:8080" https_proxy="http://192.168.0.1:8080"
|
proxy 需要 allow 的 doamin 如下:
🧠 评论:
以上的 allowed domain 可能不全,需要进一步补充。
二 「离线 - 有代理」方式安装
🧠 评论:
本次环境为:离线,有代理。
通过 代理 安装部署。
假设 Rancher 所在主机 IP 地址为:192.168.0.100
2.1 Rancher 安装配置
2.1.1 安装配置 Docker 及 docker-compose
RHEL 7.8 安装命令如下:
ℹ️ 信息:
Docker 版本为:1.13,安装后带了 3 个和 docker 有关的 service:
1 2 3 4 5
| docker-cleanup.service disabled docker-storage-setup.service disabled docker.service disabled docker-cleanup.timer disabled
|
docker.service
目录是:/usr/lib/systemd/system/docker.service
docker-compose version 1.18.0, build 8dd22a9
RHEL registries.conf
配置:
配置 insecure-registry
:
1
| vi /etc/containers/registries.conf
|
1 2 3 4 5 6 7 8
| [registries.search] registries = ['registry.cn-hangzhou.aliyuncs.com', 'registry.access.redhat.com', 'registry.redhat.io', 'docker.io']
[registries.insecure] registries = []
[registries.block] registries = []
|
Docker 配置 Proxy(可选配置,建议配置来保障 docker 100% 使用代理):
首先创建配置文件:
然后添加配置:
1 2 3 4
| [Service] Environment="HTTP_PROXY=http://192.168.0.1:8080" Environment="HTTPS_PROXY=http://192.168.0.1:8080" Environment="NO_PROXY=localhost,127.0.0.1,0.0.0.0,192.168.0.100,10.109.205.245,cattle-system.svc,.svc,.cluster.local,example.com"
|
最后重启容器并验证:
🧠 评论:
Linux NO_PROXY
CIDR 方式配置不生效,只有 IP 地址会生效。
2.1.2 生成 100 年有效期的证书
🧠 评论:
df -h
查看文件系统,如下:
1 2 3 4 5 6 7
| Filesystem Size Used Avail Use% Mounted on ... /dev/mapper/rhel-root 67G 5.5G 62G 9% / ... /dev/mapper/vgdata-lvdata 100G 33M 100G 1% /data ...
|
/data
目录 100G,所以 rancher 安装在 /data/rancher
目录下。
1
| vi 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_DATE=${CA_DATE:-3650} CA_KEY=${CA_KEY:-cakey.pem} CA_CERT=${CA_CERT:-cacerts.pem} CA_DOMAIN=cattle-ca
SSL_CONFIG=${SSL_CONFIG:-$PWD/openssl.cnf} SSL_DOMAIN=${SSL_DOMAIN:-'www.rancher.local'} SSL_DATE=${SSL_DATE:-3650} SSL_SIZE=${SSL_SIZE:-2048}
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
| chmod +x create_self-signed-cert.sh
|
生成 100 年证书:
1
| ./create_self-signed-cert.sh --ssl-trusted-ip=192.168.0.100 --ssl-date=3650
|
证书重命名(为了符合 rancher docker 安装对证书的要求):
2.1.3 安装 Rancher
通过 docker-compose 方式启动,方便通过文件形式查看相关配置。
Yaml 配置参考了这里 和这里
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| version: '3.3' services: rancher: restart: unless-stopped ports: - '80:80' - '443:443' environment: - 'HTTP_PROXY=http://192.168.0.1:8080' - 'HTTPS_PROXY=http://192.168.0.1:8080' - 'NO_PROXY=localhost,127.0.0.1,0.0.0.0,192.168.0.100,cattle-system.svc,.svc,.cluster.local,example.com' - CATTLE_TLS_MIN_VERSION=1.0 - SSL_CERT_DIR="/etc/rancher/ssl" - AUDIT_LEVEL=1 - CATTLE_SYSTEM_DEFAULT_REGISTRY=registry.cn-hangzhou.aliyuncs.com volumes: - '/data/rancher:/var/lib/rancher' - '/data/rancher/certs/cert.pem:/etc/rancher/ssl/cert.pem' - '/data/rancher/certs/key.pem:/etc/rancher/ssl/key.pem' - '/data/rancher/certs/cacerts.pem:/etc/rancher/ssl/cacerts.pem' - '/data/rancher/log/auditlog:/var/log/auditlog' privileged: true image: 'registry.cn-hangzhou.aliyuncs.com/rancher/rancher:v2.6.3'
|
启动 rancher:
可以通过以下命令查看启动日志:
启动后,通过浏览器访问:https://192.168.0.100/,第一次显示如下:
在 terminal 中按照要求输入如下命令获取 bootstrap password:
1 2 3
| 2022/01/29 07:56:10 [INFO] Bootstrap Password: ...
|
并把该密码输入到输入框中,随后会生成一个 admin 密码,如下:
勾选I agree...
,点击 Continue
进入 rancher 首页,如下图:
至此 Rancher 安装完成。
2.1.4 Rancher 中国区优化配置
使用码云代替 Github
Rancher 默认使用 Github 上的 repo 作为 Chart 仓库的 URL,如果出现 timeout 情况,可以将 Chart 仓库 URL 替换成码云的地址。
每个 repo 的对应关系如下:
那么如何修改 Chart 仓库 URL 呢?
- 首页点击左上角汉堡菜单,选择「管理集群」->「Advanced」-> 「Chart 仓库」
- 点击列表右侧的省略号 -> Edit
- 将 Chart 仓库 URL 替换成码云中的地址即可,点击 Save
- 此时,对应的 Chart 仓库的状态变为 Refreshed,等待其变为 Active 之后即可正常使用
修改后如下:
总结
至此,Rancher 单节点安装完成。🎉🎉🎉
- 地址:https://192.168.0.100
- 目录:
/data/rancher
- 证书目录:
/data/rancher/certs
- 审计日志目录:
/data/rancher/log/auditlog