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
timedatectl set-timezone Asia/Shanghai 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 #查看可用版本的 Docker-ce: yum list docker-ce --showduplicates | sort -r #默认安装最新版本 yum install -y docker-ce #安装指定版本的docker-ce: yum install docker-ce-19.03.12 docker-ce-cli-19.03.12 containerd.io systemctl enable docker systemctl start docker docker --version #修改docker源和驱动 cat > /etc/docker/daemon.json << EOF { "exec-opts": ["native.cgroupdriver=systemd"],
"data-root": "/var/lib/docker", "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