一 基础信息

1.1 前提

  1. 本次安装的为 20220129 最新版:Rancher v2.6.3
  2. VM 版本为 RHEL 7.8, 7.9 或 8.2, 8.3, 8.4(Rancher 官网要求)
  3. VM YUM 仓库:已配置对应版本的 RHEL 和 EPEL YUM 仓库
  4. VM 提供 root 权限
  5. 已配置 ntp(防止因为时间不一致导致的诡异问题)
  6. 提供 Proxy 访问互联网 Rancher 相关域名;
  7. 端口要求,为了正常运行,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"

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

ℹ️ 信息:

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

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
[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]

首先创建配置文件:

# mkdir -p /usr/lib/systemd/system/docker.service.d/
# vi /usr/lib/systemd/system/docker.service.d/http-proxy.conf

然后添加配置:

[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"

最后重启容器并验证:

# systemctl daemon-reload
# systemctl restart docker
# systemctl show docker --property Environment

? 评论:

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
...

/data 目录 100G,所以 rancher 安装在 /data/rancher 目录下。

vi create_self-signed-cert.sh
#!/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
chmod +x create_self-signed-cert.sh

生成 100 年证书:

./create_self-signed-cert.sh --ssl-trusted-ip=192.168.0.100 --ssl-date=3650

证书重命名(为了符合 rancher docker 安装对证书的要求):

# cp tls.crt cert.pem
# cp tls.key key.pem

2.1.3 安装 Rancher

通过 docker-compose 方式启动,方便通过文件形式查看相关配置。

# vi docker-compose.yml

Yaml 配置参考了这里[2]和这里[3]

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:

# docker-compose up -d

可以通过以下命令查看启动日志:

# docker-compose logs -f

启动后,通过浏览器访问: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: 
...

并把该密码输入到输入框中,随后会生成一个 admin 密码,如下:

Rancher 安装 - Admin 密码

勾选I agree...,点击 Continue 进入 rancher 首页,如下图:

Rancher 首页

至此 Rancher 安装完成。

2.1.4 Rancher 中国区优化配置

使用码云代替 Github

Rancher 默认使用 Github 上的 repo 作为 Chart 仓库的 URL,如果出现 timeout 情况,可以将 Chart 仓库 URL 替换成码云的地址。

每个 repo 的对应关系如下:

应用商店地址 RANCHER REPO 地址 GITEE 地址
https://git.rancher.io/helm3-charts https://github.com/rancher/helm3-charts https://gitee.com/rancher/helm3-charts
https://git.rancher.io/charts https://github.com/rancher/charts https://gitee.com/rancher/charts
https://git.rancher.io/system-charts https://github.com/rancher/system-charts https://gitee.com/rancher/system-charts

那么如何修改 Chart 仓库 URL 呢?

  1. 首页点击左上角汉堡菜单,选择「管理集群」->「Advanced」-> 「Chart 仓库」
  2. 点击列表右侧的省略号 -> Edit
  3. 将 Chart 仓库 URL 替换成码云中的地址即可,点击 Save
  4. 此时,对应的 Chart 仓库的状态变为 Refreshed,等待其变为 Active 之后即可正常使用

修改后如下:

修改 Chart 仓库

总结

至此,Rancher 单节点安装完成。???

  1. 地址:https://192.168.0.100
  2. 目录:/data/rancher
  3. 证书目录:/data/rancher/certs
  4. 审计日志目录:/data/rancher/log/auditlog

三人行, 必有我师; 知识共享, 天下为公. 本文由东风微鸣技术博客 EWhisper.cn 编写.


  1. Configure Docker to use a proxy with or without authentication - Red Hat Customer Portal ↩︎

  2. 选项 B - 使用已有的自签名证书 - Rancher 官方文档 ↩︎

  3. 自定义 CA 证书 - Rancher 官方文档 ↩︎