rke部署高可用k8s

rke搭建k8s流程

  1. 工具篇

    在命令行终端复制内容到配置文件时,遇到的格式错乱问题:
    
    vim 编辑 yaml 格式问题
    在粘贴之前执行以下命令
    :set paste
    
  1. 部署架构

    总共6台服务器:
    针对每台主机设置主机名,且配置每台主机都能相互访问
    每台服务器的/etc/hosts要配置正确,一定要有127.0.0.1 localhost 这一项
    
    hostnamectl set-hostname lb-1
    hostnamectl set-hostname lb-2
    hostnamectl set-hostname k8s-master-1
    hostnamectl set-hostname k8s-master-2
    hostnamectl set-hostname k8s-master-3
    hostnamectl set-hostname k8s-worker-1
    
    cat >> /etc/hosts << EOF
    192.168.0.201  lb-1
    192.168.0.202  lb-2
    192.168.0.211 k8s-master-1
    192.168.0.212 k8s-master-2
    192.168.0.213 k8s-master-3
    192.168.0.221 k8s-worker-1
    EOF
    

    服务器部署架构:

    lb-1,lb-2
    作为集群的流量入口,承担负载均衡作用,
    lb服务器需用keepalived配置VIP 192.168.0.200,负载均衡软件可用nginx也可用haproxy
    k8s-master-1,k8s-master-2,k8s-master-3
    作为主节点的高可用部署
    k8s-worker-1,k8s-worker-n
    作为工作节点
    
  1. 系统和软件版本

    系统版本:centos7.9     8.x
    docker版本:20.10.12
    docker-compose
    rke版本:rke1.3.3       下载地址:https://github.com/rancher/rke
    rancher版本:rancher/hyperkube:v1.20.13-rancher1
    keepalived
    nginx 或 haproxy
    

    centos修改国内源

    cd /etc/yum.repos.d/
    mv CentOS-Base.repo CentOS-Base.repo.bak
    wget -O CentOs-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
    
    #yum源更新命令
    yum clean all
    yum makecache
    yum update
    

    docker安装

    添加阿里云的docker源
    yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
    yum install -y yum-utils device-mapper-persistent-data lvm2
    yum -y install docker-ce
    
    修改docker/daemon.json配置文件
    
    sudo mkdir -p /etc/docker
    cat <<EOF > /etc/docker/daemon.json
    {
        "exec-opts": ["native.cgroupdriver=systemd"],
    
     "log-driver": "json-file",
        "log-opts": {
         "max-size": "100m"
        },
        "storage-driver": "overlay2",
     "registry-mirrors": ["https://cenq021s.mirror.aliyuncs.com"]
    }
    EOF
    
    systemctl daemon-reload & systemctl restart docker & systemctl enable docker
    
    对于运行 Linux 内核版本 4.0 或更高版本,或使用 3.10.0-51 及更高版本的 RHEL 或 CentOS 的系统,`overlay2`是首选的存储驱动程序。
    如发现无法启动,则在配置文件中去除 :
    "storage-driver": "overlay2",
    "log-driver": "json-file",
    "log-opts": {
    "max-size": "100m"
    },
    
    可能遇到的问题:
    yum-config-manager: command not found
    需安装yum-utils
    yum -y install yum-utils
    
    k8s原生安装的时候,docker版本需与k8s版本一直,具体k8s的github中可以查询
    
    如需安装指定版本docker:
    yum install docker-ce-19.03.* -y
    
    已安装高版的docker降级到指定版本
    yum downgrade --setopt=obsoletes=0 -y docker-ce-19.03.13  docker-ce-selinux-19.03.13
    

    docker-compose安装

    yum -y install yum-utils
    
    安装docker-compse
    
    sudo yum -y install epel-release
    
     yum install docker-compose
    
  1. 系统内核参数修改

    关闭防火墙

    由于有网络防火墙,系统自带的firewall防火墙可以关闭;
    systemctl stop firewalld
    systemctl disable firewalld
    
    常用命令:
    #防火墙操作命令 备用
    firewall-cmd --zone=public --remove-port=80/tcp --permanent  
    配置立即生效
    firewall-cmd --reload 
    查看防火墙状态
    systemctl status firewalld
    关闭防火墙
    systemctl stop firewalld
    打开防火墙
    systemctl start firewalld
    

    如不想关闭防火墙的,可以按照以下端口规则开放:

    协议 端口 描述
    TCP 32289 使用主机驱动通过 SSH 进行节点配置
    TCP 2376 主机驱动与 Docker 守护进程通信的 TLS 端口
    TCP 2379 etcd 客户端请求
    TCP 2380 etcd 节点通信
    TCP 179 Calico BGP 端口
    UDP 8472 Canal/Flannel VXLAN overlay 网络
    UDP 4789 Canal/Flannel VXLAN overlay 网络
    TCP 9099 Canal/Flannel 健康检查
    TCP 9100 Monitoring 从 Linux node-exporters 中抓取指标所需的默认端口
    UDP 8443 Rancher webhook
    TCP 9443 Rancher webhook
    TCP 9796 集群监控拉取节点指标的默认端口
    TCP 6783 Weave 端口
    UDP 6783-6784 Weave UDP 端口
    TCP 10250 Metrics server 与所有节点的通信
    TCP 10254 Ingress controller 健康检查
    TCP/UDP 30000-32767 NodePort 端口范围
    TCP 6443 apiserver
    TCP 80 Ingress controller
    TCP 443 Ingress controller

    关闭SELINUX

    永久关闭:
    修改/etc/selinux/config这个配置文件
    
    sed -i 's/SELINUX=enforcing/SELINUX=disabled/'  /etc/selinux/config 
    
    查看状态
    setenforce status
    

    禁用swap分区

    vim  /etc/fstab 
    #/dev/mapper/cl-swap     swap
    

    各服务器设置时间同步

    centos7用ntp的方式 centos8用chrony
    
    yum install ntp -y
    
    修改配置文件:time.xxx.com为你们的时间服务器地址,如果没有可以用阿里的 ntp.aliyun.com
    vim /etc/ntp.conf
    server time.xxx.com iburst
    
    执行时间同步
    ntpdate time.xxx.edu.cn
    
    重启服务和设置开机自启动
    systemctl restart ntpd & systemctl enable ntpd
    
    ----------------------------------------------------------
    chrony模式
    centos   时间同步
    vim /etc/chrony.conf
    
    添加时间服务器
    server ntp.aliyun.com iburst
    
    重启
    systemctl restart chronyd.service
    
    同步时间
    chronyc sources -v
    
    

    设置内核参数

    cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
    br_netfilter
    EOF
    
    cat <<EOF > /etc/sysctl.d/k8s.conf
    net.ipv4.ip_forward = 1
    net.bridge.bridge-nf-call-iptables = 1
    net.bridge.bridge-nf-call-ip6tables = 1
    fs.may_detach_mounts = 1
    vm.overcommit_memory=1
    vm.panic_on_oom=0
    fs.inotify.max_user_watches=89100
    fs.file-max=52706963
    fs.nr_open=52706963
    net.netfilter.nf_conntrack_max=2310720
    
    net.ipv4.tcp_keepalive_time = 600
    net.ipv4.tcp_keepalive_probes = 3
    net.ipv4.tcp_keepalive_intvl =15
    net.ipv4.tcp_max_tw_buckets = 36000
    net.ipv4.tcp_tw_reuse = 1
    net.ipv4.tcp_max_orphans = 327680
    net.ipv4.tcp_orphan_retries = 3
    net.ipv4.tcp_syncookies = 1
    net.ipv4.tcp_max_syn_backlog = 16384
    net.ipv4.ip_conntrack_max = 65536
    net.ipv4.tcp_max_syn_backlog = 16384
    net.ipv4.tcp_timestamps = 0
    net.core.somaxconn = 16384
    EOF
    
    
    sudo sysctl --system
    

    安装相关命令组件

yum install ipvsadm ipset sysstat conntrack libseccomp -y

# 加入以下内容 centos7中修改ipvs.conf文件会导致模块无法启动,centos8中正常
cat <<EOF > /etc/modules-load.d/ipvs.conf 
ip_vs
ip_vs_lc
ip_vs_wlc
ip_vs_rr
ip_vs_wrr
ip_vs_lblc
ip_vs_lblcr
ip_vs_dh
ip_vs_sh
ip_vs_fo
ip_vs_nq
ip_vs_sed
ip_vs_ftp
ip_vs_sh
nf_conntrack_ipv4
ip_tables
ip_set
xt_set
ipt_set
ipt_rpfilter
ipt_REJECT
ipip
EOF

systemctl enable --now systemd-modules-load.service

如因系统版本过高,加载报错,需要将 nf_conntrack_ipv4 替换为:nf_conntrack

cat <<EOF > /etc/modules-load.d/ipvs.conf 
ip_vs
ip_vs_lc
ip_vs_wlc
ip_vs_rr
ip_vs_wrr
ip_vs_lblc
ip_vs_lblcr
ip_vs_dh
ip_vs_sh
ip_vs_fo
ip_vs_nq
ip_vs_sed
ip_vs_ftp
ip_vs_sh
nf_conntrack
ip_tables
ip_set
xt_set
ipt_set
ipt_rpfilter
ipt_REJECT
ipip
EOF
  1. rke部署

    选择一台服务器作为部署节点, 并下载rke:

    从rke的github中下载最新的release版, 我这边选择的是1.3.3 
    https://github.com/rancher/rke 
    
    wget https://github.com/rancher/rke/releases/download/v1.3.3/rke_linux-amd64
    
    mv rke_linux-amd64 /usr/local/bin/rke && chmod +x /usr/local/bin/rke
    

    为每一台服务器创建一个用户部署k8s的专用用户,该用户需要能执行docker命令的权限,以便rke程序能通过该用户自动部署。

    # useradd ops
    # usermod -a -G docker ops
    

    配置部署服务器能免密登陆各节点:

    #su – ops
    #ssh-keygen -t rsa -b 4096
    
    su - ops
    ssh-copy-id  ops@192.168.0.201
    ssh-copy-id  ops@192.168.0.202
    ssh-copy-id  ops@192.168.0.211
    ssh-copy-id  ops@192.168.0.212
    ssh-copy-id  ops@192.168.0.213
    ssh-copy-id  ops@192.168.0.221
    

    运行rke生成配置文件

    rke config
    会弹出一系列对话选项,逐个配置即可,最终会生成 cluster.yml文件
    注意点:
    1、id_rsa不要配错
    2、ip不要填错
    3、ssh用户和端口不要填错,并确保安装服务器的用户能免密登陆到各个节点
    4、rke版本不要配错,rancher/hyperkube:v1.20.13-rancher1   可以从github中查找rke所支持的对应版本。
    5、其他的基本上默认即可
    
    
    需要ETCD定时备份的,要更改一下配置文件
    services:
        etcd:
          snapshot: true
          creation: 6h
          retention: 24h
    
    执行部署命令
    rke up --config ./cluster.yml     
    
    部署成功后会生成以下文件:
    kube_config_cluster.yml   cluster.rkestate  
    
    PS:
    ****** 
    kube_config_cluster.yml   cluster.rkestate cluster.yml 这3份文件很重要,一定要保存好。
    ****** 
    
    
    部署最终可能会出现以下错误,执行rke的更新命令即可:
    FATA[0668] Failed to get job complete status for job rke-network-plugin-deploy-job in namespace kube-system
    
    rke up --update-only --config ./cluster.yml
    
    
    
    
    
    新增、删除节的流程:
    1、修改cluster.yml的配置文件
    2、执行rke命令 
    rke up --update-only --config ./cluster.yml
    
    
    
    

    安装kubectl

    cat > /etc/yum.repos.d/kubernetes.repo << EOF
    [kubernetes]
    name=Kubernetes
    baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
    enabled=1
    gpgcheck=0
    repo_gpgcheck=0
    gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
    EOF
    
    yum install -y kubectl-1.20.0
    systemctl enable kubectl
    
    mkdir $HOME/.kube && cp  kube_config_cluster.yml $HOME/.kube/config
    kubectl --kubeconfig=$KUBECONFIG   
    
    -- kube_config_rancher-cluster.yml 该文件为配置服务器上生成的文件。
    
    即可在命令行查看k8s集群状态:
    kubectl get nodes
    kubectl get pods -A -o wide
    
    强制删除
    kubectl delete pods httpd-app-6df58645c6-cxgcm --grace-period=0 --force
    
  1. 安装rancher

    生成rancher所需要的证书:可以是自己的证书文件,也可用脚本生成的

    #!/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
    

    生成证书:

    把上面的执行脚本保存到key.sh文件,且赋予chmod +x kye.sh 执行权限

    mkdir ./rancher-ssl
    vim ./key.sh  #加入上述脚本
    chmod +x kye.sh
    
    
    ./key.sh --ssl-domain=rancher.xxx.com --ssl-trusted-domain=rancher2.xxx.com --ssl-trusted-ip=192.168.0.211,192.168.0.212,192.168.0.213,192.168.0.221 --ssl-size=2048 --ssl-date=36500
    
    会生成一堆证书文件,需要保存好
    
    注意:
    --ssl-domain        可信任的域名
    --ssl-trusted-ip    可信任的节点IP
    

    k8s环境中配置证书:

    #创建命名空间
    kubectl create namespace cattle-system
    
    #设置证书
    kubectl -n cattle-system create secret generic tls-ca --from-file=cacerts.pem
    cp cacerts.pem ca-additional.pem
    kubectl -n cattle-system create secret generic tls-ca-additional --from-file=ca-additional.pem
    kubectl -n cattle-system create secret tls tls-rancher-ingress --cert=tls.crt --key=tls.key
    
    如出现证书已存在的情况,需先删除证书:
    kubecelt -n cattle-system delete secret tls-ca
    kubecelt -n cattle-system delete secret tls-ca-additional
    kubecelt -n cattle-system delete secret tls-rancher-ingress
    
    

    安装helm:这里选择用helm生成rancher的安装yaml文件

    从github上下载helm的2进制文件
    https://github.com/helm/helm
    
    tar -zxvf helm-v3.3.0-linux-amd64.tar.gz
    cd linux-amd64
    mv helm /usr/local/bin/helm && chmod +x /usr/local/bin/helm
    
    #添加rancher helm 仓库
    helm repo add rancher-stable https://releases.rancher.com/server-charts/stable
    
    
    #查看rancher所有版本
    helm search repo rancher -l
    
    helm fetch rancher-stable/rancher --version 2.5.11
    当前目录会多一个rancher-2.5.11.tgz
    
    使用以下命令渲染模板:
    helm template rancher ./rancher-2.5.11.tgz \
         --namespace cattle-system --output-dir . \
         --set privateCA=true \
         --set additionalTrustedCAs=true \
         --set ingress.tls.source=secret \
         --set hostname=rancher.toowe.com \
         --set useBundledSystemChart=true
    
    渲染后会生成一个rancher目录,其中ingress的配置文件需要修改一下
    ingress.yaml文件修改后如下:
    
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: rancher
      labels:
        app: rancher
        chart: rancher-2.5.11
        heritage: Helm
        release: rancher
      annotations:
        nginx.ingress.kubernetes.io/proxy-connect-timeout: "30"
        nginx.ingress.kubernetes.io/proxy-read-timeout: "1800"
        nginx.ingress.kubernetes.io/proxy-send-timeout: "1800"
    spec:
      rules:
      - host: rancher.toowe.com  # hostname to access rancher server
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: rancher
                port:
                  number: 80
    #      - backend:
    #          serviceName: rancher
    #          servicePort: 80
      tls:
      - hosts:
        - rancher.toowe.com
        secretName: tls-rancher-ingress
    
    
    使用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
    
    kubectl -n cattle-system delete -R -f ./rancher/templates/ingress.yaml
    
    
    kubectl -n cattle-system get all
    
    安装完成
    
  1. 安装lb负载均衡

    安装keepalived

    yum install keepalived -y
    
    修改keepalived 配置文件,每个lb节点上都需要修改,注意配置文件中带#部分
    global_defs {
       notification_email {
          user@example.com
      }
    
      notification_email_from mail@example.org
      smtp_server 192.168.x.x
      smtp_connect_timeout 30
      router_id LVS_MASTER  # 每个节点名称要唯一
    }
    
    #监测haproxy进程状态,每2秒执行一次 如果nginx则是监听nginx
    vrrp_script chk_haproxy {
        script "/bin/bash -c 'if [[ $(netstat -nlp | grep 16443) ]]; then exit 0; else exit 1; fi'"
        interval 2
        weight 2
    }
    
    vrrp_instance VI_1 {
        state MASTER #标示状态为MASTER
        interface enp0s3
        virtual_router_id 51
        priority 101  #MASTER权重要高于BACKUP
        advert_int 1
        unicast_src_ip 192.168.0.183  #当前机器地址
        unicast_peer {
          192.168.0.201            #peer中其它地址
          192.168.0.202           #peer中其它地址
        }
    
        authentication {
            auth_type PASS #主从服务器验证方式
            auth_pass 1111
        }
    
        track_script {
            chk_haproxy #监测haproxy进程状态
        }
    
        #VIP
        virtual_ipaddress {
            192.168.0.200 #虚拟IP
        }
    }
    
    
    systemctl daemon-reload
    systemctl enable keepalived
    systemctl start keepalived
    

    安装haproxy 这里也可用nginx替代

    yum install haproxy -y
    
    修改haproxy配置
    #---------------------------------------------------------------------
    # Example configuration for a possible web application.  See the
    # full configuration options online.
    #
    #  https://www.haproxy.org/download/1.8/doc/configuration.txt
    #
    #---------------------------------------------------------------------
    #---------------------------------------------------------------------
    # Global settings
    #---------------------------------------------------------------------
    
    global
        # to have these messages end up in /var/log/haproxy.log you will
        # need to:
        #
        # 1) configure syslog to accept network log events.  This is done
        #    by adding the '-r' option to the SYSLOGD_OPTIONS in
        #    /etc/sysconfig/syslog
        #
        # 2) configure local2 events to go to the /var/log/haproxy.log
        #  file. A line like the following can be added to
        #  /etc/sysconfig/syslog
        #
        #    local2.*                      /var/log/haproxy.log
        #
        log        127.0.0.1 local2
        chroot      /var/lib/haproxy
        pidfile    /var/run/haproxy.pid
        maxconn    40000
        user        haproxy
        group      haproxy
        daemon
    
        # turn on stats unix socket
        stats socket /var/lib/haproxy/stats
    
     # utilize system-wide crypto-policies
        ssl-default-bind-ciphers PROFILE=SYSTEM
        ssl-default-server-ciphers PROFILE=SYSTEM
    
    #---------------------------------------------------------------------
    # common defaults that all the 'listen' and 'backend' sections will
    # use if not designated in their block
    #---------------------------------------------------------------------
    defaults
        mode                    http
        log                    global
        option                  httplog
        option                  dontlognull
        option http-server-close
        option forwardfor      except 127.0.0.0/8
        option                  redispatch
        retries                3
        timeout http-request    10s
        timeout queue          1m
        timeout connect        10s
        timeout client          1m
        timeout server          1m
        timeout http-keep-alive 10s
        timeout check          10s
        maxconn                3000
    
    #---------------------------------------------------------------------
    # kubernetes apiserver frontend which proxys to the backends
    #---------------------------------------------------------------------
    frontend rancher-forntend
        mode                tcp
        bind                *:443
        option              tcplog
        default_backend      rancher-backend
    #---------------------------------------------------------------------
    # round robin balancing between the various backends
    #---------------------------------------------------------------------
    
    backend rancher-backend
        mode        tcp
        balance    roundrobin
        server  node-0 192.168.0.211:443 check
        server  node-1 192.168.0.212:443 check
        server  node-2 192.168.0.222:443 check
        
    listen admin_stats
        bind 0.0.0.0:19198
        mode http
        log 127.0.0.1 local3 err
        #HAProxy监控页面统计自动刷新时间。
        stats refresh 30s
        #设置监控页面URL路径。 http://IP:19198/haproxy-status可查看
        stats uri /haproxy-status
        #统计页面密码框提示信息
        stats realm welcome login\ Haproxy
        #登录统计页面用户和密码
        stats auth toowe:toowe
        #隐藏HAProxy版本信息
        stats hide-version
        #设置TURE后可在监控页面手工启动关闭后端真实服务器
        stats admin if TRUE
    
  1. 卸载k8s,可忽略

    cat > clear.sh << EOF
    df -h|grep kubelet |awk -F % '{print $2}'|xargs umount 
    rm /var/lib/kubelet/* -rf
    rm /etc/kubernetes/* -rf
    rm /var/lib/rancher/* -rf
    rm /var/lib/etcd/* -rf
    rm /var/lib/cni/* -rf
    
    rm -rf /var/run/calico 
    
    iptables -F && iptables -t nat -F
    
    ip link del flannel.1
    
    docker ps -a|awk '{print $1}'|xargs docker rm -f
    docker volume ls|awk '{print $2}'|xargs docker volume rm
    
    rm -rf /var/etcd/
    rm -rf /run/kubernetes/
    docker rm -fv $(docker ps -aq)
    docker volume rm  $(docker volume ls)
    rm -rf /etc/cni
    rm -rf /opt/cni
    
    systemctl restart docker
    EOF
    
    
    #删除容器
    sudo docker stop `sudo docker ps -aq`
    sudo docker rm -f `sudo docker ps -aq`
    
    #删除挂载卷
    sudo docker volume rm $(sudo docker volume ls -q)
    
    for mount in $(mount tmpfs |grep '/vsr/lib/kubelet' |awk '{print $3}') ; do sudo umount $mount; done
    
    sudo mount |grep tmpfs |grep '/var/lib/kubelet' |awk '{print $3}'
    sudo umount /var/run/docker/netns/default
    
    #删除相关文件
    sudo rm -rf /etc/cni
    sudo rm -rf /etc/kubernetes
    sudo rm -rf /opt/cni
    sudo rm -rf /opt/rke
    sudo rm -rf /run/secrets/kubernetes.io
    sudo rm -rf /run/calico
    sudo rm -rf /var/lib/etcd
    sudo rm -rf /var/lib/cni
    sudo rm -rf /var/lib/kubelet
    sudo rm -rf /var/log/containers
    sudo rm -rf /var/log/pods
    sudo rm -rf /var/lib/rancher
    
    sudo rm -rf /var/run/calico
    sudo rm -rf /var/run/docker
    sudo rm -rf /var/lib/docker
    sudo rm -rf /app/docker
    
  1. 自建ETCD集群,可忽略

    wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
    wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
    wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
    #注意,以上链接若打不开,直接使用我提供的软件即可!
    
    设置cfssl执行权限
    chmod +x cfssl*
    for x in cfssl*; do mv $x ${x%*_linux-amd64};  done
    mv cfssl* /usr/bin
    
    
    创建生成证书目录
    mkdir -p ~/etcd_tls
    cd ~/etcd_tls
    
    etcd证书json
    cat > ca-config.json << EOF
    {
      "signing": {
        "default": {
          "expiry": "87600h"
        },
        "profiles": {
          "www": {
             "expiry": "87600h",
             "usages": [
                "signing",
                "key encipherment",
                "server auth",
                "client auth"
            ]
          }
        }
      }
    }
    EOF
    
    cat > ca-csr.json << EOF
    {
        "CN": "etcd CA",
        "key": {
            "algo": "rsa",
            "size": 2048
        },
        "names": [
            {
                "C": "CN",
                "L": "Beijing",
                "ST": "Beijing"
            }
        ]
    }
    EOF
    
    cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
    
    cat > server-csr.json << EOF
    {
        "CN": "etcd",
        "hosts": [
        "192.168.0.179",
        "192.168.0.48",
        "192.168.0.163"
        ],
        "key": {
            "algo": "rsa",
            "size": 2048
        },
        "names": [
            {
                "C": "CN",
                "L": "BeiJing",
                "ST": "BeiJing"
            }
        ]
    }
    EOF
    
    cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=www server-csr.json | cfssljson -bare server
    
    
    etcd安装文件
    
    mkdir /opt/etcd/{bin,cfg,ssl} -p
    tar zxvf etcd-v3.4.9-linux-amd64.tar.gz
    mv etcd-v3.4.9-linux-amd64/{etcd,etcdctl} /opt/etcd/bin/
    
    
    etcd配置文件
    cat > /opt/etcd/cfg/etcd.conf << EOF
    #[Member]
    ETCD_NAME="etcd-1"
    ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
    ETCD_LISTEN_PEER_URLS="https://192.168.0.179:2380" #2380是 集群通信的端口;
    ETCD_LISTEN_CLIENT_URLS="https://192.168.0.179:2379" #2379是指它的数据端口,其他客户端要访问etcd数据库的读写都走的是这个端口;
    
    #[Clustering]
    ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.0.179:2380"
    ETCD_ADVERTISE_CLIENT_URLS="https://192.168.0.179:2379"
    ETCD_INITIAL_CLUSTER="etcd-1=https://192.168.0.179:2380,etcd-2=https://192.168.0.48:2380,etcd-3=https://192.168.0.163:2380"
    ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster" #一种简单的认证机制,网络里可能配置了多套k8s集群,防止误同步;
    ETCD_INITIAL_CLUSTER_STATE="new"
    EOF
    
    etcd 执行脚本,设置证书路径
    cat > /usr/lib/systemd/system/etcd.service << EOF
    [Unit]
    Description=Etcd Server
    After=network.target
    After=network-online.target
    Wants=network-online.target
    
    [Service]
    Type=notify
    EnvironmentFile=/opt/etcd/cfg/etcd.conf
    ExecStart=/opt/etcd/bin/etcd \
    --cert-file=/opt/etcd/ssl/server.pem \
    --key-file=/opt/etcd/ssl/server-key.pem \
    --trusted-ca-file=/opt/etcd/ssl/ca.pem \
    --peer-cert-file=/opt/etcd/ssl/server.pem \
    --peer-key-file=/opt/etcd/ssl/server-key.pem \
    --peer-trusted-ca-file=/opt/etcd/ssl/ca.pem \
    --logger=zap
    Restart=on-failure
    LimitNOFILE=65536
    
    [Install]
    WantedBy=multi-user.target
    EOF
    
    
    拷贝证书
    cp ~/etcd_tls/ca*pem ~/etcd_tls/server*pem /opt/etcd/ssl/
    
    启动
    systemctl daemon-reload
    systemctl start etcd
    systemctl enable etcd
    scp -r /opt/etcd/ root@192.168.0.48:/opt/
    scp /usr/lib/systemd/system/etcd.service root@192.168.0.48:/usr/lib/systemd/system/
    
    scp -r /opt/etcd/ root@192.168.0.163:/opt/
    scp /usr/lib/systemd/system/etcd.service root@192.168.0.163:/usr/lib/systemd/system/
    
    修改每个节点上的etcd.conf文件
    ETCD_NAME 每个配置文件唯一
    ETCD_LISTEN_PEER_URLS 
    ETCD_LISTEN_CLIENT_URLS
    ETCD_INITIAL_ADVERTISE_PEER_URLS
    ETCD_ADVERTISE_CLIENT_URLS
    都设置为本机IP
    
    
    etcd 集群检测
    ETCDCTL_API=3 /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem --endpoints="https://192.168.0.179:2379,https://192.168.0.48:2379,https://192.168.0.163:2379" endpoint health --write-out=table
    
  1. 待续
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容