現(xiàn)在網(wǎng)絡(luò)上流傳很多Kubernetes的部署和搭建的文檔,其中比較出名就是Kubernetes The Hard Way
還有基于這個翻譯和衍生的版本follow-me-install-kubernetes-cluster
這兩篇文章帶我走過了Kubernetes的搭建的童年,我第一搭建成功就是抄襲的張俊的follow-me-install-kubernetes-cluster,然后隨著新版的發(fā)展,越來越多的配置參數(shù)存在各種各樣的問題,最大的問題是在CNI產(chǎn)生后,兩篇文章的配置參數(shù)和系統(tǒng)默認(rèn)或者CNI配置參數(shù)有稍微的沖突導(dǎo)致很多人在利用CNI做網(wǎng)絡(luò)方案的時候會出現(xiàn)很多問題,這篇文章目的第一是向兩位前輩致敬,第二是共享下在Flanneld和Calico部署過程中遇到挫折和問題。
為啥只說明以下兩種方案的部署模式,因?yàn)槠渌W(wǎng)絡(luò)方案不爭氣。
Flanneld [Systemd部署模式]
Flannel部署相對來說簡單容易、坑少,直接上配置。
flannel.service
[Unit]Description=Flanneld overlay address etcd agentAfter=network.targetAfter=network-online.targetWants=network-online.targetBefore=docker.service[Service]Type=notifyExecStart=/usr/local/bin/flanneld -etcd-cafile=/etc/kubernetes/ssl/ca.pem -etcd-certfile=/etc/kubernetes/ssl/kubernetes.pem -etcd-keyfile=/etc/kubernetes/ssl/kubernetes-key.pem -etcd-endpoints=https://{Etcd IP}:2379 -iface=ens3 --ip-masqRestart=on-failure[Install]WantedBy=multi-user.targetRequiredBy=docker.service
記住一定要提前在etcd把你的backend寫進(jìn)去。
HOST-GW的配置:
etcdctl --endpoints=https://{Etcd-IP}:2379 --ca-file=/etc/kubernetes/ssl/ca.pem --cert-file=/etc/kubernetes/ssl/kubernetes.pem --key-file=/etc/kubernetes/ssl/kubernetes-key.pem set /coreos.com/network/config '{"Network":"'10.200.0.0/16'", "SubnetLen": 24, "Backend": {"Type":"host-gw"}}'
VXLAN的配置:
etcdctl --endpoints=https://{Etcd-IP}:2379 --ca-file=/etc/kubernetes/ssl/ca.pem --cert-file=/etc/kubernetes/ssl/kubernetes.pem --key-file=/etc/kubernetes/ssl/kubernetes-key.pem set /coreos.com/network/config '{"Network":"'10.200.0.0/16'", "SubnetLen": 24, "Backend": {"Type":"vxlan"}}'
然后可以開始你的表演,如果你創(chuàng)建2個pod,互ping一下發(fā)現(xiàn)不通,你部署DNS服務(wù),一直報(bào)錯no route to host(就是Kubernetes那個SVC對應(yīng)的IP),恭喜你,你下面要做的就是:
iptables -P FORWARD ACCEPT
因?yàn)?.13版本以上Docker好似在iptable寫了這么一條策略:
iptables -P FORWARD DROP
到此為止你起來Flanneld就可以開始你的Kubernetes之旅,當(dāng)然現(xiàn)在好似還不行記得在/etc/cni/net.d下寫一個.conf結(jié)尾的文件,當(dāng)然叫什么名字無所謂。etc:
10-flanneld-cni.conf
{ "name": "cbr0", "type": "flannel", "delegate": { "isDefaultGateway": true }}
然后繼續(xù)你的表演就可以了。
Calico [Systemd部署模式]
其實(shí)吧,Calico在Kubernetes網(wǎng)絡(luò)方案用用的比Flanneld多,Calico懂得玩伸縮,技術(shù)也比較牛,在很多物理設(shè)備不開啟BGP的情況下做了折中,用的IP-IP雖然性能有點(diǎn)損失,在云上被大面積使用。Flanneld的host-gw模式性能雖然不錯,但是只能在2層玩下,過了二層路由被重寫就GG了。
開始表演IP-IP模式。
第一步創(chuàng)建IPpool,pool就是所有calico分配ip的池子,其實(shí)就是Kubernetes的pool,不過Calico分配出來是/26的IP,一下少很多。其實(shí)我覺得/26比較符合機(jī)器配置的現(xiàn)狀至少,不會造成IP的浪費(fèi)。
設(shè)置pool
calicoctl apply -f - << EOFapiVersion: v1kind: ipPoolmetadata:cidr: 10.200.0.0/16spec:ipip:enabled: truemode: cross-subnetnat-outgoing: trueEOF
部署calico-node(其實(shí)就2個文件)
calico.env
ETCD_ENDPOINTS="https://{ETCD1}:2379,https://{ETCD2}:2379"ETCD_CA_FILE="/etc/kubernetes/ssl/ca.pem"ETCD_CERT_FILE="/etc/kubernetes/ssl/kubernetes.pem"ETCD_KEY_FILE="/etc/kubernetes/ssl/kubernetes-key.pem"CALICO_NODENAME="node46"CALICO_NO_DEFAULT_POOLS=""CALICO_IP="{HOST-IP}"CALICO_IP6=""CALICO_AS=""CALICO_LIBNETWORK_ENABLED=trueCALICO_NETWORKING_BACKEND=bird
calico.service[Unit]Description=calico-nodeAfter=docker.serviceRequires=docker.service[Service]EnvironmentFile=/etc/calico/calico.envExecStartPre=-/usr/bin/docker rm -f calico-nodeExecStart=/usr/bin/docker run --net=host --privileged --name=calico-node -e NODENAME=${CALICO_NODENAME} -e IP=${CALICO_IP} -e IP6=${CALICO_IP6} -e CALICO_NETWORKING_BACKEND=${CALICO_NETWORKING_BACKEND} -e CALICO_STARTUP_LOGLEVEL=DEBUG -e NO_DEFAULT_POOLS=${CALICO_NO_DEFAULT_POOLS} -e FELIX_DEFAULTENDPOINTTOHOSTACTION=ACCEPT -e CALICO_LIBNETWORK_ENABLED=${CALICO_LIBNETWORK_ENABLED} -e ETCD_ENDPOINTS=${ETCD_ENDPOINTS} -e ETCD_CA_CERT_FILE=/etc/kubernetes/ssl/ca.pem -e ETCD_CERT_FILE=/etc/kubernetes/ssl/kubernetes.pem -e ETCD_KEY_FILE=/etc/kubernetes/ssl/kubernetes-key.pem -v /var/log/calico:/var/log/calico -v /run/docker/plugins:/run/docker/plugins -v /lib/modules:/lib/modules -v /var/run/calico:/var/run/calico -v /etc/kubernetes/ssl/:/etc/kubernetes/ssl/:ro quay.io/calico/node:v2.4.0ExecStop=-/usr/bin/docker stop calico-node[Install]WantedBy=multi-user.target
CNI配置文件(/etc/cni/net.d下隨便寫一個.conf結(jié)尾的文件)
calico.conf
{"name": "k8s-pod-network","cniVersion": "0.1.0","type": "calico","etcd_endpoints": "https://{ETCD1},https://{ETCD2}:2379","etcd_key_file": "/etc/kubernetes/ssl/kubernetes-key.pem","etcd_cert_file": "/etc/kubernetes/ssl/kubernetes.pem","etcd_ca_cert_file": "/etc/kubernetes/ssl/ca.pem","log_level": "info","ipam": { "type": "calico-ipam" },"kubernetes": { "kubeconfig": "/etc/kubernetes/kube-proxy.kubeconfig"}}
然后你就可以裝逼了,記得把CNI的組件calico-ipam放到/opt/cni/bin。
RR部署模式
其實(shí)就是在以上的基礎(chǔ)上多部署一個RR容器。
docker run --privileged --net=host -d -e IP={HOST-IP} -e ETCD_ENDPOINTS=https://{ETCD}:2379 -e ETCD_CA_CERT_FILE=/etc/kubernetes/ssl/ca.pem -e ETCD_CERT_FILE=/etc/kubernetes/ssl/kubernetes.pem -e ETCD_KEY_FILE=/etc/kubernetes/ssl/kubernetes-key.pem -v /etc/kubernetes/ssl:/etc/kubernetes/ssl:ro calico/routereflector:v0.4.0
然后把這個IP寫到etcd里。
curl --cacert /etc/kubernetes/ssl/ca.pem --cert /etc/kubernetes/ssl/kubernetes.pem --key /etc/kubernetes/ssl/kubernetes-key.pem -L https://{ETCD}:2379/v2/keys/calico/bgp/v1/rr_v4/{HOST-IP} -XPUT -d value="{"ip":"{HOST-IP}","cluster_id":"1.0.0.2"}
然后就是創(chuàng)建一個全局的BGPpeer。
cat << EOF | calicoctl delete -f -apiVersion: v1kind: bgpPeermetadata:peerIP: {HOST-IP}scope: globalspec:asNumber: 64567EOF
關(guān)閉 node-to-node mesh。
calicoctl config set nodeToNodeMesh off
重新啟動你所有的calico-node。
附一份calicoctl的配置文件(在/etc/calico下)
calicoctl.cfg
apiVersion: v1kind: calicoApiConfigmetadata:spec:etcdEndpoints: https://{ETCD}:2379etcdKeyFile: /etc/kubernetes/ssl/kubernetes-key.pemetcdCertFile: /etc/kubernetes/ssl/kubernetes.pemetcdCACertFile: /etc/kubernetes/ssl/ca.pem
開始你的裝逼之旅吧。
關(guān)于calico-bgp有硬件的自己嘗試吧。
附一份非標(biāo)準(zhǔn)的kube-proxy.service
[Unit]Description=Kubernetes Kube ProxyDocumentation=https://github.com/GoogleCloudPlatform/kubernetes[Service]ExecStart=/usr/local/bin/kube-proxy --hostname-override={HOST-IP} --kubeconfig=/etc/kubernetes/kube-proxy.kubeconfig --v=2Restart=on-failureRestartSec=5[Install]WantedBy=multi-user.target
-
網(wǎng)絡(luò)
+關(guān)注
關(guān)注
14文章
7553瀏覽量
88729 -
kubernetes
+關(guān)注
關(guān)注
0文章
224瀏覽量
8712
原文標(biāo)題:Kubernetes網(wǎng)絡(luò)部署方案
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論