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:
瀏覽器上打開: