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:
浏览器上打开: