Rancher 系列文章-RHEL7.8 離線有代理條件下安裝單節點 Rancher

東風微鳴發表於2023-03-31

一 基礎資訊

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 官方文件 ↩︎

相關文章