From f2b811df691ded8deb1bf4c1a54ac65d886d3a18 Mon Sep 17 00:00:00 2001 From: Guo Ruijing Date: Tue, 1 Aug 2017 14:44:21 -0700 Subject: add ovsdpdk cni Change-Id: Id3eba33d3b33deee815596c0a56bbe77954e2214 Signed-off-by: Guo Ruijing --- src/cni/ovsdpdk/Dockerfile | 7 ++ src/cni/ovsdpdk/Vagrantfile | 16 +++++ src/cni/ovsdpdk/build_cni_ovsdpdk.sh | 19 +++++ src/cni/ovsdpdk/install_cni.sh | 8 +++ src/cni/ovsdpdk/kube_ovsdpdk.yml | 71 ++++++++++++++++++ src/cni/ovsdpdk/ovsdpdk.patch | 136 +++++++++++++++++++++++++++++++++++ src/cni/ovsdpdk/setup_ovsdpdk.sh | 14 ++++ src/cni/ovsdpdk/teardown_ovsdpdk.sh | 9 +++ 8 files changed, 280 insertions(+) create mode 100644 src/cni/ovsdpdk/Dockerfile create mode 100644 src/cni/ovsdpdk/Vagrantfile create mode 100755 src/cni/ovsdpdk/build_cni_ovsdpdk.sh create mode 100644 src/cni/ovsdpdk/install_cni.sh create mode 100644 src/cni/ovsdpdk/kube_ovsdpdk.yml create mode 100644 src/cni/ovsdpdk/ovsdpdk.patch create mode 100755 src/cni/ovsdpdk/setup_ovsdpdk.sh create mode 100755 src/cni/ovsdpdk/teardown_ovsdpdk.sh diff --git a/src/cni/ovsdpdk/Dockerfile b/src/cni/ovsdpdk/Dockerfile new file mode 100644 index 0000000..2a7208c --- /dev/null +++ b/src/cni/ovsdpdk/Dockerfile @@ -0,0 +1,7 @@ +FROM ubuntu:16.04 + +WORKDIR /cni +ADD setup_ovsdpdk.sh . +ADD teardown_ovsdpdk.sh . +ADD ovsdpdk . +ADD install_cni.sh . diff --git a/src/cni/ovsdpdk/Vagrantfile b/src/cni/ovsdpdk/Vagrantfile new file mode 100644 index 0000000..f170c69 --- /dev/null +++ b/src/cni/ovsdpdk/Vagrantfile @@ -0,0 +1,16 @@ +Vagrant.require_version ">= 1.8.6" +Vagrant.configure("2") do |config| + + config.vm.box = "bento/ubuntu-16.04" + config.vm.provider :virtualbox do |vb| + vb.customize ["modifyvm", :id, "--memory", 4096] + vb.customize ["modifyvm", :id, "--cpus", 4] + vb.customize "post-boot",["controlvm", :id, "setlinkstate1", "on"] + end + + config.vm.define "cni-ovsdpdk" do |config| + config.vm.hostname = "cni-ovsdpdk" + config.vm.provision "shell", path: "build_cni_ovsdpdk.sh", privileged: false + end + +end diff --git a/src/cni/ovsdpdk/build_cni_ovsdpdk.sh b/src/cni/ovsdpdk/build_cni_ovsdpdk.sh new file mode 100755 index 0000000..71318d8 --- /dev/null +++ b/src/cni/ovsdpdk/build_cni_ovsdpdk.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +set -ex + +sudo apt-get update +sudo apt-get install -y docker.io devscripts git +wget -qO- https://storage.googleapis.com/golang/go1.8.3.linux-amd64.tar.gz | sudo tar -C /usr/local -xz +echo 'export GOPATH=/go; export PATH=/usr/local/go/bin:$GOPATH/bin:$PATH' >> ~/.bashrc +export GOPATH=/go; export PATH=/usr/local/go/bin:$GOPATH/bin:$PATH +git clone https://github.com/containernetworking/cni +echo sudo CNI_PATH=$CNI_PATH ./priv-net-run.sh ifconfig +git clone https://github.com/containernetworking/plugins +cd plugins +git checkout 5544d9ced0d6e908fe26e9dbe529c7feb87d21f5 +patch -p1 < /vagrant/ovsdpdk.patch +./build.sh +cd bin +cp /vagrant/* . +sudo docker build -t openretriever/cni-ovsdpdk . diff --git a/src/cni/ovsdpdk/install_cni.sh b/src/cni/ovsdpdk/install_cni.sh new file mode 100644 index 0000000..8f5b78a --- /dev/null +++ b/src/cni/ovsdpdk/install_cni.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +set -ex +cp /cni/ovsdpdk /opt/cni/bin +cp /cni/setup_ovsdpdk.sh /opt/cni/bin +cp /cni/teardown_ovsdpdk.sh /opt/cni/bin +cp /etc/kube-ovsdpdk/cni-conf.json /etc/cni/net.d/10-ovsdpdk.conf +while true; do sleep 3600; done diff --git a/src/cni/ovsdpdk/kube_ovsdpdk.yml b/src/cni/ovsdpdk/kube_ovsdpdk.yml new file mode 100644 index 0000000..2bcebdc --- /dev/null +++ b/src/cni/ovsdpdk/kube_ovsdpdk.yml @@ -0,0 +1,71 @@ +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: ovsdpdk + namespace: kube-system +--- +kind: ConfigMap +apiVersion: v1 +metadata: + name: kube-ovsdpdk-cfg + namespace: kube-system + labels: + tier: node + app: ovsdpdk +data: + cni-conf.json: | + { + "name": "ovsdpdk", + "type": "ovsdpdk", + "bridge": "br-dpdk", + "ipam": { + "type": "host-local", + "subnet": "10.244.0.0/16" + } + } +--- +apiVersion: extensions/v1beta1 +kind: DaemonSet +metadata: + name: kube-ovsdpdk-ds + namespace: kube-system + labels: + tier: node + app: ovsdpdk +spec: + template: + metadata: + labels: + tier: node + app: ovsdpdk + spec: + hostNetwork: true + nodeSelector: + beta.kubernetes.io/arch: amd64 + tolerations: + - key: node-role.kubernetes.io/master + operator: Exists + effect: NoSchedule + serviceAccountName: ovsdpdk + containers: + - name: install-cni + image: openretriever/cni-ovsdpdk + command: [ "/bin/bash", "/cni/install_cni.sh" ] + volumeMounts: + - name: cni-bin + mountPath: /opt/cni/bin + - name: cni-cfg + mountPath: /etc/cni/net.d + - name: ovsdpdk-cfg + mountPath: /etc/kube-ovsdpdk + volumes: + - name: cni-bin + hostPath: + path: /opt/cni/bin + - name: cni-cfg + hostPath: + path: /etc/cni/net.d + - name: ovsdpdk-cfg + configMap: + name: kube-ovsdpdk-cfg diff --git a/src/cni/ovsdpdk/ovsdpdk.patch b/src/cni/ovsdpdk/ovsdpdk.patch new file mode 100644 index 0000000..67b3703 --- /dev/null +++ b/src/cni/ovsdpdk/ovsdpdk.patch @@ -0,0 +1,136 @@ +diff --git a/build.sh b/build.sh +index cd21ba8..bc60d91 100755 +--- a/build.sh ++++ b/build.sh +@@ -19,7 +19,7 @@ export GOPATH=${PWD}/gopath + mkdir -p "${PWD}/bin" + + echo "Building plugins" +-PLUGINS="plugins/meta/* plugins/main/* plugins/ipam/* plugins/sample" ++PLUGINS="plugins/main/ovsdpdk plugins/main/bridge plugins/ipam/host-local" + for d in $PLUGINS; do + if [ -d "$d" ]; then + plugin="$(basename "$d")" +diff --git a/plugins/main/ovsdpdk/ovsdpdk.go b/plugins/main/ovsdpdk/ovsdpdk.go +new file mode 100644 +index 0000000..1b931d4 +--- /dev/null ++++ b/plugins/main/ovsdpdk/ovsdpdk.go +@@ -0,0 +1,117 @@ ++// Copyright 2014 CNI authors ++// ++// Licensed under the Apache License, Version 2.0 (the "License"); ++// you may not use this file except in compliance with the License. ++// You may obtain a copy of the License at ++// ++// http://www.apache.org/licenses/LICENSE-2.0 ++// ++// Unless required by applicable law or agreed to in writing, software ++// distributed under the License is distributed on an "AS IS" BASIS, ++// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++// See the License for the specific language governing permissions and ++// limitations under the License. ++ ++package main ++ ++import ( ++ "encoding/json" ++ "errors" ++ "fmt" ++ //"net" ++ "runtime" ++ //"syscall" ++ "os/exec" ++ //"io/ioutil" ++ ++ "github.com/containernetworking/cni/pkg/skel" ++ "github.com/containernetworking/cni/pkg/types" ++ "github.com/containernetworking/cni/pkg/types/current" ++ "github.com/containernetworking/cni/pkg/version" ++ //"github.com/containernetworking/plugins/pkg/ip" ++ "github.com/containernetworking/plugins/pkg/ipam" ++ //"github.com/containernetworking/plugins/pkg/ns" ++ //"github.com/containernetworking/plugins/pkg/utils" ++ //"github.com/vishvananda/netlink" ++) ++ ++const defaultBrName = "cni0" ++ ++type NetConf struct { ++ types.NetConf ++ BrName string `json:"bridge"` ++} ++ ++func init() { ++ // this ensures that main runs only on main thread (thread group leader). ++ // since namespace ops (unshare, setns) are done for a single thread, we ++ // must ensure that the goroutine does not jump from OS thread to thread ++ runtime.LockOSThread() ++} ++ ++func loadNetConf(bytes []byte) (*NetConf, string, error) { ++ n := &NetConf{ ++ BrName: defaultBrName, ++ } ++ if err := json.Unmarshal(bytes, n); err != nil { ++ return nil, "", fmt.Errorf("failed to load netconf: %v", err) ++ } ++ return n, n.CNIVersion, nil ++} ++ ++func setupVhostUser(args *skel.CmdArgs, types string) error { ++ exec.Command("/bin/bash", "/opt/cni/bin/setup_ovsdpdk.sh", args.Netns, args.ContainerID, types).Output() ++ return nil ++} ++ ++ ++func cmdAdd(args *skel.CmdArgs) error { ++ n, cniVersion, err := loadNetConf(args.StdinData) ++ if err != nil { ++ return err ++ } ++ ++ // run the IPAM plugin and get back the config to apply ++ r, err := ipam.ExecAdd(n.IPAM.Type, args.StdinData) ++ if err != nil { ++ return err ++ } ++ ++ // Convert whatever the IPAM result was into the current Result type ++ result, err := current.NewResultFromResult(r) ++ if err != nil { ++ return err ++ } ++ ++ if len(result.IPs) == 0 { ++ return errors.New("IPAM plugin returned missing IP config") ++ } ++ ++ setupVhostUser(args, result.String()) ++ ++ return types.PrintResult(result, cniVersion) ++} ++ ++func tearDownVhostUser(args *skel.CmdArgs) error { ++ exec.Command("/bin/bash", "/opt/cni/bin/teardown_ovsdpdk.sh", args.Netns, args.ContainerID).Output() ++ return nil ++} ++ ++func cmdDel(args *skel.CmdArgs) error { ++ n, _, err := loadNetConf(args.StdinData) ++ if err != nil { ++ return err ++ } ++ ++ if err := ipam.ExecDel(n.IPAM.Type, args.StdinData); err != nil { ++ return err ++ } ++ ++ tearDownVhostUser(args) ++ return err ++ ++} ++ ++func main() { ++ skel.PluginMain(cmdAdd, cmdDel, version.All) ++} diff --git a/src/cni/ovsdpdk/setup_ovsdpdk.sh b/src/cni/ovsdpdk/setup_ovsdpdk.sh new file mode 100755 index 0000000..a1813c9 --- /dev/null +++ b/src/cni/ovsdpdk/setup_ovsdpdk.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +netns=$1 +containerid=$2 +ip=$3 +pid=$(echo $netns | cut -f3 -d"/") + +sudo ovs-vsctl --may-exist add-br br-dpdk -- set bridge br-dpdk datapath_type=netdev +sudo ovs-vsctl --may-exist add-port br-dpdk vhost-user-$pid -- set Interface vhost-user-$pid type=dpdkvhostuser +sudo ln -sf $netns /var/run/netns/$pid +sudo ip link add dummy-$pid type dummy +sudo ip link set dummy-$pid netns $pid +sudo mkdir -p /var/run/cni +echo $ip | sudo tee /var/run/cni/netconf-$pid diff --git a/src/cni/ovsdpdk/teardown_ovsdpdk.sh b/src/cni/ovsdpdk/teardown_ovsdpdk.sh new file mode 100755 index 0000000..857738e --- /dev/null +++ b/src/cni/ovsdpdk/teardown_ovsdpdk.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +netns=$1 +containerid=$2 +pid=$(echo $netns | cut -f3 -d"/") + +sudo ovs-vsctl del-port br-dpdk vhost-user-$pid +sudo ip netns exec $pid link delete dummy-$pid +sudo rm -rf /var/run/cni/netconf-$pid -- cgit 1.2.3-korg