• Centos7二进制部署k8s-v1.20.2 ipvs版本(docker、etcd)


    一、iptables和ipvs对比

    获取最新更新以及文章用到的软件包,请移步点击查看更新

    1、概念

      从k8s的1.8版本开始,kube-proxy引入了IPVS模式,IPVS模式与iptables同样基于Netfilter,但是ipvs采用的hash表,iptables采用一条条的规则列表。iptables又是为了防火墙设计的,集群数量越多iptables规则就越多,而iptables规则是从上到下匹配,所以效率就越是低下。因此当service数量达到一定规模时,hash查表的速度优势就会显现出来,从而提高service的服务性能

      每个节点的kube-proxy负责监听API server中service和endpoint的变化情况。将变化信息写入本地userspace、iptables、ipvs来实现service负载均衡,使用NAT将vip流量转至endpoint中。由于userspace模式因为可靠性和性能(频繁切换内核/用户空间)早已经淘汰,所有的客户端请求svc,先经过iptables,然后再经过kube-proxy到pod,所以性能很差。

    ipvs和iptables都是基于netfilter的,两者差别如下:

      ipvs 为大型集群提供了更好的可扩展性和性能
      ipvs 支持比 iptables 更复杂的负载均衡算法(最小负载、最少连接、加权等等)
      ipvs 支持服务器健康检查和连接重试等功能

    2、Iptables模式

    在这种模式下,kube-proxy监视API Server中service和endpoint的变化情况。对于每个service,它都生成相应的iptables规则,这些规则捕获到service的clusterIP和port的流量,并将这些流量随机重定向到service后端Pod。对于每个endpoint对象,它生成选择后端Pod的iptables规则。

    如果选择的第一个Pod没有响应,kube-proxy将检测到到第一个Pod的连接失败,并将自动重试另一个后端Pod。

    拓扑图:

    缺点:

    iptables 因为它纯粹是为防火墙而设计的,并且基于内核规则列表,集群数量越多性能越差。

    一个例子是,在5000节点集群中使用 NodePort 服务,如果我们有2000个服务并且每个服务有10个 pod,这将在每个工作节点上至少产生20000个 iptable 记录,这可能使内核非常繁忙。


    3、IPVS模式(NAT模式)

    在这种模式下,kube-proxy监听API Server中service和endpoint的变化情况,调用netlink接口创建相应的ipvs规则,并定期将ipvs规则与Kubernetes服 Services和Endpoints同步。保证IPVS状态。当访问Services时,IPVS将流量定向到后端pod之一。

    IPVS代理模式基于netfilter hook函数,该函数类似于iptables模式,但使用hash表作为底层数据结构,在内核空间中工作。这意味着IPVS模式下的kube-proxy使用更低的重定向流量。其同步规则的效率和网络吞吐量也更高。

    拓扑图:

     

     

    4、ipvs代理模  这种模式,kube-proxy会监视KubernetesService对象和Endpoints。,调用netlink接口以相应ipvs规则并定期与Kubernetes service对象和Endpoints对象同步ipvs规则,以确保ipvs状态与期望一致,访问服务时,流量将重定向到具中一个后端Pod与iptables类似,ipvs于netfilter的hook功能,但使用希表作为底层数据结构并在内核空间中工作。这意ipvs可以更快地重定向流量,并且在同步代理规则时貝有更好的性能。此外,ipvs为负载均衡算法提供了更多选顶,
    冽如:
      rr :轮询调度 
      lc :最小连接数
      dh:目标哈希
      sh:源哈希
      sed:最短期望延迟
      np:不排队调度

    说明:

    ipvs依赖iptables进行包过滤、SNAT、masquared(伪装)。 使用 ipset 来存储需要 DROP 或 masquared 的流量的源或目标地址,以确保 iptables 规则的数量是恒定的,这样我们就不需要关心我们有多少服务了

    如果没有加载并启用ipvs模块,或者没有配置ipvs相关配置,则会被降级成iptables模式。

    二、安装前期准备

    本次集群的规划:

       角色             ip                                   组件
    clihouse01    192.168.112.131      kube-apiserver,kube-controller-manager,kube-scheduler,etcd, nginx,calico,keepalived(192.168.112.130)
    clihouse02    192.168.112.132      kube-apiserver,kube-controller-manager,kube-scheduler,etcd, nginx,calico,keepalived(192.168.112.130)
    clihouse03    192.168.112.133      kubelet,kube-proxy,docker etcd、calico
    clihouse04    192.168.112.134      kubelet,kube-proxy,docker etcd、calico

    1、操作系统初始化配置

    #关闭防火墙
    systemctl stop firewalld
    systemctl disable firewalld
    
    #关闭selinux
    sed -i 's/enforcing/disabled/' /etc/selinux/config  # 永久
    setenforce 0  # 临时
    
    #关闭swap
    swapoff -a  # 临时
    sed -ri 's/.*swap.*/#&/' /etc/fstab    # 永久
    
    #根据规划设置主机名
    hostnamectl set-hostname <hostname>
    
    #在master添加hosts
    cat >> /etc/hosts << EOF
    192.168.112.131 k8s-master
    192.168.112.132 k8s-node1
    192.168.112.133 k8s-node2
    EOF
    
    #时间同步
    yum install -y chrony
    vim /etc/chrony.conf
    systemctl restart chronyd
    systemctl enable chronyd
    chronyc sources
    
    #修改内核参数
    cat > /etc/sysctl.d/k8s.conf << EOF
    net.ipv4.ip_forward = 1
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    EOF
    sysctl --system
    
    #加载ipvs模块
    modprobe -- ip_vs
    modprobe -- ip_vs_rr
    modprobe -- ip_vs_wrr
    modprobe -- ip_vs_sh
    modprobe -- nf_conntrack_ipv4
    lsmod | grep ip_vs
    lsmod | grep nf_conntrack_ipv4
    
    yum install -y ipvsadm

    三、安装etcd集群

    1、准备自签证书工具

    #创建工作目录
    mkdir -p ~/TLS/{etcd,k8s}
    cd  ~/TLS/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
    
    #工具配置
    chmod +x cfssl*
    mv cfssl_linux-amd64 /opt/kubernetes//bin/cfssl
    mv cfssljson_linux-amd64 /opt/kubernetes//bin/cfssljson
    mv cfssl-certinfo_linux-amd64 /opt/kubernetes//bin/cfssl-certinfo

    2、配置ca请求文件

    cat > ca-csr.json << EOF
    {
      "CN": "kubernetes",
      "key": {
          "algo": "rsa",
          "size": 2048
      },
      "names": [
        {
          "C": "CN",
          "ST": "Sichuan",
          "L": "Chengdu",
          "O": "k8s",
          "OU": "system"
        }
      ],
      "ca": {
              "expiry": "175200h"
      }
    }
    EOF
    
    #创建ca证书
    cfssl gencert -initca ca-csr.json  | cfssljson -bare ca

    注:
    CN:Common Name,kube-apiserver 从证书中提取该字段作为请求的用户名 (User Name);浏览器使用该字段验证网站是否合法;
    O:Organization,kube-apiserver 从证书中提取该字段作为请求用户所属的组 (Group)

    3、配置ca证书策略

    cat > ca-config.json << EOF
    {
      "signing": {
          "default": {
              "expiry": "175200h"
            },
          "profiles": {
              "kubernetes": {
                  "usages": [
                      "signing",
                      "key encipherment",
                      "server auth",
                      "client auth"
                  ],
                  "expiry": "175200h"
              }
          }
      }
    }
    EOF

    4、配置etcd请求csr文件

    cat > etcd-csr.json << EOF
    {
      "CN": "etcd",
      "hosts": [
        "127.0.0.1",
        "192.168.112.131",
        "192.168.112.132",
        "192.168.112.133",
        "192.168.112.134"
      ],
      "key": {
        "algo": "rsa",
        "size": 2048
      },
      "names": [{
        "C": "CN",
        "ST": "Sichuan",
        "L": "Chengdu",
        "O": "k8s",
        "OU": "system"
      }]
    }
    EOF
    
    生成证书
    cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes etcd-csr.json | cfssljson  -bare etcd

    5、部署etcd集群,下载etcd软件包

    #创建安装目录
    mkdir /opt/etcd/{bin,cfg,ssl,etcd} -p
    
    #下载安装包
    wget https://github.com/etcd-io/etcd/releases/download/v3.4.9/etcd-v3.4.9-linux-amd64.tar.gz
    
    #解压
    tar -zxvf etcd-v3.4.9-linux-amd64.tar.gz
    
    #拷贝二进制包
    cp -p etcd-v3.4.9-linux-amd64/etcd* /opt/etcd/bin
    
    #拷贝至其他节点
    scp -p etcd-v3.4.9-linux-amd64/etcd* root@192.168.112.132:/opt/etcd/bin
    scp -p etcd-v3.4.9-linux-amd64/etcd* root@192.168.112.133:/opt/etcd/bin

    6、创建配置文件

    cat > /opt/etcd/cfg/etcd.conf << EOF
    #[Member]
    ETCD_NAME="etcd1"
    ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
    ETCD_LISTEN_PEER_URLS="https://192.168.112.131:2380"
    ETCD_LISTEN_CLIENT_URLS="https://192.168.112.131:2379,http://127.0.0.1:2379"
    
    #[Clustering]
    ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.112.131:2380"
    ETCD_ADVERTISE_CLIENT_URLS="https://192.168.112.131:2379"
    ETCD_INITIAL_CLUSTER="etcd1=https://192.168.112.131:2380,etcd2=https://192.168.112.132:2380,etcd3=https://192.168.112.133:2380"
    ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
    ETCD_INITIAL_CLUSTER_STATE="new"
    EOF

    记得其他两个节点修改相应的IP地址

    注:
    ETCD_NAME:节点名称,集群中唯一
    ETCD_DATA_DIR:数据目录
    ETCD_LISTEN_PEER_URLS:集群通信监听地址
    ETCD_LISTEN_CLIENT_URLS:客户端访问监听地址
    ETCD_INITIAL_ADVERTISE_PEER_URLS:集群通告地址
    ETCD_ADVERTISE_CLIENT_URLS:客户端通告地址
    ETCD_INITIAL_CLUSTER:集群节点地址
    ETCD_INITIAL_CLUSTER_TOKEN:集群Token
    ETCD_INITIAL_CLUSTER_STATE:加入集群的当前状态,new是新集群,existing表示加入已有集群

    7、创建启动服务文件

    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
    WorkingDirectory=/opt/etcd/etcd/
    ExecStart=/opt/etcd/bin/etcd \
      --cert-file=/opt/etcd/ssl/etcd.pem \
      --key-file=/opt/etcd/ssl/etcd-key.pem \
      --trusted-ca-file=/opt/etcd/ssl/ca.pem \
      --peer-cert-file=/opt/etcd/ssl/etcd.pem \
      --peer-key-file=/opt/etcd/ssl/etcd-key.pem \
      --peer-trusted-ca-file=/opt/etcd/ssl/ca.pem \
      --peer-client-cert-auth \
      --client-cert-auth
    Restart=on-failure
    RestartSec=5
    LimitNOFILE=65536
    
    [Install]
    WantedBy=multi-user.target
    EOF

    8、同步相关文件到各个节点

    cp ~/TLS/etcd/ca*pem ~/TLS/etcd/etcd*.pem /opt/etcd/ssl/
    scp -r /opt/etcd root@192.168.112.132:/opt
    scp /usr/lib/systemd/system/etcd.service root@192.168.112.132:/usr/lib/systemd/system/

    9、启动etcd集群

    mkdir -p /var/lib/etcd/default.etcd
    systemctl daemon-reload
    systemctl enable etcd.service
    systemctl start etcd.service
    systemctl status etcd

    10、查看集群状态

    [root@clihouse01 ~]# ETCDCTL_API=3 /opt/etcd/bin/etcdctl --write-out=table --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/etcd.pem --key=/opt/etcd/ssl/etcd-key.pem 
    --endpoints=https://192.168.112.131:2379,https://192.168.112.132:2379,https://192.168.112.133:2379 endpoint health +------------------------------+--------+-------------+-------+ | ENDPOINT | HEALTH | TOOK | ERROR | +------------------------------+--------+-------------+-------+ | https://192.168.112.133:2379 | true | 23.047021ms | | | https://192.168.112.132:2379 | true | 26.314171ms | | | https://192.168.112.131:2379 | true | 27.191984ms | | +------------------------------+--------+-------------+-------+

    四、部署docker

    #安装docker
    wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
    yum install -y docker-ce
    systemctl enable docker
    systemctl start docker
    docker --version
    
    #修改docker源和驱动
    cat > /etc/docker/daemon.json << EOF
    {
        "exec-opts": ["native.cgroupdriver=systemd"],
        "registry-mirrors": [
            "https://1nj0zren.mirror.aliyuncs.com",
            "https://kfwkfulq.mirror.aliyuncs.com",
            "https://2lqq34jg.mirror.aliyuncs.com",
            "https://pee6w651.mirror.aliyuncs.com",
            "http://hub-mirror.c.163.com",
            "https://docker.mirrors.ustc.edu.cn",
            "http://f1361db2.m.daocloud.io",
            "https://registry.docker-cn.com"
        ]
    }
    EOF
    systemctl restart docker
    docker info | grep "Cgroup Driver"
    
    #下载依赖镜像
    docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2
    docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2 k8s.gcr.io/pause:3.2
    docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2
    
    docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.7.0
    docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.7.0 k8s.gcr.io/coredns:1.7.0
    docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.7.0
  • 相关阅读:
    kubernetes之StatefulSet详解
    kubernetes调度之污点(taint)和容忍(toleration)
    Kubernetes调度之亲和与反亲和
    kubernetes调度之 PriorityClass
    kubernetes里的各种port解惑
    # kubernetes调度之nodeName与NodeSelector
    kubectl rollout回滚和autoscale自动扩容
    Kubernetes基本概念之Label
    kubernetes之多容器pod以及通信
    设计模式-装饰模式
  • 原文地址:https://www.cnblogs.com/aqicheng/p/15031190.html
Copyright © 2020-2023  润新知