zoukankan      html  css  js  c++  java
  • 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 "33[32m ---------------------------- 33[0m"
    echo -e "33[32m       | 生成 SSL Cert |       33[0m"
    echo -e "33[32m ---------------------------- 33[0m"
    
    if [[ -e ./${CA_KEY} ]]; then
        echo -e "33[32m ====> 1. 发现已存在CA私钥,备份"${CA_KEY}"为"${CA_KEY}"-bak,然后重新创建 33[0m"
        mv ${CA_KEY} "${CA_KEY}"-bak
        openssl genrsa -out ${CA_KEY} ${SSL_SIZE}
    else
        echo -e "33[32m ====> 1. 生成新的CA私钥 ${CA_KEY} 33[0m"
        openssl genrsa -out ${CA_KEY} ${SSL_SIZE}
    fi
    
    if [[ -e ./${CA_CERT} ]]; then
        echo -e "33[32m ====> 2. 发现已存在CA证书,先备份"${CA_CERT}"为"${CA_CERT}"-bak,然后重新创建 33[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 "33[32m ====> 2. 生成新的CA证书 ${CA_CERT} 33[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 "33[32m ====> 3. 生成Openssl配置文件 ${SSL_CONFIG} 33[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 "33[32m ====> 4. 生成服务SSL KEY ${SSL_KEY} 33[0m"
    openssl genrsa -out ${SSL_KEY} ${SSL_SIZE}
    
    echo -e "33[32m ====> 5. 生成服务SSL CSR ${SSL_CSR} 33[0m"
    openssl req -sha256 -new -key ${SSL_KEY} -out ${SSL_CSR} -subj "/C=${CN}/CN=${SSL_DOMAIN}" -config ${SSL_CONFIG}
    
    echo -e "33[32m ====> 6. 生成服务SSL CERT ${SSL_CERT} 33[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 "33[32m ====> 7. 证书制作完成 33[0m"
    echo
    echo -e "33[32m ====> 8. 以YAML格式输出结果 33[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 "33[32m ====> 9. 附加CA证书到Cert文件 33[0m"
    cat ${CA_CERT} >> ${SSL_CERT}
    echo "ssl_cert: |"
    cat $SSL_CERT | sed 's/^/  /'
    echo
    
    echo -e "33[32m ====> 10. 重命名服务证书 33[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:

    浏览器上打开:

  • 相关阅读:
    u-swipe-action报错Error: Not Found:Page[2][-1,20-9;9] at view.umd.min.js:1
    vue ui框架
    windows下简单部署django+vue项目(打包后)
    vue+django开发配置(vue转发请求、跨域携带cookie)
    python做定时任务schedule、aspscheduler、celery
    第四章练习题
    软件开发目录规范
    常用模块学习(六)
    常用模块学习(五)
    常用模块学习(二)
  • 原文地址:https://www.cnblogs.com/zoujiaojiao/p/15011469.html
Copyright © 2011-2022 走看看