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

相关文章
相关标签/搜索