一 基础信息
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 信息
ftp_proxy="http://192.168.0.1:8080" http_proxy="http://192.168.0.1:8080" https_proxy="http://192.168.0.1:8080" BASH |
proxy 需要 allow 的 doamin 如下:
域名 | 用途 |
http://mirror.cnrancher.com | Rancher 国内组件源 |
https://registry.cn-hangzhou.aliyuncs.com | Rancher 国内镜像源 |
https://dockerauth.cn-hangzhou.aliyuncs.com | Rancher 国内镜像源 |
https://gitee.com | Rancher 国内 Helm Charts 源 |
http://mirrors.aliyun.com | YUM 源 |
https://mirrors.aliyun.com | YUM 源 |
https://rpm.rancher.com | Rancher 源 |
🧠 评论:
以上的 allowed domain 可能不全,需要进一步补充。
二 「离线 - 有代理」方式安装
🧠 评论:
本次环境为:离线,有代理。
通过 代理 安装部署。
假设 Rancher 所在主机 IP 地址为:192.168.0.100
2.1 Rancher 安装配置
2.1.1 安装配置 Docker 及 docker-compose
RHEL 7.8 安装命令如下:
# sudo -i # yum install -y docker docker-compose # systemctl status docker # systemctl enable docker # systemctl start docker BASH |
ℹ️ 信息:
Docker 版本为:1.13,安装后带了 3 个和 docker 有关的 service:
# systemctl list-unit-files|grep docker docker-cleanup.service disabled docker-storage-setup.service disabled docker.service disabled docker-cleanup.timer disabled BASH |
docker.service
目录是:/usr/lib/systemd/system/docker.service
docker-compose version 1.18.0, build 8dd22a9
RHEL registries.conf
配置:
配置 insecure-registry
:
vi /etc/containers/registries.conf BASH |
[registries.search] registries = ['registry.cn-hangzhou.aliyuncs.com', 'registry.access.redhat.com', 'registry.redhat.io', 'docker.io'] [registries.insecure] registries = [] [registries.block] registries = [] INI |
Docker 配置 Proxy(可选配置,建议配置来保障 docker 100% 使用代理)[1]:
首先创建配置文件:
# mkdir -p /usr/lib/systemd/system/docker.service.d/ # vi /usr/lib/systemd/system/docker.service.d/http-proxy.conf BASH |
然后添加配置:
[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" INI |
最后重启容器并验证:
# systemctl daemon-reload # systemctl restart docker # systemctl show docker --property Environment BASH |
🧠 评论:
Linux
NO_PROXY
CIDR 方式配置不生效,只有 IP 地址会生效。
2.1.2 生成 100 年有效期的证书
🧠 评论:
df -h
查看文件系统,如下:
# df -h 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 ... BASH |
/data
目录 100G,所以 rancher 安装在/data/rancher
目录下。
vi create_self-signed-cert.sh BASH |
#!/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 BASH |
chmod +x create_self-signed-cert.sh BASH |
生成 100 年证书:
./create_self-signed-cert.sh --ssl-trusted-ip=192.168.0.100 --ssl-date=3650 BASH |
证书重命名(为了符合 rancher docker 安装对证书的要求):
# cp tls.crt cert.pem # cp tls.key key.pem BASH |
2.1.3 安装 Rancher
通过 docker-compose 方式启动,方便通过文件形式查看相关配置。
# vi docker-compose.yml BASH |
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' YAML |
启动 rancher:
# docker-compose up -d BASH |
可以通过以下命令查看启动日志:
# docker-compose logs -f BASH |
启动后,通过浏览器访问:https://192.168.0.100/,第一次显示如下:
Rancher bootstrap 密码
在 terminal 中按照要求输入如下命令获取 bootstrap password:
# docker logs rancher_rancher_1 2>&1 | grep "Bootstrap Password:" 2022/01/29 07:56:10 [INFO] Bootstrap Password: ... BASH |
并把该密码输入到输入框中,随后会生成一个 admin 密码,如下:
Rancher 安装 - Admin 密码
勾选I agree...
,点击 Continue
进入 rancher 首页,如下图:
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 之后即可正常使用
修改后如下:
修改 Chart 仓库
总结
至此,Rancher 单节点安装完成。🎉🎉🎉
- 地址:https://192.168.0.100
- 目录:
/data/rancher
- 证书目录:
/data/rancher/certs
- 审计日志目录:
/data/rancher/log/auditlog