歡迎光臨
每天分享高質量文章

Kubernetes網路部署方案

現在網路上流傳很多Kubernetes的部署和搭建的檔案,其中比較出名就是Kubernetes The Hard Way

(https://github.com/kelseyhightower/kubernetes-the-hard-way),還有基於這個翻譯和衍生的版本follow-me-install-kubernetes-cluster

(https://github.com/opsnull/follow-me-install-kubernetes-cluster),這兩篇文章帶我走過了Kubernetes的搭建的童年,我第一搭建成功就是抄襲的張俊的follow-me-install-kubernetes-cluster,然後隨著新版的發展,越來越多的配置引數存在各種各樣的問題,最大的問題是在CNI產生後,兩篇文章的配置引數和系統預設或者CNI配置引數有稍微的衝突導致很多人在利用CNI做網路方案的時候會出現很多問題,這篇文章目的第一是向兩位前輩致敬,第二是共享下在Flanneld和Calico部署過程中遇到挫折和問題。

為啥只說明以下兩種方案的部署樣式,因為其他網路方案不爭氣。

Flanneld [Systemd部署樣式]

Flannel部署相對來說簡單容易、坑少,直接上配置。

flannel.service

[Unit]
Description=Flanneld overlay address etcd agent
After=network.target
After=network-online.target
Wants=network-online.target
Before=docker.service
[Service]
Type=notify
ExecStart=/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-masq
Restart=on-failure
[Install]
WantedBy=multi-user.target
RequiredBy=docker.service

記住一定要提前在etcd把你的backend寫進去。

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"}}'

然後可以開始你的表演,如果你建立2個pod,互ping一下發現不通,你部署DNS服務,一直報錯no route to host(就是Kubernetes那個SVC對應的IP),恭喜你,你下麵要做的就是:

iptables -P FORWARD ACCEPT

因為1.13版本以上Docker好似在iptable寫了這麼一條策略:

iptables -P FORWARD DROP

到此為止你起來Flanneld就可以開始你的Kubernetes之旅,當然現在好似還不行記得在/etc/cni/net.d下寫一個.conf結尾的檔案,當然叫什麼名字無所謂。etc:

10-flanneld-cni.conf

{
 "name": "cbr0",
 "type": "flannel",
 "delegate": {
   "isDefaultGateway": true
 }
}

然後繼續你的表演就可以了。

Calico [Systemd部署樣式]

其實吧,Calico在Kubernetes網路方案用用的比Flanneld多,Calico懂得玩伸縮,技術也比較牛,在很多物理裝置不開啟BGP的情況下做了折中,用的IP-IP雖然效能有點損失,在雲上被大面積使用。Flanneld的host-gw樣式效能雖然不錯,但是隻能在2層玩下,過了二層路由被重寫就GG了。

開始表演IP-IP樣式。

第一步建立IPpool,pool就是所有calico分配ip的池子,其實就是Kubernetes的pool,不過Calico分配出來是/26的IP,一下少很多。其實我覺得/26比較符合機器配置的現狀至少,不會造成IP的浪費。

設定pool


calicoctl apply -f - << EOF
apiVersion: v1
kind: ipPool
metadata:
cidr: 10.200.0.0/16
spec:
ipip:
enabled: true
mode: cross-subnet
nat-outgoing: true
EOF

部署calico-node(其實就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=true
CALICO_NETWORKING_BACKEND=bird

calico.service
[Unit]
Description=calico-node
After=docker.service
Requires=docker.service

[Service]
EnvironmentFile=/etc/calico/calico.env
ExecStartPre=-/usr/bin/docker rm -f calico-node
ExecStart=/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.0

ExecStop=-/usr/bin/docker stop calico-node

[Install]
WantedBy=multi-user.target

CNI配置檔案(/etc/cni/net.d下隨便寫一個.conf結尾的檔案)

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部署樣式

其實就是在以上的基礎上多部署一個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\"}

然後就是建立一個全域性的BGPpeer。

cat << EOF | calicoctl delete -f -
apiVersion: v1
kind: bgpPeer
metadata:
peerIP: {HOST-IP}
scope: global
spec:
asNumber: 64567
EOF

關閉 node-to-node mesh。

calicoctl config set nodeToNodeMesh off

重新啟動你所有的calico-node。

附一份calicoctl的配置檔案(在/etc/calico下)

calicoctl.cfg

apiVersion: v1
kind: calicoApiConfig
metadata:
spec:
etcdEndpoints: https://{ETCD}:2379
etcdKeyFile: /etc/kubernetes/ssl/kubernetes-key.pem
etcdCertFile: /etc/kubernetes/ssl/kubernetes.pem
etcdCACertFile: /etc/kubernetes/ssl/ca.pem

開始你的裝逼之旅吧。

關於calico-bgp有硬體的自己嘗試吧。

附一份非標準的kube-proxy.service


[Unit]
Description=Kubernetes Kube Proxy
Documentation=https://github.com/GoogleCloudPlatform/kubernetes

[Service]

ExecStart=/usr/local/bin/kube-proxy \
--hostname-override={HOST-IP} \
--kubeconfig=/etc/kubernetes/kube-proxy.kubeconfig \
--v=2
Restart=on-failure
RestartSec=5

[Install]

WantedBy=multi-user.target


轉載宣告:本文轉載自「Docker」,搜尋「dockerone」即可關註。

《Linux雲端計算及運維架構師高薪實戰班》2018年03月26日即將開課中,120天衝擊Linux運維年薪30萬,改變速約~~~~

    *宣告:推送內容及圖片來源於網路,部分內容會有所改動,版權歸原作者所有,如來源資訊有誤或侵犯權益,請聯絡我們刪除或授權事宜。

    – END –


    更多Linux好文請點選【閱讀原文】

    ↓↓↓

    贊(0)

    分享創造快樂