Docker容器管理平台Rancher高可用部署——看這篇就夠了
- 2021 年 2 月 3 日
- 筆記
- centos7內核升級, DevOps, devops-cicd, docker安裝, docker容器管理平台, k8s, Rancher, rancher單點安裝, rancher部署, rancher集群證書, rancher高可用部署安裝
記得剛接觸Rancher時,看了官方文檔雲里霧裡,跟着官網文檔部署了高可用Rancher,發現不管怎麼折騰都無法部署成功(相信已嘗試的朋友也有類似的感覺),今天騰出空來寫個總結,給看到的朋友留個參考(親測可用!按照下面步驟操作不會出現部署超時、部署完成後無法打開等問題)。
也許有人會問:什麼是RANCHER?套用官網的話:Rancher 是為使用容器的公司打造的容器管理平台。
也許有人又會問:用K8s不香嗎,為什麼要加一層RANCHER?其實K8s是比較複雜的,尤其是各組件的版本選擇以及大規模的使用場景上,需要一個管理平台降低容器化落地的複雜度。
【說明】:
- 當前Rancher版本為:V2.5.5 ;
- 若只想通過Docker安裝單機版體驗,可執行:
docker run -d --privileged --restart=unless-stopped -p 80:80 -p 443:443 --privileged rancher/rancher:latest
- 下面部署的Rancher集群證書均使用自簽名私有證書。
- 中文官網文檔://docs.rancher.cn/rancher2/ 。
- 通過Rancher導入K8s集群時,需要預先在目標服務器上安裝Docker,Docker的安裝請參考【附錄】。
【規劃】:
- 用2台centos7部署k3s+rancher(做高可用),IP分別為:192.168.21.30,192.168.21.31;
- 用1台centos部署mysql5.7存儲rancher數據,同時部署nginx代理2台rancher,IP為:192.168.20.101;
- 配置dns域名:rancher.test.cn – 192.168.20.101 ;
【安裝K3s(K8s)】
說明:什麼是K3s?K3s是K8s的精簡版,很多時候我們並不需要用到K8s的所有功能,Rancher公司幫我們做了一款精簡版的K8s,即K3s,推薦在K3s上部署Rancher。
一、準備工作
1. 內核升級:
建議所有K8s節點(包括K3s、k8s master worker節點)內核均升級到最新穩定版(目前是kernel5.4),好處請自行Google。
# 載入公鑰 rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org # 安裝ELRepo rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm # 載入elrepo-kernel元數據 yum --disablerepo=\* --enablerepo=elrepo-kernel repolist # 查看可用的rpm包 yum --disablerepo=\* --enablerepo=elrepo-kernel list kernel* # 安裝長期支持版本的kernel yum --disablerepo=\* --enablerepo=elrepo-kernel install -y kernel-lt.x86_64 # 刪除舊版本工具包 yum remove kernel-tools-libs.x86_64 kernel-tools.x86_64 -y # 安裝新版本工具包 yum --disablerepo=\* --enablerepo=elrepo-kernel install -y kernel-lt-tools.x86_64 #查看默認啟動順序 awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg CentOS Linux (4.4.183-1.el7.elrepo.x86_64) 7 (Core) CentOS Linux (3.10.0-327.10.1.el7.x86_64) 7 (Core) CentOS Linux (0-rescue-c52097a1078c403da03b8eddeac5080b) 7 (Core) #默認啟動的順序是從0開始,新內核是從頭插入(目前位置在0,而4.4.4的是在1),所以需要選擇0。 grub2-set-default 0 #重啟並檢查 reboot
2. 修改主機名:
hostnamectl set-hostname k3s01 echo "127.0.0.1 k3s01" >> /etc/hosts
3. 配置dns或者在每台服務器及個人電腦上添加hosts解析(192.168.20.101 rancher.test.cn);
4. 2台rancher節點上安裝helm:
wget http://rancher-mirror.cnrancher.com/helm/v3.4.2/helm-v3.4.2-linux-amd64.tar.gz tar zxf helm-v3.4.2-linux-amd64.tar.gz cp linux-amd64/helm /usr/local/sbin/
5. 部署mysql5.7(具體請百度),創建”rancher”庫,創建用戶rancher,密碼為rancher,mysql端口為61306。
6. 部署nginx(我是直接在mysql5.7服務器上部署,即IP為192.168.20.101這台機器),代理配置如下:
[root@rancher-proxy ~]# cat /etc/nginx/nginx.conf worker_processes 4; worker_rlimit_nofile 40000; include /usr/share/nginx/modules/*.conf; events { worker_connections 8192; } stream { upstream rancher_servers_http { least_conn; server 192.168.21.30:80 max_fails=3 fail_timeout=5s; server 192.168.21.31:80 max_fails=3 fail_timeout=5s; } server { listen 80; proxy_pass rancher_servers_http; } upstream rancher_servers_https { least_conn; server 192.168.21.30:443 max_fails=3 fail_timeout=5s; server 192.168.21.31:443 max_fails=3 fail_timeout=5s; } server { listen 443; proxy_pass rancher_servers_https; } upstream rancher_servers_k8sapi { least_conn; server 192.168.21.30:6443 max_fails=3 fail_timeout=5s; server 192.168.21.31:6443 max_fails=3 fail_timeout=5s; } server { listen 6443; proxy_pass rancher_servers_k8sapi; } }
二、部署K3s
1. 分別在2台Rancher節點上,運行以下命令以啟動 K3s Server 並將其連接到外部數據庫:
curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_EXEC="--tls-san rancher.test.cn" INSTALL_K3S_MIRROR=cn sh -s - server --datastore-endpoint="mysql://rancher:rancher@tcp(192.168.20.101:61306)/rancher"
2. k3s創建成功確認:
k3s kubectl get nodes
k3s kubectl get pods --all-namespaces
cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
[root@k3s02 ~]# cat ~/.kube/config apiVersion: v1 clusters: - cluster: …… server: https://rancher.test.cn:6443 ……
結果: 您現在可以使用kubectl來管理您的 K3s 集群。如果您有多個 kubeconfig 文件,可以在使用kubectl時通過傳遞文件路徑來指定要使用的kubeconfig文件:
kubectl --kubeconfig ~/.kube/config get pods --all-namespaces
4. 鏡像加速
cat >> /etc/rancher/k3s/registries.yaml <<EOF mirrors: "docker.io": endpoint: - "//fogjl973.mirror.aliyuncs.com" - "//registry-1.docker.io" EOF systemctl restart k3s
k3s kubectl get pods --all-namespaces
【安裝RANCHER】
helm repo add rancher-stable http://rancher-mirror.oss-cn-beijing.aliyuncs.com/server-charts/stable
kubectl create namespace cattle-system
#!/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} ]]; 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
生成證書:
./create_self-signed-cert.sh --ssl-domain=rancher.test.cn --ssl-trusted-domain=rancher.test.cn --ssl-trusted-ip=192.168.20.101,192.168.21.30,192.168.21.31 --ssl-size=2048 --ssl-date=3650
kubectl -n cattle-system create secret tls tls-rancher-ingress --cert=tls.crt --key=tls.key kubectl -n cattle-system create secret generic tls-ca --from-file=cacerts.pem=./cacerts.pem
helm install rancher rancher-stable/rancher --namespace cattle-system --set hostname=rancher.test.cn --set ingress.tls.source=secret --set privateCA=true
Error: Kubernetes cluster unreachable: Get "//localhost:8080/version?timeout=32s": dial tcp 127.0.0.1:8080: connect: connection refused
可以執行下面步驟:
export KUBECONFIG=~/.kube/config
檢查:
kubectl get pods --all-namespaces helm ls --all-namespaces
kubectl -n cattle-system rollout status deploy/rancher
Waiting for deployment "rancher" rollout to finish: 0 of 3 updated replicas are available... deployment "rancher" successfully rolled out
檢查 deployment 的狀態:
kubectl -n cattle-system get deploy rancher
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE rancher 3 3 3 3 3m
恭喜!

感謝RANCHER公司為我們提供了這款開源、簡潔易用、功能強大的容器管理平台!
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo wget -P /etc/yum.repos.d/ http://mirrors.aliyun.com/repo/epel-7.repo yum install docker-ce -y docker --version sudo systemctl start docker sudo systemctl enable docker sudo systemctl status docker
容器加速:
[root@rancher-work02 ~]# cat /etc/docker/daemon.json { "registry-mirrors":["//6kx4zyno.mirror.aliyuncs.com"] }
生效容器加速配置:
systemctl daemon-reload
systemctl restart docker
恭喜!
Docker安裝完畢。