flanneld 安装
- flanneld 安裝
- 下載分發(fā)flanneld二進制文件
- 分發(fā)二進制文件到所有集群的節(jié)點
- 創(chuàng)建Flannel證書和私鑰
- 創(chuàng)建證書簽名請求
- 生成證書和私鑰
- 向etcd寫入Pod網(wǎng)段信息
- 創(chuàng)建flanneld的啟動文件
- 啟動flanneld服務
- 查看 etcd 中flanneld信息
- 檢查分配給flanneld的Pod網(wǎng)段信息
- 查看已分配的Pod子網(wǎng)網(wǎng)段列表
- 查看某Pod網(wǎng)段對應節(jié)點IP和flannel接口地址
- 當新節(jié)點加入,也需要安裝flanneld
flanneld 安裝
Kubernetes要求集群內(nèi)各個節(jié)點(包括master)能通過Pod網(wǎng)段互聯(lián)互通,F(xiàn)lannel使用vxlan技術(shù)為各個節(jié)點創(chuàng)建一個互通的Pod網(wǎng)絡,使用的端口為8472.
第一次啟動時,從etcd獲取配置的Pod網(wǎng)絡,為本節(jié)點分配一個未使用的地址段,然后創(chuàng)建flannel.1網(wǎng)絡接口(也可能是其它名稱)flannel將分配給自己的Pod網(wǎng)段信息寫入/run/flannel/docker文件,docker后續(xù)使用這個文件中的環(huán)境變量設置Docker0網(wǎng)橋,從而從這個地址段為本節(jié)點的所有Pod容器分配IP
下載分發(fā)flanneld二進制文件
本次flanneld不使用Pod運行
cd /opt/k8s/work/
wget https://github.com/coreos/flannel/releases/download/v0.11.0/flannel-v0.11.0-linux-amd64.tar.gz
mkdir flannel
tar xf flannel-v0.11.0-linux-amd64.tar.gz -C flannel
分發(fā)二進制文件到所有集群的節(jié)點
注意: 當有新的節(jié)點需要加入,也需要安裝flanneld
cd /opt/k8s/work
source /opt/k8s/bin/environment.sh
for node_ip in ${NODE_IPS[@]}
do
echo ">>> ${node_ip}"
scp flannel/{flanneld,mk-docker-opts.sh} root@${node_ip}:/opt/k8s/bin/
ssh root@${node_ip} "chmod +x /opt/k8s/bin/*"
done
創(chuàng)建Flannel證書和私鑰
flanneld從etcd集群存取網(wǎng)段分配信息,而etcd集群開啟了雙向x509證書認證,所以需要為flannel生成證書和私鑰
創(chuàng)建證書簽名請求
cd /opt/k8s/work
cat > flanneld-csr.json <<EOF
{
"CN": "flanneld",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "k8s",
"OU": "4Paradigm"
}
]
}
EOF
生成證書和私鑰
cfssl gencert -ca=/opt/k8s/work/ca.pem \
-ca-key=/opt/k8s/work/ca-key.pem \
-config=/opt/k8s/work/ca-config.json \
-profile=kubernetes flanneld-csr.json | cfssljson -bare flanneld
ls flanneld*pem
將生成的證書和私鑰分發(fā)到所有節(jié)點
cd /opt/k8s/work
source /opt/k8s/bin/environment.sh
for node_ip in ${NODE_IPS[@]}
do
echo ">>> ${node_ip}"
ssh root@${node_ip} "mkdir -p /etc/flanneld/cert"
scp flanneld*.pem root@${node_ip}:/etc/flanneld/cert
done
向etcd寫入Pod網(wǎng)段信息
cd /opt/k8s/work
source /opt/k8s/bin/environment.sh
etcdctl \
--endpoints=${ETCD_ENDPOINTS} \
--ca-file=/opt/k8s/work/ca.pem \
--cert-file=/opt/k8s/work/flanneld.pem \
--key-file=/opt/k8s/work/flanneld-key.pem \
mk ${FLANNEL_ETCD_PREFIX}/config '{"Network":"'${CLUSTER_CIDR}'", "SubnetLen": 21, "Backend": {"Type": "vxlan"}}'
注意:
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ù)一致
創(chuàng)建flanneld的啟動文件
cd /opt/k8s/work
source /opt/k8s/bin/environment.sh
cat > 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=/opt/k8s/bin/flanneld \\
-etcd-cafile=/etc/kubernetes/cert/ca.pem \\
-etcd-certfile=/etc/flanneld/cert/flanneld.pem \\
-etcd-keyfile=/etc/flanneld/cert/flanneld-key.pem \\
-etcd-endpoints=${ETCD_ENDPOINTS} \\
-etcd-prefix=${FLANNEL_ETCD_PREFIX} \\
-iface=${IFACE} \\
-ip-masq
ExecStartPost=/opt/k8s/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)絡接口(如內(nèi)網(wǎng)和公網(wǎng))的節(jié)點,可以用 -iface 參數(shù)指定通信接口;
flanneld 運行時需要 root 權(quán)限; - -ip-masq: flanneld 為訪問 Pod 網(wǎng)絡外的流量設置 SNAT 規(guī)則,同時將傳遞給 Docker 的變量 –ip-masq(/run/flannel/docker 文件中)設置為 false,這樣 Docker 將不再創(chuàng)建 SNAT 規(guī)則; Docker 的 –ip-masq 為 true 時,創(chuàng)建的 SNAT 規(guī)則比較“暴力”:將所有本節(jié)點 Pod 發(fā)起的、訪問非 docker0 接口的請求做 SNAT,這樣訪問其他節(jié)點 Pod 的請求來源 IP 會被設置為 flannel.1 接口的 IP,導致目的 Pod 看不到真實的來源 Pod IP。 flanneld 創(chuàng)建的 SNAT 規(guī)則比較溫和,只對訪問非 Pod 網(wǎng)段的請求做 SNAT。
分發(fā)啟動文件到所有節(jié)點
cd /opt/k8s/work
source /opt/k8s/bin/environment.sh
for node_ip in ${NODE_IPS[@]}
do
echo ">>> ${node_ip}"
scp flanneld.service root@${node_ip}:/etc/systemd/system/
done
啟動flanneld服務
source /opt/k8s/bin/environment.sh
for node_ip in ${NODE_IPS[@]}
do
echo ">>> ${node_ip}"
ssh root@${node_ip} "systemctl daemon-reload && systemctl enable flanneld && systemctl restart flanneld"
done
檢查啟動結(jié)果
source /opt/k8s/bin/environment.sh
for node_ip in ${NODE_IPS[@]}
do
echo ">>> ${node_ip}"
ssh root@${node_ip} "systemctl status flanneld|grep Active"
done
查看 etcd 中flanneld信息
檢查分配給flanneld的Pod網(wǎng)段信息
source /opt/k8s/bin/environment.sh
etcdctl \
--endpoints=${ETCD_ENDPOINTS} \
--ca-file=/etc/kubernetes/cert/ca.pem \
--cert-file=/etc/flanneld/cert/flanneld.pem \
--key-file=/etc/flanneld/cert/flanneld-key.pem \
get ${FLANNEL_ETCD_PREFIX}/config
查看已分配的Pod子網(wǎng)網(wǎng)段列表
source /opt/k8s/bin/environment.sh
etcdctl \
--endpoints=${ETCD_ENDPOINTS} \
--ca-file=/etc/kubernetes/cert/ca.pem \
--cert-file=/etc/flanneld/cert/flanneld.pem \
--key-file=/etc/flanneld/cert/flanneld-key.pem \
ls ${FLANNEL_ETCD_PREFIX}/subnets
查看某Pod網(wǎng)段對應節(jié)點IP和flannel接口地址
source /opt/k8s/bin/environment.sh
etcdctl \
--endpoints=${ETCD_ENDPOINTS} \
--ca-file=/etc/kubernetes/cert/ca.pem \
--cert-file=/etc/flanneld/cert/flanneld.pem \
--key-file=/etc/flanneld/cert/flanneld-key.pem \
get ${FLANNEL_ETCD_PREFIX}/subnets/172.30.80.0-21
#后面節(jié)點IP需要根據(jù)我們查出來的地址進行修改
查看節(jié)點flannel網(wǎng)絡信息
ip addr show
flannel.1網(wǎng)卡的地址為分配的pod自網(wǎng)段的第一個個IP (.0),且是/32的地址
ip addr show|grep flannel.1
- 到其它節(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;
驗證各節(jié)點能通過 Pod 網(wǎng)段互通
在各節(jié)點上部署 flannel 后,檢查是否創(chuàng)建了 flannel 接口(名稱可能為 flannel0、flannel.0、flannel.1 等):
source /opt/k8s/bin/environment.sh
for node_ip in ${NODE_IPS[@]}
do
echo ">>> ${node_ip}"
ssh ${node_ip} "/usr/sbin/ip addr show flannel.1|grep -w inet"
done
當新節(jié)點加入,也需要安裝flanneld
總結(jié)
以上是生活随笔為你收集整理的flanneld 安装的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: javaboot+es
- 下一篇: C语言指针总结