1. 程式人生 > >Rancher On K3s 高可用架構部署

Rancher On K3s 高可用架構部署

# Rancher 推薦部署架構 ![](https://docs.rancher.cn/img/rancher/rancher-architecture-separation-of-rancher-server.svg) k3s 模式 ![](https://docs.rancher.cn/img/rancher/k3s-server-storage.svg) RKE 和 k8s 模式 ![](https://docs.rancher.cn/img/rancher/rke-server-storage.svg) 備註: 我對 RKE 的理解就是 Ansible + kubeadm 的打包,首先 rke 需要到每一個節點都可以免密 ssh ,其次,可以使用類似 kubeadm-config.yaml 的配置檔案 init 一個 k8s 叢集。當然 rke 可以有效的管理證書。 # 高可用模式下,一句大白話:無論如何你都需要 Rancher on K8s # k3s 部署 ## etcd 部署 k3s 支援多種外部儲存,例如:SQLite, MySQL,PostgSQL,etcd。Why is etcd? etcd: 高可用部署方便,叢集管理方便,沒有複雜的主從庫搭建,加上 k8s 叢集本身就需要維護 etcd ,所以維護成本較低。 目前 Rancher 官方認證的版本是 etcd v3.3.15 [選擇資料庫](https://docs.rancher.cn/docs/k3s/installation/datastore/_index) ```shell # 準備 3 個節點部署 etcd wget https://github.com/etcd-io/etcd/releases/download/v3.3.15/etcd-v3.3.15-linux-amd64.tar.gz tar xzvf etcd-v3.3.15-linux-amd64.tar.gz -C /data/das/ cp /data/das/k3s-init/etcd-v3.3.15-linux-amd64/etc* /usr/loca/bin # 建立 etcd.service 服務託管於 systemd vim /usr/lib/systemd/system/etcd.service # 建立 etcd 配置檔案 vim /usr/loca/etcd/config # 啟動 etcd systemctl daemon-reload systemctl start etcd systemctl enable etcd ``` ``` [Unit] Description=Etcd Server After=network.target After=network-online.target Wants=network-online.target [Service] Type=notify # 指定環境變數所在 EnvironmentFile=-/usr/local/etcd/config ExecStart=/usr/local/bin/etcd \ --name=${ETCD_NAME} \ --data-dir=${ETCD_DATA_DIR} \ --listen-peer-urls=${ETCD_LISTEN_PEER_URLS} \ --listen-client-urls=${ETCD_LISTEN_CLIENT_URLS},http://127.0.0.1:2379 \ --advertise-client-urls=${ETCD_ADVERTISE_CLIENT_URLS} \ --initial-advertise-peer-urls=${ETCD_INITIAL_ADVERTISE_PEER_URLS} \ --initial-cluster=${ETCD_INITIAL_CLUSTER} \ --initial-cluster-token=${ETCD_INITIAL_CLUSTER} \ --initial-cluster-state=new Restart=on-failure LimitNOFILE=65536 [Install] WantedBy=multi-user.target ``` ```shell #[Member] ##節點名字 ETCD_NAME="etcd01" #資料目錄 ETCD_DATA_DIR="/data/etcd/" #當前節點的ip地址 ETCD_LISTEN_PEER_URLS="http://192.168.1.1:2380" ETCD_LISTEN_CLIENT_URLS="http://192.168.1.1:2379" #[Clustering] ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.1.1:2380" ETCD_ADVERTISE_CLIENT_URLS="http://192.168.1.1:2379" #叢集所有的節點的ip地址 ETCD_INITIAL_CLUSTER="etcd01=http://192.168.1.1:2380,etcd02=http://192.168.1.2:2380,etcd03=http://192.168.1.3:2380" ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster" ETCD_INITIAL_CLUSTER_STATE="new" ``` ## k3s 部署 在兩個節點上部署 k3s server ```shell # 下載部署指令碼 wget http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh cp /data/das/k3s-init/k3s-install.sh /usr/local/bin/install.sh # 下載 k3s 映象 wget http://rancher-mirror.cnrancher.com/k3s/v1.18.2-k3s1/k3s-airgap-images-amd64.tar sudo mkdir -p /var/lib/rancher/k3s/agent/images/ sudo cp ./k3s-airgap-images-amd64.tar /var/lib/rancher/k3s/agent/images/ # 下載 k3s 二進位制檔案 wget http://rancher-mirror.cnrancher.com/k3s/v1.18.2-k3s1/k3s cp /data/das/k3s-init/k3s /usr/local/bin/k3s # 執行 k3s 安裝指令碼 # 跳過遠端安裝 INSTALL_K3S_SKIP_DOWNLOAD=true \ # 叢集名稱 INSTALL_K3S_NAME=rancher-server \ # rancher server 引數配置 --docker 使用 docker 作為容器執行時,--bind-address 繫結節點 INSTALL_K3S_EXEC='server --docker --bind-address=10.50.26.252 --private-registry=https://registry.mydoman.com/rancher-server --write-kubeconfig=/root/.kube/config --write-kubeconfig-mode=644 --node-label asrole=worker --datastore-endpoint="http://10.50.26.252:2379,http://10.50.26.145:2379,http://10.50.26.235:2379" ' \ install.sh # 檢查 k3s-rancher-server 服務是否正常 systemctl status k3s-rancher-server # 等大概 5分鐘左右,檢視 k3s 叢集是否啟動成功 kubectl get pods -A ``` ## rancher 部署 自簽證,Rancher 官方提供了非常完善的簽證指令碼 [簽證](https://docs.rancher.cn/docs/rancher2/installation/options/self-signed-ssl/_index/) ```shell #!/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} <> ${SSL_CONFIG} <> ${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 ``` ```shell mkdir /data/das/rancher-key cd /data/das/rancher-key # 執行自簽證指令碼 ./key-create.sh --ssl-domain=rancher.mydoman.com --ssl-truted-ip= # 驗證是否成功 openssl verify -CAfile cacerts.pem tls.cr openssl x509 -in tls.crt -noout -text ``` Rancher 部署 ```shell # 安裝 helm wget http://rancher-mirror.cnrancher.com/helm/v3.4.0/helm-v3.4.0-linux-amd64.tar.gz tar zxvf helm-v3.4.0-linux-amd64.tar.gz -C /data/das/ cp /data/das/linux-amd64/helm /usr/local/bin/ # 建立名稱空間 kubectl create namespace cattle-system # ca證書密文 kubectl -n cattle-system create secret tls tls-rancher-ingress --cert=/data/das/rancher-key/tls.crt --key=/data/das/rancher-key/tls.key kubectl -n cattle-system create secret generic tls-ca --from-file=cacerts.pem # 新增 chat 倉庫,推薦新增 stable 穩定版倉庫,如果需要固定版本可以去 http://mirror.cnrancher.com/ 上面下載 helm repo add rancher-stable https://releases.rancher.com/server-charts/stable # helm install rancher helm install rancher rancher-stable/rancher \ -n cattle-system \ # 使用自簽證 --set ingress.tls.source=secret \ # 是否使用自簽證 --set privateCA=true \ --set additionalTrustedCAs=true \ --set hostname=rancher.mydoman.com # 驗證是否安裝成功 helm list -n cattle-system # 檢查 rancher 服務執行是否正常 kubectl -n cattle-system get pods # 檢視 ingress 地址 kubectl -n cattle-system get ingress ``` ## 填坑之旅 現象: 通過 ingress 地址訪問 rancher 報 404 等錯誤 解決方式: 修改 k3s 自帶的 traefik deployment 啟動引數 ```yaml …… spec: containers: - args: - --configfile=/config/traefik.toml # 新增這一行 - --rancher image: rancher/library-traefik:1.7.19 imagePullPolicy: IfNotPresent …… ``` 現象: 匯入叢集 cattle-system 報錯 http://yourdomain.com 無法解析,不可達 原因: 沒有做域名解析 解決方式: ```shell kubectl -n cattle-system edit deployments.apps cattle-cluster-agent ``` ```yaml # 在 cattle-cluster-agent 新增 host 對映 …… spec: hostAliases: - hostnames: - yourdomain.com ip: 192.168.1.1 …… ``` 現象: k3s 使用 docker 啟動報錯,有異常 原因: docker 使用 systemd cgroup 驅動管理 cgroup 解決方式: ```shell vim /etc/docker/daemon.json systemctl restart docker ``` ```json { # 刪除 exec-opts 配置 "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m", "max-file": "3" } , "data-root": "/data/docker", "registry-mirrors": ["https://15v8lrgz.mirror.aliyuncs.com"], "insecure-registries":[ "https://registry.mydoman.com" ] } ``` # 參考文獻 [traefik 官方對 Rancher 有額外支援](https://traefik.tech/providers/rancher/) 備註:具體引數加什麼,需要加上之後 `kubectl -n kube-system logs traefik--` 看一下報錯,現在 k3s 預設安裝 traefik v1.5 [Rancher官方TLS自簽證幫助文件](https://docs.rancher.cn/docs/rancher2/installation/options/self-signed-ssl/_index/) [RancherServer 推薦部署架構](https://docs.rancher.cn/docs/rancher2/overview/architecture-recommendations/_index) [k3s 離線安裝](https://docs.rancher.cn/docs/k3s/installation/airgap/_index) [k3s 資料儲存選項](https://docs.rancher.cn/docs/k3s/installation/datastore/_index) [Rancher中國區倉庫](http://mirror.cnrancher.com/)備註:常用 k8s 版本都有 [Rancher在阿里雲的映象倉庫](registry.cn-hangzhou.aliyuncs.com)備註:中國區倉庫裡面 /rancher/v/ 裡面會有 image-list.txt 這些 image 前面加上映象倉庫地址,基本都可以拉得