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

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM