kuryr-libnetwork¶
OpenStack Neutron 的 Docker
Kuryr-libnetwork 是 Kuryr 的 Docker libnetwork 驱动程序,它使用 Neutron 提供网络服务。它为常见的 Neutron 插件提供容器化镜像。
此仓库提供 libnetwork 特定的功能,例如 libnetwork api 的处理程序方法。所有可以在不同的容器网络框架之间共享的逻辑/实用程序,例如 Docker 的 libnetwork、K8s 的 CNI 等,都维护在单独的 Kuryr 仓库中,作为通用库。
自由软件:Apache 许可证
发布说明:https://docs.openstack.org/releasenotes/kuryr-libnetwork
特性¶
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 ...
如何尝试在本地进行嵌套容器¶
使用所需的 local.conf 文件运行 OpenStack,但包括下一个以使用 OVS-firewall 并启用 Trunk Ports
[[post-config|/$Q_PLUGIN_CONF_FILE]] [DEFAULT] service_plugins=trunk [securitygroup] firewall_driver=openvswitch
启动一个带有 Neutron trunk port. <https://wiki.openstack.org/wiki/Neutron/TrunkPort> 的 VM
在 VM 内部安装 kuryr 和 kuryr-libnetwork,按照正常的安装步骤(参见上面的 安装 Kuryr 的 libnetwork 驱动程序)
重新配置 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 服务
已知的嵌套容器限制¶
由于 Neutron Trunk 服务实现选择,使用 iptables 混合安全组驱动程序的部署不支持 trunk 服务。
由于 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