RKE搭建k8s集群&Helm3安裝Rancher2.5.8高可用


RKE搭建k8s集群&Helm3安裝Rancher2.5.8高可用

下圖是從網上借鑒的:

部署要點:
系統版本:
建議使用Ubuntu 16.04.3 LTS版本,如果是CentOS7,建議7.3以上版本;
Docker版本:
RKE在Github上的readme中已有說明,Kubernetes1.8需要Docker 1.12.6、1.13.1、17.03,Kubernetes1.8不支持更高版本的Docker;
主機名:
如果是克隆的系統一定要修改主機名,hostname主機名必須不同!
主機文件:
/etc/hosts要配置正確,一定要有127.0.0.1 localhost 這一項。Hosts文件中包含所有主機節點的IP和名稱列表。使用vi進行編輯,不能使用中文全角的空格;
SELinux:
必須關閉!Ubuntu 16.04默認未安裝,無需設置。CentOS7下可修改配置文件/etc/sysconfig/selinux,設置SELINUX=disabled ,重啟后永久關閉。
IPV4轉發:
必須開啟!Ubuntu 16.04下默認已啟用,無需設置。CentOS7 下可編輯配置文件/etc/sysctl.conf,設置啟用轉發,
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
執行sudo sysctl -p 立刻生效。
centos:

防火牆:
開放集群主機節點之間6443、2379、2380端口,如果是剛開始試用,可以先關閉防火牆;Ubuntu默認未啟用UFW防火牆,無需設置。也可手工關閉:sudo ufw disable。centos:systemctl stop firewalld.service,systemctl disable firewalld.service
禁用SWAP:
一定要禁用swap,否則kubelet組件無法運行,永久禁用swap可以直接修改/etc/fstab文件,注釋掉swap項。swapoff -a 只是臨時禁用,下次關機重啟又恢復原樣;
啟用Cgroup:
修改配置文件/etc/default/grub,啟用cgroup內存限額功能,配置兩個參數:
GRUB_CMDLINE_LINUX_DEFAULT="cgroup_enable=memory swapaccount=1"
GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"
注意:要執行sudo update-grub 更新grub,然后重啟系統后生效。
SSH免密登錄:
RKE通過SSH tunnel進行安裝部署,需要事先建立RKE到各節點的SSH免密登錄。如果集群中有5個節點,需要在RKE機器上執行1遍秘鑰生成命令ssh-keygen +5次公鑰分發命令ssh-copy-id user1@節點IP。如果執行RKE的本機也要加入到K8S集群中,也要使用ssh-copy-id user1@本機IP,將公鑰分發到本機,對本機執行ssh免密配置,否則也會報錯。

RKE搭建k8s集群

環境准備

操作系統是: Linux version 5.4.0-65-generic (buildd@lcy01-amd64-018) (gcc version 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04)) #73-Ubuntu SMP Mon Jan 18 17:25:17 UTC 2021

docker版本:Docker version 20.10.7, build f0df350

cpu 內存 ip
4 4 X.X.40.17
4 4 X.X.40.18
4 4 X.X.40.19

RKE安裝

下載包(執行服務ip:X.X.40.17)

# wget https://github.com/rancher/rke/releases/download/v1.2.8/rke_linux-amd64
# mv rke_linux-amd64 /usr/local/bin/rke && chmod +x /usr/local/bin/rke

創建用戶(執行服務ip:X.X.40.17,X.X.40.18,X.X.40.19)

# useradd vonechain
# usermod -a -G docker vonechain

K8s集群安裝

SSH免密(執行服務ip:X.X.40.17,X.X.40.18,X.X.40.19)

#su – vonechain
#ssh-keygen

傳輸公鑰(執行服務器ip:X.X.140.17 ):

su - vonechain
ssh-copy-id  vonechain@X.X.140.18
ssh-copy-id  vonechain@X.X.140.19
ssh-copy-id  vonechain@X.X.140.17   

本機也需要上傳,不然在k8s創建集群時會報下面告警,導致集群只有2個節點:

傳輸公鑰(執行服務器ip:X.X.140.18)

su - vonechain
ssh-copy-id X.X.40.17
ssh-copy-id X.X.40.19

傳輸公鑰(執行服務器ip:X.X.140.19)

su - vonechain
ssh-copy-id X.X.40.18
ssh-copy-id X.X.40.17

編寫rancher-cluster.yml(執行服務器ip:X.X.140.17 ):

# cat rancher-cluster.yml 
nodes:
  - address: X.X.40.17
    internal_address: X.X.40.17
    user: vonechain
    role: [controlplane,worker,etcd]
  - address: X.X.40.18
    internal_address: X.X.40.18
    user: vonechain
    role: [controlplane,worker,etcd]
  - address: X.X.40.19
    internal_address: X.X.40.19
    user: vonechain
    role: [controlplane,worker,etcd]

services:
    etcd:
      snapshot: true
      creation: 6h
      retention: 24h

執行RKE,安裝k8s集群(執行服務器ip:X.X.140.17 ):

rke up --config ./rancher-cluster.yml

設置環境變量(執行服務器ip:X.X.140.17 ):

su - vonechain
vim .bashrc
添加:export KUBECONFIG=/home/vonechain/kube_config_rancher-cluster.yml
source .bashrc


安裝Kubectl(執行服務器ip:X.X.140.17 ):

切到root賬戶
# curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg| sudo apt-key add –

# cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial main
EOF

# apt-get update

# apt-get install -y kubectl

檢查k8s集群(執行服務器ip:X.X.140.17 ):

su – vonechain
kubectl get nodes

Helm3安裝Rancher2.5.8高可用

安裝Helm3

下載安裝helm3(執行服務器IP:X.X.40.17):

切到root賬戶
# wget -c https://get.helm.sh/helm-v3.6.2-linux-amd64.tar.gz
# tar zxvf helm-v3.6.2-linux-amd64.tar.gz
# mv ./linux-amd64/helm /usr/local/bin/helm && chmod +x /usr/local/bin/helm
# helm version

Helm3安裝Rancher2.5.8集群

以下操作全部都是在X.X.40.17服務器上執行。

使用helm repo add命令添加Rancher chart倉庫地址

su - vonechain
helm repo add rancher-stable https://releases.rancher.com/server-charts/stable

生成自簽證書

bash  key.sh  --ssl-size=2048 --ssl-date=3650

域名就是默認的:www.rancher.local。

看看key.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-date: ssl有效期,默認10年;'
    echo  ' --ca-date: ca有效期,默認10年;'
    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

創建 rancher 的 namespace

kubectl --kubeconfig=$KUBECONFIG     create namespace cattle-system

helm 渲染中 --set privateCA=true 用到的證書

kubectl -n cattle-system create secret generic tls-ca --from-file=cacerts.pem

helm 渲染中 --set additionalTrustedCAs=true 用到的證書

cp cacerts.pem ca-additional.pem
kubectl -n cattle-system create secret generic tls-ca-additional --from-file=ca-additional.pem

helm 渲染中 --set ingress.tls.source=secret 用到的證書和密鑰

kubectl -n cattle-system create secret tls tls-rancher-ingress --cert=tls.crt --key=tls.key

通過Helm將部署模板下載到本地:

helm fetch rancher-stable/rancher
當前目錄會多一個rancher-2.5.8.tgz

使用以下命令渲染模板:

helm template rancher ./rancher-2.5.8.tgz \
     --namespace cattle-system --output-dir . \
     --set privateCA=true \
     --set additionalTrustedCAs=true \
     --set ingress.tls.source=secret \
     --set hostname=www.rancher.local \
     --set useBundledSystemChart=true

在rancher目錄中可以看到渲染好的模板文件:

使用kubectl安裝rancher

kubectl -n cattle-system apply -R -f ./rancher/templates/

執行結果:

在執行結果中有個告警:Warning: networking.k8s.io/v1beta1 Ingress is deprecated in v1.19+, unavailable in v1.22+; use networking.k8s.io/v1 Ingress
這個時,我們需要去修改ingress.yaml,不然服務會有問題

修改文件請參考官方文檔:

Kubernetes version 1.20+ introduces the networking.k8s.io API version as stable. If you have ingresses that predate K3S 1.20, you have until Kubernetes 1.22 to update them. Until then, if you use old-style ingress definitions, you will receive a warning like Warning: networking.k8s.io/v1beta1 Ingress is deprecated in v1.19+, unavailable in v1.22+; use networking.k8s.io/v1 Ingress when you apply the ingress to a cluster.

變化:

spec.backend -> spec.defaultBackend
serviceName -> service.name
servicePort -> service.port.name (for string values)
servicePort -> service.port.number (for numeric values)
pathType no longer has a default value in v1; Exact, Prefix, or ImplementationSpecific must be specified for each.

修改好后將ingress刪除再啟動:

cd /home/vonechain/rancher/templates
kubectl -n cattle-system delete -R -f ingress.yaml 
kubectl -n cattle-system apply -R -f ingress.yaml

檢查安裝進度:

kubectl -n cattle-system get all

到此,我們已經安裝完了!

由於域名是自定義的,我們需要在自己的windows上配置hosts:

瀏覽器上打開:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM