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:

浏览器上打开:

posted @ 2021-07-14 16:13  邹姣姣  阅读(3318)  评论(0编辑  收藏  举报