1. 程式人生 > >Docker容器管理平臺Rancher高可用部署——看這篇就夠了

Docker容器管理平臺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叢集證書均使用自簽名私有證書。
  • 中文官網文件:https://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。

    參考:https://github.com/easzlab/kubeasz/blob/master/docs/guide/kernel_upgrade.md

    centos7核心升級步驟:

# 載入公鑰
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"
  說明:需要增加 INSTALL_K3S_EXEC="--tls-san rancher.test.cn" 這段,否則叢集證書不認rancher.test.cn或者對應的IP。   參考:https://github.com/k3s-io/k3s/issues/1381

 

  2. k3s建立成功確認:

  分別在2臺節點上確認k3s是否建立成功:
k3s kubectl get nodes
  測試叢集容器的執行狀況:

k3s kubectl get pods --all-namespaces
  此時會發現系統一直在建立映象(網路超時),需要對容器加速。請參考第4步(映象加速)。     3. 儲存並使用 kubeconfig 檔案:   備份/etc/rancher/k3s/k3s.yaml,並將其拷貝一份命名成~/.kube/config:
cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
  修改~/.kube/config配置檔案中的server引數為rancher.test.cn,如下:

[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:
      - "https://fogjl973.mirror.aliyuncs.com"
      - "https://registry-1.docker.io"
EOF

systemctl restart k3s
  再次執行下面命令,檢視pod狀態,發現各映象開始下載:

k3s kubectl get pods --all-namespaces

 

 【安裝RANCHER】

  1. 在2臺k3s節點上確保安裝下面CLI工具:
  • kubectl - Kubernetes 命令列工具;
  • helm,可到helm官網下載二進位制包直接使用;
    2. 新增 Helm Chart 倉庫:

helm repo add rancher-stable http://rancher-mirror.oss-cn-beijing.aliyuncs.com/server-charts/stable

 

  3.為 Rancher 建立 Namespace:

kubectl create namespace cattle-system
    4.使用私有自簽名證書:   使用自簽名證書可以不用安裝cert-manager,從而避免安裝cert-manager很慢。   建立自動建立證書的指令碼(指令碼內容摘抄自Rancher官網,命名為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} ]]; 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
    5.通過Helm安裝Rancher
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 "http://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
    6.驗證 Rancher Server 是否已成功部署:   檢查 Rancher Server 是否執行成功:
kubectl -n cattle-system rollout status deploy/rancher
  若出現下面資訊(successfully rolled out)則表示成功,否則繼續等待:
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
  若出現下面資訊則表示安裝成功(DESIRED和AVAILABLE應該顯示相同的個數):
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
rancher 3 3 3 3 3m

 

恭喜!

  到此安裝完成,可以通過瀏覽器訪問 http://rancher.test.cn   激動人心的時刻!

 感謝RANCHER公司為我們提供了這款開源、簡潔易用、功能強大的容器管理平臺!

 

 

【附錄】

安裝Docker:
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":["https://6kx4zyno.mirror.aliyuncs.com"]
}

生效容器加速配置:

systemctl daemon-reload 
systemctl restart docker

 

恭喜! 

Docker安裝完畢。