团队和仓库标签

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 的“expose”选项

    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 或更新版本),

  • DB 管理系统,例如 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 用于定义用于处理 libnetwork 请求的 kuryr 进程数。

请注意,您可能需要更改 127.0.0.1 IDENTITY_URL 地址为 Keystone 运行的地址。在这种情况下,它是 127.0.0.1,因为示例假定使用–net=host 在所有在一个部署中运行 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

在同一文件中,取消注释 bindir 参数,并提供 Kuryr vif 绑定可执行文件的路径。例如,如果您在 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 管理的 pluginv2

如何构建 kuryr-libnetwork docker 管理的 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 管理的 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. 使用所需的 local.conf 文件运行 OpenStack,但包括下一个以使用 OVS-firewall 并启用 Trunk Ports

    [[post-config|/$Q_PLUGIN_CONF_FILE]]
    
    [DEFAULT]
    service_plugins=trunk
    
    [securitygroup]
    firewall_driver=openvswitch
    
  2. 启动一个带有 Neutron trunk port. <https://wiki.openstack.org/wiki/Neutron/TrunkPort> 的 VM

  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 bug,子端口上的 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 tag bug,版本 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://:8080

$ cd build/html
$ python3 -m SimpleHTTPServer 8080

限制

Docker 1.12 与 SwarmKit(新的 Swarm)不兼容。因此,它不能与 Kuryr 一起使用。此限制将在 Docker 1.13 中删除。

要创建具有相同/重叠 cidr 的子网的 Docker 网络,预计需要预先创建 Neutron subnetpool,并为每个此类网络创建 Docker 命令传递池名称。Docker cli 选项 -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/2025.2/doc/source>