一 基礎(chǔ)信息
1.1 前提
- 本次安裝的為 20220129 最新版:Rancher v2.6.3
- VM 版本為 RHEL 7.8, 7.9 或 8.2, 8.3, 8.4(Rancher 官網(wǎng)要求)
- VM YUM 倉庫:已配置對應(yīng)版本的 RHEL 和 EPEL YUM 倉庫
- VM 提供 root 權(quán)限
- 已配置 ntp(防止因?yàn)闀r間不一致導(dǎo)致的詭異問題)
- 提供 Proxy 訪問互聯(lián)網(wǎng) Rancher 相關(guān)域名梯影;
- 端口要求韵吨,為了正常運(yùn)行,Rancher 需要在 Rancher 節(jié)點(diǎn)和下游 Kubernetes 集群節(jié)點(diǎn)上開放一些端口温亲。端口需求列出了不同集群類型的 Rancher 和下游集群的所有必要端口像屋。具體如下表:
Rancher 節(jié)點(diǎn)的入站規(guī)則
協(xié)議 | 端口 | 源 | 目的 | 描述 |
---|---|---|---|---|
TCP | 80 | 客戶端端考,操作機(jī) | Rancher 節(jié)點(diǎn) | 使用外部 SSL 終端時的 Rancher UI/API |
TCP | 443 | 客戶端紫新,操作機(jī),所有 K3S 節(jié)點(diǎn) | Rancher 節(jié)點(diǎn) | Rancher agent担平,Rancher UI/API示绊,kubectl |
Rancher 節(jié)點(diǎn)的出站規(guī)則
協(xié)議 | 端口 | 源 | 目的 | 描述 |
---|---|---|---|---|
TCP | 22 | Rancher 節(jié)點(diǎn) | 所有 K3S 節(jié)點(diǎn) | 使用 Node Driver 對節(jié)點(diǎn)進(jìn)行 SSH 配置 |
TCP | 2376 | Rancher 節(jié)點(diǎn) | 所有 K3S 節(jié)點(diǎn) | Docker Machine 使用的 Docker daemon TLS 端口 |
TCP | 6443 | Rancher 節(jié)點(diǎn) | K3S Server | Kubernetes API server |
? 成功:
如果以上前期條件均已滿足。
即可以通過「離線 - 有代理」方式進(jìn)行安裝暂论。
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 國內(nèi)組件源 |
https://registry.cn-hangzhou.aliyuncs.com | Rancher 國內(nèi)鏡像源 |
https://dockerauth.cn-hangzhou.aliyuncs.com | Rancher 國內(nèi)鏡像源 |
https://gitee.com | Rancher 國內(nèi) Helm Charts 源 |
http://mirrors.aliyun.com | YUM 源 |
https://mirrors.aliyun.com | YUM 源 |
https://rpm.rancher.com | Rancher 源 |
?? 評論:
以上的 allowed domain 可能不全面褐,需要進(jìn)一步補(bǔ)充。
二 「離線 - 有代理」方式安裝
?? 評論:
本次環(huán)境為:離線取胎,有代理展哭。
通過代理安裝部署。
假設(shè) Rancher 所在主機(jī) 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 有關(guān)的 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]:
首先創(chuàng)建配置文件:
# 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"
最后重啟容器并驗(yàn)證:
# systemctl daemon-reload
# systemctl restart docker
# systemctl show docker --property Environment
?? 評論:
Linux
NO_PROXY
CIDR 方式配置不生效,只有 IP 地址會生效觉痛。
2.1.2 生成 100 年有效期的證書
?? 評論:
df -h
查看文件系統(tǒng)役衡,如下:# 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 證書需要的主域名手蝎,如不指定則默認(rèn)為 www.rancher.local榕莺,如果是 ip 訪問服務(wù),則可忽略柑船;'
echo ' --ssl-trusted-ip: 一般 ssl 證書只信任域名的訪問請求帽撑,有時候需要使用 ip 去訪問 server,那么需要給 ssl 證書添加擴(kuò)展 IP鞍时,多個 IP 用逗號隔開;'
echo ' --ssl-trusted-domain: 如果想多個域名訪問扣蜻,則添加擴(kuò)展域名(SSL_TRUSTED_DOMAIN), 多個擴(kuò)展域名用逗號隔開逆巍;'
echo ' --ssl-size: ssl 加密位數(shù),默認(rèn) 2048莽使;'
echo ' --ssl-cn: 國家代碼 (2 個字母的代號), 默認(rèn) 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 相關(guān)配置
CA_DATE=${CA_DATE:-3650}
CA_KEY=${CA_KEY:-cakey.pem}
CA_CERT=${CA_CERT:-cacerts.pem}
CA_DOMAIN=cattle-ca
# ssl 相關(guān)配置
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 個字母的代號), 默認(rèn) 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. 發(fā)現(xiàn)已存在 CA 私鑰锐极,備份"${CA_KEY}"為"${CA_KEY}"-bak,然后重新創(chuàng)建 \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. 發(fā)現(xiàn)已存在 CA 證書芳肌,先備份"${CA_CERT}"為"${CA_CERT}"-bak灵再,然后重新創(chuàng)建 \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. 生成服務(wù) SSL KEY ${SSL_KEY} \033[0m"
openssl genrsa -out ${SSL_KEY} ${SSL_SIZE}
echo -e "\033[32m ====> 5. 生成服務(wù) 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. 生成服務(wù) 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 格式輸出結(jié)果 \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. 重命名服務(wù)證書 \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 方式啟動,方便通過文件形式查看相關(guān)配置亿笤。
# vi docker-compose.yml
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/,第一次顯示如下:
在 terminal 中按照要求輸入如下命令獲取 bootstrap password:
# docker logs rancher_rancher_1 2>&1 | grep "Bootstrap Password:"
2022/01/29 07:56:10 [INFO] Bootstrap Password:
...
并把該密碼輸入到輸入框中净薛,隨后會生成一個 admin 密碼汪榔,如下:
勾選I agree...
,點(diǎn)擊 Continue
進(jìn)入 rancher 首頁肃拜,如下圖:
至此 Rancher 安裝完成痴腌。
2.1.4 Rancher 中國區(qū)優(yōu)化配置
使用碼云代替 Github
Rancher 默認(rèn)使用 Github 上的 repo 作為 Chart 倉庫的 URL,如果出現(xiàn) timeout 情況燃领,可以將 Chart 倉庫 URL 替換成碼云的地址士聪。
每個 repo 的對應(yīng)關(guān)系如下:
那么如何修改 Chart 倉庫 URL 呢?
- 首頁點(diǎn)擊左上角漢堡菜單猛蔽,選擇「管理集群」->「Advanced」-> 「Chart 倉庫」
- 點(diǎn)擊列表右側(cè)的省略號 -> Edit
- 將 Chart 倉庫 URL 替換成碼云中的地址即可剥悟,點(diǎn)擊 Save
- 此時,對應(yīng)的 Chart 倉庫的狀態(tài)變?yōu)?Refreshed枢舶,等待其變?yōu)?Active 之后即可正常使用
修改后如下:
總結(jié)
至此懦胞,Rancher 單節(jié)點(diǎn)安裝完成。??????
- 地址:https://192.168.0.100
- 目錄:
/data/rancher
- 證書目錄:
/data/rancher/certs
- 審計(jì)日志目錄:
/data/rancher/log/auditlog
三人行, 必有我?guī)? 知識共享, 天下為公. 本文由東風(fēng)微鳴技術(shù)博客 EWhisper.cn 編寫.