K8S-OVS使用Openvswitch爲提供SDN功能支持單租戶模式和多租戶模式

k8s-ovs

==============================html

最近在尋求一些工做機會,若是有kubernetes相關研發招聘的朋友,歡迎隨時聯繫我。個人我的簡歷能夠經過百度網盤:https://pan.baidu.com/s/1jI20TWa 下載。謝謝node

k8s-ovs是一個使用openvswitchK8S提供SDN功能的項目。該項目基於openshift SDN的原理進行開發。因爲openshift的SDN網絡方案和openshift自身的代碼耦合在一塊兒,沒法像flannelcalico等網絡方案以插件的方式獨立的爲K8S提供服務,因此我開發了k8s-ovs,它擁有openshift優秀的SDN功能,又能夠獨立爲K8S提供服務。git

該項目中有一部分基礎代碼庫是從openshift的pkg/sdn/plugin直接拷貝或進行了一些修改的。若是有License方面的問題請隨時聯繫我進行修正:at28997146@163.comgithub

若是對該項目有任何疑問,歡迎加入k8s-ovs-sdn的QQ交流羣477023854進行討論。golang

下面將對k8s-ovs的功能和安裝進行詳細介紹。若是你想了解不一樣功能的配置方法,能夠跳轉到admin.md進行閱讀。docker

k8s-ovs的功能


k8s-ovs支持單租戶模式和多租戶模式。api

  • 單租戶模式直接使用openvswitch+vxlan將K8S的POD網絡組成一個大二層,全部POD能夠互通。
  • 多租戶模式也使用openvswitch+vxlan來組建K8S的POD網絡,可是它能夠基於K8S中的NAMESPACE來分配虛擬網絡從而造成一個網絡獨立的租戶,一個NAMESPACE中的POD沒法訪問其餘NAMESPACE中的PODS和SERVICES
  • 多租戶模式下能夠對一些NAMESPACE進行設置,使這些NAMESPACE中的POD能夠和其餘全部NAMESPACE中的PODS和SERVICES進行互訪。
  • 多租戶模式下能夠合併某兩個NAMESPACE的虛擬網絡,讓他們的PODS和SERVICES能夠互訪。
  • 多租戶模式下也能夠將上面合併的NAMESPACE虛擬網絡進行分離。
  • 單租戶和多租戶模式下都支持POD的流量限制功能,這樣能夠保證同一臺主機上的POD相對公平的分享網卡帶寬,而不會出現一個POD由於流量過大佔滿了網卡致使其餘POD沒法正常工做的狀況。
  • 單租戶和多租戶模式下都支持外聯負載均衡。

安裝


安裝部署,須要準備至少3臺服務器,其中一臺做爲K8S的master,另外兩臺做爲node節點。個人測試環境爲Centos7.2,docker(1.12.6)版本以及golang(1.7.1)版本。每臺node節點都須要安裝openvswitch-2.5.0或以上版本,而且每臺node節點都須要將ovsdb-serverovs-vswitchd運行起來。服務器

K8S集羣安裝

請參考K8S安裝手冊,推薦安裝v1.6.0之後的版本,由於以前版本的kubelet在使用CNI的狀況下存在IP地址泄漏問題網絡

1,K8S集羣安裝過程當中應該跳過網絡部署這一步,網絡部署將由下面的k8s-ovs部署完成。app

2,安裝過程當中須要設置kubelet使用cni,也就是kubelet啓動參數須要設置爲--network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin,若是kubelet是使用容器的方式啓動的須要將/etc/cni/net.d/opt/cni/bin/var/run/掛在到kubelet內部。

3,安裝完成後K8S的node節點將會呈現出下面的狀態。NotReady是由於尚未部署網絡,kubelet在/etc/cni/net.d/目錄下面沒有發現cni配置文件致使,這會隨着後面網絡的部署會獲得解決。

$ kubectl get node
NAME STATUS AGE VERSION sdn-test1 NotReady 10s v1.6.4 sdn-test2 NotReady 4m v1.6.4 sdn-test3 NotReady 6s v1.6.4

安裝k8s-ovs

下面咱們將會分兩種狀況進行安裝,用戶能夠選擇其中適合本身的一種。 1,使用yaml直接一鍵部署k8s-ovs到k8s集羣中,並使其做爲daemonset運行起來。 2,詳細介紹k8s-ovs的每個組件的安裝步驟,以便用戶對k8s-ovs的各個組件依賴關係有一個深刻了解。

開始下列安裝操做的前提是你已經按照上面步驟安裝好了K8S集羣。而且在每一臺node節點上將ovsdb-serverovs-vswitchd運行起來了。

快速安裝

快速安裝須要你部署K8S 1.6以上版本的集羣,若是是1.5或者1.4的集羣請下載yaml文件作相應修改。

$ kubectl apply -f https://raw.githubusercontent.com/tangle329/k8s-ovs/master/rootfs/k8s-ovs.yaml

上面命令成功返回以後,你能夠經過下列查詢命令獲取pod和node的運行狀態來確認是否安裝成功:

$ kubectl get pod --namespace=kube-system | grep k8s-ovs
k8s-ovs-etcd-h0fsc 1/1 Running 0 2h k8s-ovs-node-c27jr 1/1 Running 0 2h k8s-ovs-node-fxwwl 1/1 Running 0 2h k8s-ovs-node-p09jd 1/1 Running 0 2h $ kubectl get node NAME STATUS AGE VERSION sdn-test1 Ready 11m v1.6.4 sdn-test2 Ready 15m v1.6.4 sdn-test3 Ready 11m v1.6.4

至此,k8s-ovs部署完成,用戶能夠跳轉到admin.md進行功能配置了。

詳細安裝

詳細安裝須要你部署K8S v1.4版本以上的集羣。 下列命令須要到每臺K8S的node節點運行,也能夠在一臺服務器上將對應文件編譯好,而後使用批量部署工具將對應文件誰送到全部node節點上。 你也可使用k8s-ovs-rpm項目中的RPM SPEC來製做本項目的RPM包,而後直接安裝RPM包來完成下列命令的操做。

$ cd $GOPATH/src/
$ git clone https://github.com/tangle329/k8s-ovs.git $ cd k8s-ovs $ go build -o rootfs/opt/cni/bin/k8s-ovs k8s-ovs/cniclient $ cp rootfs/opt/cni/bin/k8s-ovs /opt/cni/bin/ $ cp rootfs/opt/cni/bin/host-local /opt/cni/bin/ $ cp rootfs/opt/cni/bin/loopback /opt/cni/bin/ $ cp rootfs/etc/cni/net.d/80-k8s-ovs.conf /etc/cni/net.d/ $ go build -o rootfs/usr/sbin/k8s-ovs k8s-ovs $ cp rootfs/usr/sbin/k8s-ovs /usr/sbin/ $ cp rootfs/usr/sbin/k8s-sdn-ovs /usr/sbin/

其中第一個go build -o rootfs/opt/cni/bin/k8s-ovs k8s-ovs/cniclient生成的k8s-ovs是cni客戶端,kubelet在建立和刪除POD的時候會調用它來對POD的網絡部分進行配置。第二個go build -o rootfs/usr/sbin/k8s-ovs k8s-ovs生成的k8s-ovs是咱們的整個k8s-ovs的核心,前面提到的全部功能都由它來實現,它也是cni的服務端,接受並處理前面cni客戶端的請求。注意請不要把/opt/cni/bin/目錄設置到PATH環境變量中。

一般在kubelet使用了cni的狀況下要執行了cp rootfs/etc/cni/net.d/80-k8s-ovs.conf /etc/cni/net.d/命令以後k8s的node節點纔會進行ready狀態,另外請確保在/etc/cni/net.d/中只有80-k8s-ovs.conf這個文件,執行完上面的命令後K8S的node節點狀態爲:

$ kubectl get node
NAME STATUS AGE VERSION sdn-test1 Ready 11m v1.6.4 sdn-test2 Ready 15m v1.6.4 sdn-test3 Ready 11m v1.6.4

設置k8s-ovs的網絡參數

設置網絡參數以前,你須要搭建一個etcd服務,或者和K8S的apiserver共用一個etcd服務,全部K8S節點都須要能訪問到該etcd服務。

搭建好etcd服務器以後,使用下列命令設置k8s-ovs的網絡參數:

$ etcdctl set /k8s.ovs.com/ovs/network/config '{"Name":"k8ssdn", "Network":"172.11.0.0/16", "HostSubnetLength":10, "ServiceNetwork":"10.96.0.0/12", "PluginName":"k8s-ovs-multitenant"}'

其中,Network用於設置整個K8S集羣POD網絡的網段;HostSubnetLength用於設置每一個node節點的子網長度;ServiceNetwork用於設置K8S中service的網段,這個須要和K8S apiserver的參數--service-cluster-ip-range指定的網絡保持一致;PluginName用於設置租戶模式,k8s-ovs-multitenant用於設置多租戶模式,k8s-ovs-subnet用於設置單租戶模式。

啓動k8s-ovs

1,啓動以前要在每一個K8S node節點上設置訪問K8S apiserver的環境變量,k8s-ovs就是經過該環境變量和apiserver進行通訊的。 若是K8S使用的非加密方式則須要設置KUBERNETES_MASTER,你須要把下面兩個變量apiserver_vipapiserver_port替換成你本身的apiserver服務的ip和port:

$ export KUBERNETES_MASTER="${apiserver_vip}:${apiserver_port}"

若是K8S使用加密方式則須要設置KUBECONFIG環境變量。咱們使用的是加密方式因此設置的KUBECONFIG環境變量,其中每一臺節點上面都須要有/etc/kubernetes/admin.conf這個文件,該文件是在部署加密方式服務的K8S集羣時在K8S master上生成的,你須要將它依次拷貝到每一臺node節點上:

$ export KUBECONFIG="/etc/kubernetes/admin.conf"

2,設置好環境變量後就能夠運行k8s-ovs了。k8s-ovs有幾個重要的選項--etcd-endpoints用於指定etcd服務的訪問ip+port列表;若是是加密的etcd服務能夠經過--etcd-cafile--etcd-certfile--etcd-keyfile來指定CA,證書,祕鑰;--etcd-prefix用於指定k8s-ovs網絡配置存放的目錄,須要和前面網絡配置小節中etcdctl set命令指定的目錄同樣;--hostname用於指定k8s-ovs所運行的node節點的名字,該名字須要和前面kubectl get node輸出的名字一致,一般--hostname不須要指定,但有時候一些K8S集羣的部署腳本會經過給kubelet傳遞--hostname-override選項來覆蓋默認node節點名,這時就須要設置k8s-ovs的--hostname以便可以保持一致。 因爲咱們的環境沒有覆蓋node節點名,etcd也沒有使用加密方式,因此運行命令以下:

$ /usr/sbin/k8s-ovs --etcd-endpoints=http://${etcd_ip}:2379 --etcd-prefix=/k8s.ovs.com/ovs/network --alsologtostderr --v=5

至此,k8s-ovs部署完成,用戶能夠跳轉到admin.md進行功能配置了。

項目碼雲地址:https://gitee.com/mirrors/k8s-ovs

磁力搜索網站導航2020更新

http://www.javashuo.com/article/p-dyvcyick-kn.html

相關文章
相關標籤/搜索