一、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 #查看可用版本的 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