在阿里雲用ECS測試K8S的時候 ,Calico這個網絡插件安裝不了,受限制,所以決定用flannel的網絡插件,之前文章介紹過用二進制安裝的方式,具體參考前面寫過的文章
https://www.cnblogs.com/centos-python/articles/11044504.html
今天重點介紹用官網提供的yaml 文件部署
https://github.com/coreos/flannel
For Kubernetes v1.17+ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
在部署之前需要注意幾個問題,一個是CNI工具包的安裝:
--cni-bin-dir string
<Warning: Alpha feature> A comma-separated list of full paths of directories in which to search for CNI plugin binaries.
This docker-specific flag only works when container-runtime is set to docker. (default "/opt/cni/bin")
默認在/opt/cni/bin 下面,根據你實際規划自己配置。
cd /opt/cni/bin
wget https://github.com/containernetworking/plugins/releases/download/v0.8.7/cni-plugins-linux-amd64-v0.8.7.tgz
tar -zxvf cni-plugins-linux-amd64-v0.8.7.tgz
如果沒有提前安裝好工具包 Pod啟動會有下面的包錯
Failed to create pod sandbox: rpc error: code = Unknown desc = failed to setup
network for sandbox "53a26d45c9eb3668ffc0e2716b8adb9d3a1a78c89ed3c2cffd980d370f253865":
failed to find plugin "bridge" in path [/opt/cni/bin]
kubelet 配置
--network-plugin=cni
kube-controller-manager 配置
--allocate-node-cidrs=true \ Should CIDRs for Pods be allocated and set on the cloud provider.
--cluster-cidr=192.168.0.0/16 \ 這個一定要和kube-proxy kube-flannel.yml 里面的地址保持一樣 --cluster-cidr string CIDR Range for Pods in cluster. Requires --allocate-node-cidrs to be true
kube-proxy
kube-flannel.yml
這兩參數必須增加,要不會有報錯
Error registering network: failed to acquire lease: node "k8s-node1" pod cidr not assigned
kubectl apply -f kube-flannel.yml
證明節點分配IP 正常
啟動測試POD ,在各節點ping相應的IP 地址看是否互通
查看節點的路由
如果是同一局域網的集群,可以使用host-gw 這種模式提升性能
host-gw 模式
修改文件kube-flannel.yml文件里面的net-conf.json
net-conf.json: |
{
"Network": "192.168.0.0/16",
"Backend": {
"Type": "vxlan",#當然,若你很確定自己的集群以后也不可能跨網段,你完全可以直接設置為 host-gw.
"Directrouting": true默認是false,修改為true就是可以讓VxLAN自適應是使用VxLAN還是使用host-gw了
}
}
DirectRouting: 這種是混合自適應的方式, 即它會自動判斷,若當前是相同二層網絡
(即:不垮路由器,二層廣播可直達),則直接使用Host-GW方式工作,若發現目標是需要跨網段
(即:跨路由器)則自動轉變為使用VxLAN的方式。
直接修改有時候不生效,需要強制刪除在啟動,生產環境建議在部署前配置好
注:發現阿里雲也不支持這種模式的,只能強制換回VXLAN,隧道模式就沒問題,建議如果在阿里雲用K8S 還是用他們提供的容器服務吧,自建的還是不要嘗試了,后面還有什么坑,就不測試了
這里還涉及到一個問題就是后續安裝 metrics-server 因為master 沒有安裝網絡插件,所以k8s-API 不管是和metrics-server POD 通信還是svc通信都是有問題的,這里涉及到二進制安裝網絡插件,而且最好不要單獨用etcd作為源
因為我們集群的節點是通過POD 運行的,POD 運行的flannel 是通過K8S 來獲取網絡信息的,這里就需要我們用k8s做數據源
Flannel can now use the kubernetes api as storage backend, instead of etcd.
This is useful especially when deploying flannel with kubernetes where you - otherwise - either need to allow multi-user access to a single etcd instance or setup a secondary etcd instance just to hold flannel config.
When configuring flannel with kubernetes as storage backend, you can isolate the access to etcd by authorizing only kube-apiserver.
Flannel現在可以使用kubernetes api作為存儲后端,而不是etcd
這在使用kubernetes部署flannel時特別有用,否則,你要么需要允許多用戶訪問單個etcd實例,要么需要設置一個輔助etcd實例來保存flannel配置。
當使用kubernetes作為存儲后端配置flannel時,您可以通過只授權kube-apiserver來隔離對etcd的訪問
具體安裝步驟:
下載二進制flanneld 的包
curl -o /usr/bin/flanneld https://github.com/coreos/flannel/releases/download/v0.13.0/flanneld-amd64
服務的配置文件
[Unit]
Description=Network fabric for containers
Documentation=https://github.com/coreos/flannel
After=network.target
After=network-online.target
Wants=network-online.target
[Service]
Type=notify
Restart=always
RestartSec=5
# This is needed because of this: https://github.com/coreos/flannel/issues/792
# Kubernetes knows the nodes by their FQDN so we have to use the FQDN
Environment=NODE_NAME=k8s-master1
# Note that we don't specify any etcd option. This is because we want to talk
# to the apiserver instead. The apiserver then talks to etcd on flannel's
# behalf.
ExecStart=/usr/bin/flanneld \
--kube-subnet-mgr=true \
--kubeconfig-file=/root/.kube/config \
--v=1 \
--ip-masq=true \
--iface=eth0
[Install]
WantedBy=multi-user.target
這里說明一下master 節點必須在k8s注冊過,所以需要我們安裝kubelet 服務來達到注冊的目標,如果自己了解整個數據規則可以按規則寫到etcd,但是不推薦這樣干,因為不知道還會有什么問題,目前這點是比較難受的,不知道后續會不會改進,但是安裝了kubelet 啟動起來,以后自動創建ds 相關發flannel POD,
感覺還是用另一個推薦的網絡插件吧,K8S 后續版本也推薦用這個網絡插件,下面是非集群節點的安裝方式完全符合我們的需求
https://docs.projectcalico.org/getting-started/bare-metal/installation/
如果不注冊這個節點就會報下面的錯,
etcdctl --cacert="/etc/ssl/kubernetes/ca.pem" --cert="/etc/ssl/kubernetes/kubernetes.pem" --key="/etc/ssl/kubernetes/kubernetes-key.pem" get / --prefix --keys-only
這個是查看etcd所有的key
I now get: Error registering network: failed to acquire lease: node "k8s-master" not found
Before switching from etcd to kubernetes configuration backend, I had flannel running on my k8s master node, which haven't got an active kubelet service on it - i.e. the master node is not a cluster node as such.
相關問題的文章:
https://github.com/coreos/flannel/issues/792