Rancher On K3s 高可用架構部署

Rancher 推薦部署架構

k3s 模式
node

RKE 和 k8s 模式

備註:
我對 RKE 的理解就是 Ansible + kubeadm 的打包,首先 rke 須要到每個節點均可以避免密 ssh ,其次,可使用相似 kubeadm-config.yaml 的配置文件 init 一個 k8s 集羣。固然 rke 能夠有效的管理證書。linux

高可用模式下,一句大白話:不管如何你都須要 Rancher on K8s

k3s 部署

etcd 部署

k3s 支持多種外部存儲,例如:SQLite, MySQL,PostgSQL,etcd。Why is etcd?
etcd: 高可用部署方便,集羣管理方便,沒有複雜的主從庫搭建,加上 k8s 集羣自己就須要維護 etcd ,因此維護成本較低。
目前 Rancher 官方認證的版本是 etcd v3.3.15
選擇數據庫git

# 準備 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
#[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 servergithub

# 下載部署腳本
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 官方提供了很是完善的簽證腳本
簽證docker

#!/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
mkdir /data/das/rancher-key
cd /data/das/rancher-key
# 執行自簽證腳本
./key-create.sh --ssl-domain=rancher.mydoman.com --ssl-truted-ip=<RANCHER_LB_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 啓動參數數據庫

……
  spec:
      containers:
      - args:
        - --configfile=/config/traefik.toml
        # 添加這一行
        - --rancher
        image: rancher/library-traefik:1.7.19
        imagePullPolicy: IfNotPresent
……

現象:
導入集羣 cattle-system 報錯 http://yourdomain.com 沒法解析,不可達
緣由:
沒有作域名解析
解決方式:json

kubectl -n cattle-system edit deployments.apps cattle-cluster-agent
# 在 cattle-cluster-agent 添加 host 映射
……
    spec:
      hostAliases:
      - hostnames:
        - yourdomain.com
        ip: 192.168.1.1
……

現象:
k3s 使用 docker 啓動報錯,有異常
緣由:
docker 使用 systemd cgroup 驅動管理 cgroup
解決方式:vim

vim /etc/docker/daemon.json
systemctl restart docker
{ 
# 刪除 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 有額外支持 備註:具體參數加什麼,須要加上以後 kubectl -n kube-system logs traefik-<DEPLOYMENT_ID>-<POD_ID> 看一下報錯,如今 k3s 默認安裝 traefik v1.5
Rancher官方TLS自簽證幫助文檔
RancherServer 推薦部署架構
k3s 離線安裝
k3s 數據存儲選項
Rancher中國區倉庫備註:經常使用 k8s 版本都有
Rancher在阿里雲的鏡像倉庫備註:中國區倉庫裏面 /rancher/v / 裏面會有 image-list.txt 這些 image 前面加上鏡像倉庫地址,基本均可以拉獲得鏡像 bash

相關文章
相關標籤/搜索