跳转到主要内容

OpenStack Neutron的Docker libnetwork驱动程序

项目描述

团队和存储库标记

https://governance.openstack.org/tc/badges/kuryr-libnetwork.svg

kuryr-libnetwork

Kuryr mascot

OpenStack Neutron的Docker

Kuryr-libnetwork是Kuryr的Docker libnetwork驱动程序,它使用Neutron提供网络服务。它为常见的Neutron插件提供容器化镜像。

此存储库提供libnetwork特定的功能,例如libnetwork api的处理方法。所有可以在不同的容器网络框架(如Docker的libnetwork、K8s的CNI等)之间共享的逻辑/实用程序,都维护在独立的Kuryr存储库中,作为公共库。

特点

  • Docker libnetwork远程驱动程序

  • Docker libnetwork IPAM驱动程序

  • 支持Linux Bridge、Open vSwitch、Midonet和IOvisor端口绑定

  • 支持使用现有的Neutron网络

    docker network create -d kuryr --ipam-driver=kuryr --subnet=10.10.0.0/24 --gateway=10.10.0.1 \
       -o neutron.net.uuid=d98d1259-03d1-4b45-9b86-b039cba1d90d mynet
    
    docker network create -d kuryr --ipam-driver=kuryr --subnet=10.10.0.0/24 --gateway=10.10.0.1 \
       -o neutron.net.name=my_neutron_net mynet
  • 支持使用现有的Neutron端口

    docker run -it --net=kuryr_net --ip=10.0.0.5 ubuntu
    
    if a port in the corresponding subnet with the requested ip address
    already exists and it is unbound, that port is used for the
    container.
  • 支持Docker的“暴露”选项

    docker run --net=my_kuryr_net --expose=1234-1238/udp -it ubuntu
    
    This feature is implemented by using Neutron security groups.

使用服务容器运行它

先决条件

运行Kuryr所需的环境组件包括

  • Keystone(最好配置为Keystone v3),

  • Neutron(最好为mitaka或更新版本),

  • 数据库管理系统,如MySQL或MariaDB(用于Neutron和Keystone),

  • 您选择的供应商的Neutron代理,

  • 如果您的供应商的Neutron代理需要它,则Rabbitmq,

  • Docker 1.9+,

构建容器,

此存储库根目录下的Dockerfile可用于使用docker build生成wsgi Kuryr Libnetwork服务器容器,

docker build -t your_docker_username/libnetwork:latest .

此外,您还可以拉取上游容器,

docker pull kuryr/libnetwork:latest

注意,您也可以使用上面命令的标签代替latest

如何运行容器,

首先,我们准备Docker以找到驱动程序,

sudo mkdir -p /usr/lib/docker/plugins/kuryr
sudo curl -o /usr/lib/docker/plugins/kuryr/kuryr.spec \
https://raw.githubusercontent.com/openstack/kuryr-libnetwork/master/etc/kuryr.spec
sudo service docker restart

然后启动容器,

docker run --name kuryr-libnetwork \
  --net=host \
  --cap-add=NET_ADMIN \
  -e SERVICE_USER=admin \
  -e SERVICE_PROJECT_NAME=admin \
  -e SERVICE_PASSWORD=admin \
  -e SERVICE_DOMAIN_NAME=Default \
  -e USER_DOMAIN_NAME=Default \
  -e IDENTITY_URL=http://127.0.0.1:5000/v3 \
  -v /var/log/kuryr:/var/log/kuryr \
  -v /var/run/openvswitch:/var/run/openvswitch \
  kuryr/libnetwork

其中,

  • SERVICE_USER、SERVICE_PROJECT_NAME、SERVICE_PASSWORD、SERVICE_DOMAIN_NAME、USER_DOMAIN_NAME是OpenStack凭证,

  • IDENTITY_URL是OpenStack Keystone v3端点的URL,

  • 创建了一个卷,以便日志在主机上可用,

  • 授予NET_ADMIN能力,以便在主机命名空间上执行网络操作,如ovs-vsctl,

您可以在Docker run中的“-e”参数中设置其他选项,

  • CAPABILITY_SCOPE可以是“local”或“global”,后者适用于当集群存储插入docker引擎时,

  • LOG_LEVEL用于定义,例如,“DEBUG”日志消息,

  • PROCESSES用于定义使用多少个kuryr进程来处理libnetwork请求,

请注意,您可能需要更改127.0.0.1 IDENTITY_URL地址为Keystone运行地址。在这种情况下是127.0.0.1,因为示例假设在所有功能集成部署中运行容器,Keystone也绑定在本地,

或者,如果您有一个现有的kuryr.conf,您可以为容器使用它,

docker run --name kuryr-libnetwork \
  --net host \
  --cap-add NET_ADMIN \
  -v /etc/kuryr:/etc/kuryr:ro \
  -v /var/log/kuryr:/var/log/kuryr:rw \
  -v /var/run/openvswitch:/var/run/openvswitch:rw \
  kuryr/libnetwork

从源获取,

$ git clone https://opendev.org/openstack/kuryr-libnetwork
$ cd kuryr-libnetwork

安装先决条件,

$ sudo pip3 install -r requirements.txt

安装Kuryr的libnetwork驱动程序,

运行以下命令将获取需求并安装Kuryr,

$ sudo pip3 install .

配置Kuryr,

运行以下命令生成示例配置,etc/kuryr.conf.sample

$ ./tools/generate_config_file_samples.sh

重命名并复制到所需路径的配置文件,

$ cp etc/kuryr.conf.sample /etc/kuryr/kuryr.conf

对于使用Keystone v3,编辑/etc/kuryr/kuryr.conf中的Neutron部分,替换ADMIN_PASSWORD,

[neutron]
auth_url = http://127.0.0.1:5000/v3/
username = admin
user_domain_name = Default
password = ADMIN_PASSWORD
project_name = service
project_domain_name = Default
auth_type = password

或者,对于使用Keystone v2,编辑/etc/kuryr/kuryr.conf中的Neutron部分,替换ADMIN_PASSWORD,

[neutron]
auth_url = http://127.0.0.1:5000/v2.0/
username = admin
password = ADMIN_PASSWORD
project_name = service
auth_type = password

在同一文件中取消注释带有Kuryr vif绑定可执行文件路径的bindir参数。例如,如果您在Debian或Ubuntu上安装了它,

[DEFAULT]
bindir = /usr/local/libexec/kuryr

运行Kuryr,

目前,Kuryr使用bash脚本来启动服务。确保在执行以下命令之前已安装tox

如果需要启用SSL,请遵循以下步骤或跳到下一步,

$tox -egenconfig

Add these 3 parameters in generated file[etc/kuryr.conf.sample]:
    ssl_cert_file <Absolute Path for Cert file>
    ssl_key_file <Absolute Path for private key>
    enable_ssl <True or False>

$export SSL_ENABLED=True

Add the path names in [contrib/tls/kuryr.json]:
    InsecureSkipVerify <false/true>
    CAFile: <Absolute Path for CA file>
    CertFile: <Absolute Path for Cert file>
    KeyFile: <Absolute Path for private key>

Placement of cert files:
By default Kuryr places it certs in /var/lib/kuryr/certs directory,
Please make sure that certs are on proper location as mentioned in kuryr.conf

Verification of kuryr.json:
Please make sure that your kuryr.json look similar to below sample
with appropiate paths of certs updated, and remove older .spec files
if any exists.
and https configuration url::
    {
      "Name": "kuryr",
      "Addr": "https://127.0.0.1:23750",
      "TLSConfig": {
        "InsecureSkipVerify": false,
        "CAFile": "/var/lib/kuryr/certs/ca.pem",
        "CertFile": "/var/lib/kuryr/certs/cert.pem",
        "KeyFile": "/var/lib/kuryr/certs/key.pem"
      }
    }

Optional:
For locally generating and testing, please refer to below link:
    http://tech.paulcz.net/2016/01/secure-docker-with-tls/

使用以下命令运行Kuryr服务器。如果您已安装uwsgi,此命令将在其下运行Kuryr。您可以通过设置KURYR_USE_UWSGI=False来覆盖此行为,

$ sudo ./scripts/run_kuryr.sh

Kuryr启动后,请重新启动您的Docker服务,例如,

$ sudo service docker restart

bash脚本在缺失时创建以下文件,

  • /usr/lib/docker/plugins/kuryr/kuryr.json:libnetwork的Json规范文件。

请注意,运行pyroute2以创建和删除veth对需要root权限。

kuryr-libnetwork docker managed pluginv2

如何构建kuryr-libnetwork docker managed pluginv2

Docker Engine的插件系统允许您使用Docker Engine为docker 1.13及更早版本安装、启动、停止和删除插件。

下载kuryr-libnetwork源代码,并在kuryr-libentwork顶层文件夹中运行contrib/docker/v2plugin/v2plugin_rootfs.sh。此脚本将config.json复制到顶层文件夹并构建rootfs。

$ git clone https://opendev.org/openstack/kuryr-libnetwork
$ cd kuryr-libnetwork
$ ./contrib/docker/v2plugin/v2plugin_rootfs.sh
$ docker plugin create kuryr/libnetwork2 ./

如何使用kuryr-libnetwork docker managed pluginv2

如果用户在本地构建pluginv2,用户需要启用pluginv2。

$ docker plugin enable kuryr/libnetwork2

如果用户从docker hub安装pluginv2,安装后pluginv2将直接启用。

$ docker plugin install kuryr/libnetwork2

当用户创建kuryr网络时,驱动程序名称和ipam-driver名称为kuryr/libnetwork2:latest。

$ docker network create --driver=kuryr/libnetwork2:latest --ipam-driver=kuryr/libnetwork2:latest ...

如何在本地尝试嵌套容器

  1. 安装运行devstack的OpenStack,使用所需的local.conf文件,但包括以下内容以使用OVS防火墙和启用Trunk端口

    [[post-config|/$Q_PLUGIN_CONF_FILE]]
    
    [DEFAULT]
    service_plugins=trunk
    
    [securitygroup]
    firewall_driver=openvswitch
  2. 使用Neutron trunk端口启动VM。 <https://wiki.openstack.org/wiki/Neutron/TrunkPort>

  3. 在VM内部按照正常安装步骤安装kuryr和kuryr-libnetwork(参见上述步骤中的《安装Kuryr的libnetwork驱动程序》)。

  4. 重新配置VM内部的kuryr,使其指向neutron服务器并使用vlan驱动程序

    • 配置/etc/kuryr/kuryr.conf

      [binding]
      driver = kuryr.lib.binding.drivers.vlan
      link_iface = eth0 # VM vNIC
      
      [neutron]
      auth_url = http://KEYSTONE_SERVER_IP:5000/v3/
      username = admin
      user_domain_name = Default
      password = ADMIN_PASSWORD
      project_name = service
      project_domain_name = Default
      auth_type = password
    • 重启VM内部的kuryr服务

已知的嵌套容器限制

  1. 由于Neutron Trunk服务实现选择,使用iptables混合安全组驱动程序的部署不支持trunk服务。

  2. 由于Neutron错误,QoS规则没有正确应用于子端口,即嵌套容器端口。

测试Kuryr

为了快速检查Kuryr是否工作,创建一个IPv4网络

$ docker network create --driver kuryr --ipam-driver kuryr \
--subnet 10.10.0.0/16 --gateway=10.10.0.1 test_v4_net
785f8c1b5ae480c4ebcb54c1c48ab875754e4680d915b270279e4f6a1aa52283
$ docker network ls
NETWORK ID          NAME                   DRIVER           SCOPE
785f8c1b5ae4        test_v4_net            kuryr            local

或者您可以使用双栈网络进行测试

$ docker network create --driver kuryr --ipam-driver kuryr \
--subnet 10.20.0.0/16 --gateway=10.20.0.1 --ipv6 --subnet 2001:db8:a0b:12f0::/64 \
--gateway 2001:db8:a0b:12f0::1 test_net
81e1a12eedfb168fbe73186faec4db5088aae4457244f960f38e14f4338e5760
$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
81e1a12eedfb        test_net            kuryr               local

已知的IPv6网络限制

由于Docker –ipv6标签错误,版本1.12和1.13在仅使用IPv6创建网络时存在问题。

生成文档

我们使用Sphinx来维护文档。您可以使用pip安装Sphinx

$ pip3 install -U Sphinx

除了Sphinx之外,您还需要以下要求(不包括在requirements.txt中)

$ pip3 install openstackdocstheme reno 'reno[sphinx]'

文档的源代码位于doc中,您可以使用以下命令生成html文件。如果生成成功,将在doc下创建一个build/html目录

$ cd doc
$ make html

现在您可以将文档作为简单的网站在https://127.0.0.1:8080上提供服务

$ cd build/html
$ python3 -m SimpleHTTPServer 8080

限制

Docker 1.12与SwarmKit(新的Swarm)不支持远程驱动程序。因此,它不能与Kuryr一起使用。此限制将在Docker 1.13中删除。

要创建具有相同/重叠cidr的子网段的Docker网络,需要在创建此类网络时预创建Neutron subnetpool,并传递池名称。应使用以下命令行选项-o和–ipam-opt传递池名称

$ neutron subnetpool-create --pool-prefix 10.0.0.0/24 neutron_pool1
$ sudo docker network create --driver=kuryr --ipam-driver=kuryr \
  --subnet 10.0.0.0/16 --gateway=10.0.0.1 --ip-range 10.0.0.0/24 \
  -o neutron.pool.name=neutron_pool1 \
  --ipam-opt=neutron.pool.name=neutron_pool1 \
  foo
  eddb51ebca09339cb17aaec05e48ffe60659ced6f3fc41b020b0eb506d364

现在Docker用户创建另一个网络,其cidr与上一个相同,即10.0.0.0/16,但具有不同的池名称,neutron_pool2

$ neutron subnetpool-create --pool-prefix 10.0.0.0/24 neutron_pool2
$ sudo docker network create --driver=kuryr --ipam-driver=kuryr \
  --subnet 10.0.0.0/16 --gateway=10.0.0.1 --ip-range 10.0.0.0/24 \
  -o neutron.pool.name=neutron_pool2 \
  --ipam-opt=neutron.pool.name=neutron_pool2 \
  bar
  397badb51ebca09339cb17aaec05e48ffe60659ced6f3fc41b020b0eb506d786

或者,如果存在具有相同名称的多个池,Docker用户可以传递现有的池uuid

$ sudo sudo docker network create --driver=kuryr --ipam-driver=kuryr \
  --subnet 10.0.0.0/16 --gateway=10.0.0.1 --ip-range 10.0.0.0/24 \
  -o neutron.pool.uuid=2d5767a4-6c96-4522-ab1d-a06d7adc9e23 \
  --ipam-opt=neutron.pool.uuid=2d5767a4-6c96-4522-ab1d-a06d7adc9e23 \
  bar
  0aed1efbe21f6c29dc77eccd0dd17ba729274f9275070e1469230c864f9054ff

外部资源

最新和最深入的文档可在以下位置找到

<https://github.com/openstack/kuryr/tree/master/doc/source>

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源代码分发

kuryr-libnetwork-14.0.0.tar.gz (726.4 kB 查看散列值)

上传时间 源代码

构建分发

kuryr_libnetwork-14.0.0-py3-none-any.whl (118.3 kB 查看散列值)

上传时间 Python 3

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面