众客华禹

搜索
查看: 534|回复: 0

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

[复制链接]

70

主题

70

帖子

378

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
378
发表于 2021-12-28 18:46:34 | 显示全部楼层 |阅读模式
一、iptables和ipvs对比

文章用到的组件下载地址在阿里云网盘里面:https://www.aliyundrive.com/s/NYFaoRRQEgh ,需要注册的点击这个连接:https://pages.aliyundrive.com/mobile-page/web/beinvited.html?code=e01ec49

备用连接:链接:https://pan.baidu.com/s/1ujyUcTE5MyMycczOx9FG_A
提取码:vm1s

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。

拓扑图:
Centos7%E4%BA%8C%E8%BF%9B%E5%88%B6%E9%83%A8%E7%BD%B2k8s-v1.20.2-ipvs%E7%89%88%E6%9C%AC1.png
缺点:
Centos7%E4%BA%8C%E8%BF%9B%E5%88%B6%E9%83%A8%E7%BD%B2k8s-v1.20.2-ipvs%E7%89%88%E6%9C%AC2.png

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使用更低的重定向流量。其同步规则的效率和网络吞吐量也更高。

拓扑图:
Centos7%E4%BA%8C%E8%BF%9B%E5%88%B6%E9%83%A8%E7%BD%B2k8s-v1.20.2-ipvs%E7%89%88%E6%9C%AC3.png

Centos7%E4%BA%8C%E8%BF%9B%E5%88%B6%E9%83%A8%E7%BD%B2k8s-v1.20.2-ipvs%E7%89%88%E6%9C%AC4.png
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模式。

二、安装前期准备
本次集群的规划:
  1.    角色             ip                                   组件
  2. clihouse01    192.168.112.131      kube-apiserver,kube-controller-manager,kube-scheduler,etcd, nginx,calico,keepalived(192.168.112.130)
  3. clihouse02    192.168.112.132      kube-apiserver,kube-controller-manager,kube-scheduler,etcd, nginx,calico,keepalived(192.168.112.130)
  4. clihouse03    192.168.112.133      kubelet,kube-proxy,docker etcd、calico
  5. clihouse04    192.168.112.134      kubelet,kube-proxy,docker etcd、calico
复制代码
1、操作系统初始化配置
  1. #关闭防火墙
  2. systemctl stop firewalld
  3. systemctl disable firewalld

  4. #关闭selinux
  5. sed -i 's/enforcing/disabled/' /etc/selinux/config  # 永久
  6. setenforce 0  # 临时

  7. #关闭swap
  8. swapoff -a  # 临时
  9. sed -ri 's/.*swap.*/#&/' /etc/fstab    # 永久

  10. #根据规划设置主机名
  11. hostnamectl set-hostname

  12. #在master添加hosts
  13. cat >> /etc/hosts << EOF
  14. 192.168.112.131 k8s-master
  15. 192.168.112.132 k8s-node1
  16. 192.168.112.133 k8s-node2
  17. EOF

  18. #时间同步
  19. yum install -y chrony
  20. vim /etc/chrony.conf
  21. systemctl restart chronyd
  22. systemctl enable chronyd
  23. chronyc sources

  24. #修改内核参数
  25. cat > /etc/sysctl.d/k8s.conf << EOF
  26. net.ipv4.ip_forward = 1
  27. net.bridge.bridge-nf-call-ip6tables = 1
  28. net.bridge.bridge-nf-call-iptables = 1
  29. EOF
  30. sysctl --system

  31. #加载ipvs模块
  32. modprobe -- ip_vs
  33. modprobe -- ip_vs_rr
  34. modprobe -- ip_vs_wrr
  35. modprobe -- ip_vs_sh
  36. modprobe -- nf_conntrack_ipv4
  37. lsmod | grep ip_vs
  38. lsmod | grep nf_conntrack_ipv4

  39. yum install -y ipvsadm
复制代码
三、安装etcd集群
1、准备自签证书工具
  1. #创建工作目录
  2. mkdir -p ~/TLS/{etcd,k8s}
  3. cd  ~/TLS/etcd

  4. #工具下载
  5. wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
  6. wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
  7. wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
  8. #工具配置
  9. chmod +x cfssl*
  10. mv cfssl_linux-amd64 /usr/local/bin/cfssl
  11. mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
  12. mv cfssl-certinfo_linux-amd64 /usr/local/bin/cfssl-certinfo
复制代码
2、配置ca请求文件
  1. cat > ca-csr.json << EOF
  2. {
  3.   "CN": "kubernetes",
  4.   "key": {
  5.       "algo": "rsa",
  6.       "size": 2048
  7.   },
  8.   "names": [
  9.     {
  10.       "C": "CN",
  11.       "ST": "Sichuan",
  12.       "L": "Chengdu",
  13.       "O": "k8s",
  14.       "OU": "system"
  15.     }
  16.   ],
  17.   "ca": {
  18.           "expiry": "175200h"
  19.   }
  20. }
  21. EOF

  22. #创建ca证书
  23. cfssl gencert -initca ca-csr.json  | cfssljson -bare ca
  24. 注:
  25. CN:Common Name,kube-apiserver 从证书中提取该字段作为请求的用户名 (User Name);浏览器使用该字段验证网站是否合法;
  26. O:Organization,kube-apiserver 从证书中提取该字段作为请求用户所属的组 (Group)
复制代码
3、配置ca证书策略
  1. cat > ca-config.json << EOF
  2. {
  3.   "signing": {
  4.       "default": {
  5.           "expiry": "175200h"
  6.         },
  7.       "profiles": {
  8.           "kubernetes": {
  9.               "usages": [
  10.                   "signing",
  11.                   "key encipherment",
  12.                   "server auth",
  13.                   "client auth"
  14.               ],
  15.               "expiry": "175200h"
  16.           }
  17.       }
  18.   }
  19. }
  20. EOF
复制代码
4、配置etcd请求csr文件
  1. cat > etcd-csr.json << EOF
  2. {
  3.   "CN": "etcd",
  4.   "hosts": [
  5.     "127.0.0.1",
  6.     "192.168.112.131",
  7.     "192.168.112.132",
  8.     "192.168.112.133",
  9.     "192.168.112.134"
  10.   ],
  11.   "key": {
  12.     "algo": "rsa",
  13.     "size": 2048
  14.   },
  15.   "names": [{
  16.     "C": "CN",
  17.     "ST": "Sichuan",
  18.     "L": "Chengdu",
  19.     "O": "k8s",
  20.     "OU": "system"
  21.   }]
  22. }
  23. EOF

  24. 生成证书
  25. 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软件包
  1. #创建安装目录
  2. mkdir /opt/etcd/{bin,cfg,ssl,etcd} -p

  3. #下载安装包
  4. wget https://github.com/etcd-io/etcd/releases/download/v3.4.9/etcd-v3.4.9-linux-amd64.tar.gz

  5. #解压
  6. tar -zxvf etcd-v3.4.9-linux-amd64.tar.gz

  7. #拷贝二进制包
  8. cp -p etcd-v3.4.9-linux-amd64/etcd* /opt/etcd/bin

  9. #拷贝至其他节点
  10. scp -p etcd-v3.4.9-linux-amd64/etcd* root@192.168.112.132:/opt/etcd/bin
  11. scp -p etcd-v3.4.9-linux-amd64/etcd* root@192.168.112.133:/opt/etcd/bin
复制代码
6、创建配置文件
  1. cat > /opt/etcd/cfg/etcd.conf << EOF
  2. #[Member]
  3. ETCD_NAME="etcd1"
  4. ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
  5. ETCD_LISTEN_PEER_URLS="https://192.168.112.131:2380"
  6. ETCD_LISTEN_CLIENT_URLS="https://192.168.112.131:2379,http://127.0.0.1:2379"

  7. #[Clustering]
  8. ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.112.131:2380"
  9. ETCD_ADVERTISE_CLIENT_URLS="https://192.168.112.131:2379"
  10. ETCD_INITIAL_CLUSTER="etcd1=https://192.168.112.131:2380,etcd2=https://192.168.112.132:2380,etcd3=https://192.168.112.133:2380"
  11. ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
  12. ETCD_INITIAL_CLUSTER_STATE="new"
  13. 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、创建启动服务文件
  1. cat > /usr/lib/systemd/system/etcd.service << EOF
  2. [Unit]
  3. Description=Etcd Server
  4. After=network.target
  5. After=network-online.target
  6. Wants=network-online.target

  7. [Service]
  8. Type=notify
  9. EnvironmentFile=-/opt/etcd/cfg/etcd.conf
  10. WorkingDirectory=/opt/etcd/etcd/
  11. ExecStart=/opt/etcd/bin/etcd
  12.   --cert-file=/opt/etcd/ssl/etcd.pem
  13.   --key-file=/opt/etcd/ssl/etcd-key.pem
  14.   --trusted-ca-file=/opt/etcd/ssl/ca.pem
  15.   --peer-cert-file=/opt/etcd/ssl/etcd.pem
  16.   --peer-key-file=/opt/etcd/ssl/etcd-key.pem
  17.   --peer-trusted-ca-file=/opt/etcd/ssl/ca.pem
  18.   --peer-client-cert-auth
  19.   --client-cert-auth
  20. Restart=on-failure
  21. RestartSec=5
  22. LimitNOFILE=65536

  23. [Install]
  24. WantedBy=multi-user.target
  25. EOF
复制代码
8、同步相关文件到各个节点
  1. cp ~/TLS/etcd/ca*pem ~/TLS/etcd/etcd*.pem /opt/etcd/ssl/
  2. scp -r /opt/etcd root@192.168.112.132:/opt
  3. scp /usr/lib/systemd/system/etcd.service root@192.168.112.132:/usr/lib/systemd/system/
复制代码
9、启动etcd集群
  1. mkdir -p /var/lib/etcd/default.etcd
  2. systemctl daemon-reload
  3. systemctl enable etcd.service
  4. systemctl start etcd.service
  5. systemctl status etcd
复制代码
10、查看集群状态
  1. [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
  2. --endpoints=https://192.168.112.131:2379,https://192.168.112.132:2379,https://192.168.112.133:2379 endpoint health
复制代码
四、部署docker
  1. #安装docker
  2. wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
  3. yum install -y docker-ce
  4. systemctl enable docker
  5. systemctl start docker
  6. docker --version

  7. #修改docker源和驱动
  8. cat > /etc/docker/daemon.json << EOF
  9. {
  10.     "exec-opts": ["native.cgroupdriver=systemd"],
  11.     "registry-mirrors": [
  12.         "https://1nj0zren.mirror.aliyuncs.com",
  13.         "https://kfwkfulq.mirror.aliyuncs.com",
  14.         "https://2lqq34jg.mirror.aliyuncs.com",
  15.         "https://pee6w651.mirror.aliyuncs.com",
  16.         "http://hub-mirror.c.163.com",
  17.         "https://docker.mirrors.ustc.edu.cn",
  18.         "http://f1361db2.m.daocloud.io",
  19.         "https://registry.docker-cn.com"
  20.     ]
  21. }
  22. EOF
  23. systemctl restart docker
  24. docker info | grep "Cgroup Driver"

  25. #下载依赖镜像
  26. docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2
  27. docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2 k8s.gcr.io/pause:3.2
  28. docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2

  29. docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.7.0
  30. docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.7.0 k8s.gcr.io/coredns:1.7.0
  31. docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.7.0
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表