kubernetes集群安裝指南:Flannel網(wǎng)絡(luò)插件部署

Flannel 是CNI陣營里標準的網(wǎng)絡(luò)插件,在沒有嚴格的網(wǎng)絡(luò)的要求下,它通常作為kubernetes集群里網(wǎng)絡(luò)互聯(lián)比較常用的方案,當然還有其他網(wǎng)絡(luò)方案,比如calico,weave,mxvlan等等,這里主要使用到flannel作為kubernetes的網(wǎng)絡(luò)方案;

創(chuàng)新互聯(lián)公司專注于企業(yè)網(wǎng)絡(luò)營銷推廣、網(wǎng)站重做改版、老城網(wǎng)站定制設(shè)計、自適應品牌網(wǎng)站建設(shè)、成都h5網(wǎng)站建設(shè)、商城系統(tǒng)網(wǎng)站開發(fā)、集團公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為老城等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。

1 部署準備

kubernetes 要求集群內(nèi)各節(jié)點(包括 master 節(jié)點)能通過 Pod 網(wǎng)段互聯(lián)互通。flannel 使用 vxlan 技術(shù)為各節(jié)點創(chuàng)建一個可以互通的 Pod 網(wǎng)絡(luò),使用的端口為 UDP 8472(需要開放該端口,如公有云 AWS 等)。

flanneld 第一次啟動時,從 etcd 獲取配置的 Pod 網(wǎng)段信息,為本節(jié)點分配一個未使用的地址段,然后創(chuàng)建 flannedl.1 網(wǎng)絡(luò)接口(也可能是其它名稱,如 flannel1 等)。

flannel 將分配給自己的 Pod 網(wǎng)段信息寫入 /run/flannel/docker 文件,docker 后續(xù)使用這個文件中的環(huán)境變量設(shè)置 docker0 網(wǎng)橋,從而從這個地址段為本節(jié)點的所有 Pod 容器分配 IP。

環(huán)境變量定義
#################### Variable parameter setting ######################
FLANNEL_INSTALL_PATH=/data/apps/k8s/networks/flannel
SOFTWARE=/root/software
VERSION=v0.11.0
PACKAGE=flannel-${VERSION}-linux-amd64.tar.gz
DOWNLOAD_URL=https://github.com/devops-apps/download/raw/master/network/$PACKAGE
ETCD_ENPOINTS=https://10.10.10.22:2379,https://10.10.10.23:2379,https://10.10.10.24:2379
FLANNEL_ETCD_PREFIX=/k8s/network
CA_DIR=/etc/k8s/ssl
NETWORK_SUBNET=172.16.0.0/20
IFACE=eth0 
1.2 下載和分發(fā) kubernetes 二進制文件

登陸devops機器,訪問flannel github 官方地址下載穩(wěn)定的 realease 包至本機;

wget  $DOWNLOAD_URL -P $SOFTWARE

將flannel 軟件包分發(fā)到集群所有節(jié)點服務(wù)器

sudo ansible master_k8s_vgs -m copy -a "src=${SOFTWARE}/$PACKAGE dest=${SOFTWARE}/" -b
sudo ansible worker_k8s_vgs -m copy -a "src=${SOFTWARE}/$PACKAGE dest=${SOFTWARE}/" -b

2 安裝flannel網(wǎng)絡(luò)插件

2.1 安裝flannel二進制文件
### 1.Check if the install directory exists.
if [ ! -d $FLANNEL_INSTALL_PATH/bin ]; then
     mkdir -p $FLANNEL_INSTALL_PATH/bin     
fi

### 2.Install binary of flannel.
if [ ! -f "$SOFTWARE/flannel-${VERSION}-linux-amd64.tar.gz" ]; then
     wget $DOWNLOAD_URL -P $SOFTWARE >>/tmp/install.log  2>&1
fi
cd $SOFTWARE && tar -xzf flannel-${VERSION}-linux-amd64.tar.gz -C ./
cp -fp ${SOFTWARE}/{flanneld,mk-docker-opts.sh} ${FLANNEL_INSTALL_PATH}/bin
ln -sf  ${FLANNEL_INSTALL_PATH}/bin/{flanneld,mk-docker-opts.sh}  /usr/local/bin
chmod -R 755 $FLANNEL_INSTALL_PATH
2.3 分發(fā) 證書文件
cd ${CA_DIR}
sudo ansible master_k8s_vgs -m  copy -a "src=ca.pem dest=${CA_DIR}/" -b
sudo ansible master_k8s_vgs -m  copy -a "src=flannel.pem dest=${CA_DIR}/" -b
sudo ansible master_k8s_vgs -m  copy -a "src=flannel-key.pem dest=${CA_DIR}/" -b
  • flannel開啟了HTTPS訪問所以需要證書支持;
  • flannel不需要訪問apiserver,因此不需kubeconfig文件認證;
2.4 向 etcd 寫入集群 Pod 網(wǎng)段信息
### Create network subnet of flannel .
etcdctl --endpoint=$ETCD_ENPOINTS \
  --ca-file=${CA_DIR}/ca.pem \
  --cert-file=${CA_DIR}/etcd.pem \
  --key-file=${CA_DIR}/etcd-key.pem \
  mkdir $FLANNEL_ETCD_PREFIX

etcdctl --endpoints=$ETCD_ENPOINTS \
  --ca-file=${CA_DIR}/ca.pem \
  --cert-file=${CA_DIR}/etcd.pem \
  --key-file=${CA_DIR}/etcd-key.pem \
  mk ${FLANNEL_ETCD_PREFIX}/config \
 '{"Network":"'${NETWORK_SUBNET}'","SubnetLen":24,"Backend":{"Type":"$TYPE"}}'
  • flanneld 當前版本 (v0.11.0) 不支持 etcd v3,故使用 etcd v2 API 寫入配置 key 和網(wǎng)段數(shù)據(jù);
  • 寫入的 Pod 網(wǎng)段 ${CLUSTER_CIDR} 地址段(如 /16)必須小于 SubnetLen,必須與 kube-controller-manager 的 --cluster-cidr 參數(shù)值一致;
2.5 創(chuàng)建flannel 啟動服務(wù)
cat >/usr/lib/systemd/system/flanneld.service<<EOF
[Unit]
Description=Flanneld overlay address etcd agent
After=network.target
After=network-online.target
Wants=network-online.target
After=etcd.service
Before=docker.service
[Service]
Type=notify
ExecStart=${FLANNEL_INSTALL_PATH}/bin/flanneld \\
  -etcd-cafile=${CA_DIR}/ca.pem \\
  -etcd-certfile=${CA_DIR}/flannel.pem \\
  -etcd-keyfile=${CA_DIR}/flannel-key.pem \\
  -etcd-endpoints=${ETCD_ENPOINTS} \\
  -etcd-prefix=${FLANNEL_ETCD_PREFIX} \\
  -iface=${IFACE} \\
  -ip-masq
ExecStartPost=${FLANNEL_INSTALL_PATH}/bin/mk-docker-opts.sh \\
  -k DOCKER_NETWORK_OPTIONS -d /run/flannel/docker
Restart=always
RestartSec=5
StartLimitInterval=0
[Install]
WantedBy=multi-user.target
RequiredBy=docker.service
EOF
  • mk-docker-opts.sh 腳本將分配給 flanneld 的 Pod 子網(wǎng)段信息寫入 /run/flannel/docker 文件,后續(xù) docker 啟動時使用這個文件中的環(huán)境變量配置 docker0 網(wǎng)橋;
  • flanneld 使用系統(tǒng)缺省路由所在的接口與其它節(jié)點通信,對于有多個網(wǎng)絡(luò)接口(如內(nèi)網(wǎng)和公網(wǎng))的節(jié)點,可以用 -iface 參數(shù)指定通信接口;
  • flanneld 運行時需要 root 權(quán)限;
  • -ip-masq: flanneld 為訪問 Pod 網(wǎng)絡(luò)外的流量設(shè)置 SNAT 規(guī)則,同時將傳遞給 Docker 的變量 --ip-masq(/run/flannel/docker 文件中)設(shè)置為 false,這樣 Docker 將不再創(chuàng)建 SNAT 規(guī)則; Docker 的 --ip-masq 為 true 時,創(chuàng)建的 SNAT 規(guī)則比較“暴力”:將所有本節(jié)點 Pod 發(fā)起的、訪問非 docker0 接口的請求做 SNAT,這樣訪問其他節(jié)點 Pod 的請求來源 IP 會被設(shè)置為 flannel.1 接口的 IP,導致目的 Pod 看不到真實的來源 Pod IP。 flanneld 創(chuàng)建的 SNAT 規(guī)則比較溫和,只對訪問非 Pod 網(wǎng)段的請求做 SNAT。
2.6 啟動flannel服務(wù)并檢查運行狀態(tài)

啟動flannel服務(wù)并檢查

sudo systemctl start flanneld 
sudo systemctl status  flanneld |grep 'Active:'

確保狀態(tài)為 active (running),否則查看日志,確認原因:

sudo journalctl -u  flanneld 
2.7 檢查分配給各 flanneld 的 Pod 網(wǎng)段信息
查看集群 Pod 網(wǎng)段(/20):
### Create network subnet of flannel .
etcdctl --endpoint=$ETCD_ENPOINTS \
  --ca-file=${CA_DIR}/ca.pem \
  --cert-file=${CA_DIR}/etcd.pem \
  --key-file=${CA_DIR}/etcd-key.pem \
  get ${FLANNEL_ETCD_PREFIX}/config

輸出:

{"Network":"172.20.0.0/20", "SubnetLen": 21, "Backend": {"Type": "vxlan"}}

查看已分配的 Pod 子網(wǎng)段列表(/24):

etcdctl --endpoints=$ETCD_ENPOINTS \
  --ca-file=${CA_DIR}/ca.pem \
  --cert-file=${CA_DIR}/etcd.pem \
  --key-file=${CA_DIR}/etcd-key.pem \
  ls ${FLANNEL_ETCD_PREFIX}/subnets

輸出(結(jié)果視部署情況而定):

/k8s/network/subnets/172.16.1.0-24
/k8s/network/subnets/172.16.3.0-24
/k8s/network/subnets/172.16.13.0-24
/k8s/network/subnets/172.16.15.0-24
/k8s/network/subnets/172.16.8.0-24

查看某一 Pod 網(wǎng)段對應的節(jié)點 IP 和 flannel 接口地址:

etcdctl --endpoints=$ETCD_ENPOINTS \
  --ca-file=${CA_DIR}/ca.pem \
  --cert-file=${CA_DIR}/etcd.pem \
  --key-file=${CA_DIR}/etcd-key.pem \
  ls ${FLANNEL_ETCD_PREFIX}/subnets

輸出(結(jié)果視部署情況而定):

{"PublicIP":"192.168.20.24","BackendType":"vxlan","BackendData":{"VtepMAC":"a6:92:04:07"}}
  • 192.168.20.24指節(jié)點master-ks8-n03;
  • VtepMAC 為master-ks8-n03節(jié)點的 flannel.1 網(wǎng)卡 MAC 地址;
2.8 檢查節(jié)點 flannel 網(wǎng)絡(luò)信息

隨機登陸一臺master節(jié)點,這里以master-ks8-n03為例

$ ifconfig

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.20.24  netmask 255.255.255.0  broadcast 192.168.20.255
        ether 00:50:56:b9:9c:b1  txqueuelen 1000  (Ethernet)
        RX packets 305607  bytes 52151972 (49.7 MiB)
        RX errors 0  dropped 1176  overruns 0  frame 0
        TX packets 355321  bytes 58794327 (56.0 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth2: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.10.10.24  netmask 255.255.255.0  broadcast 10.10.10.255
        ether 00:50:56:b9:2c:1e  txqueuelen 1000  (Ethernet)
        RX packets 216915716  bytes 36273314852 (33.7 GiB)
        RX errors 0  dropped 1173  overruns 0  frame 0
        TX packets 207708912  bytes 33334846046 (31.0 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

flannel.1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1450
        inet 172.16.1.0  netmask 255.255.255.255  broadcast 0.0.0.0
        ether a6:92:cc:85:04:07  txqueuelen 0  (Ethernet)
        RX packets 260862  bytes 27280155 (26.0 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 309429  bytes 36792200 (35.0 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
  • flannel.1 網(wǎng)卡的地址為分配的 Pod 子網(wǎng)段的第一個 IP(.0),且是 /32 的地址;

查看路由

$ ip route show |grep flannel.1
172.16.3.0/24 via 172.16.3.0 dev flannel.1 onlink 
172.16.8.0/24 via 172.16.8.0 dev flannel.1 onlink 
172.16.13.0/24 via 172.16.13.0 dev flannel.1 onlink 
172.16.15.0/24 via 172.16.15.0 dev flannel.1 onlink 
  • 到其它節(jié)點 Pod 網(wǎng)段請求都被轉(zhuǎn)發(fā)到 flannel.1 網(wǎng)卡;
  • flanneld 根據(jù) etcd 中子網(wǎng)段的信息,如 ${FLANNEL_ETCD_PREFIX}/subnets/172.30.80.0-21 ,來決定進請求發(fā)送給哪個節(jié)點的互聯(lián) IP;
2.9 驗證各節(jié)點能通過 Pod 網(wǎng)段互通

在各節(jié)點上部署 flannel 后,檢查是否創(chuàng)建了 flannel 接口(名稱可能為 flannel0、flannel.0、flannel.1 等):這里為flannel.1

ansible master_k8s_vgs -m shell -a ''ping 172.16.1.1 -c 3 && ping 172.16.3.1 -c 3 \
    && ping 172.16.8.1 -c 3 && ping 172.16.13.1 -c 3 && ping 172.16.15.1 -c 3" 

上述命令在devops機器上執(zhí)行。正常情況下,到集群內(nèi)每個節(jié)點都是互通的,如果有不通情況下,檢查防火墻設(shè)置;


安裝完flannel網(wǎng)絡(luò)插件后,整個集群到這里算大功告成,后面還需要安裝相關(guān)插件,如dashboard可視化,DNS解析,以及監(jiān)控等等;關(guān)于flannel腳本可以從此處獲取

本文標題:kubernetes集群安裝指南:Flannel網(wǎng)絡(luò)插件部署
本文URL:http://bm7419.com/article22/pcegjc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動態(tài)網(wǎng)站建站公司、手機網(wǎng)站建設(shè)響應式網(wǎng)站、企業(yè)網(wǎng)站制作、軟件開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)