Zun: проблемы с развертыванием

Ставим все по общему руководству https://docs.openstack.org/zun/latest/index.html В данной статье, в основном, приведены доработки, которых нет в документации.

Kuryr

При взаимодействии zun, docker и kuryr используются настпройки из файла /var/lib/zun/.docker/config.json
Там упоминаются entrypoint и “Socket”: “kuryr-libnetwork.sock”
Файл сокета должен быть здесь: /run/docker/plugins/kuryr-libnetwork.sock - но он не создается.

mkdir -p /run/docker/plugins/
chown kuryr:docker /usr/local/libexec/kuryr /run/docker/plugins/
chmod 775 /usr/local/libexec/kuryr /run/docker/plugins/

Скрипт установки плагина v2:

/var/lib/kuryr/kuryr-libnetwork/contrib/docker/v2plugin/v2plugin_rootfs.sh

Добавляем пользователя kuryr:

openstack user create --domain Default --password Aepie2ir --enable kuryr
useradd -G docker zun

Смотрим сеть:

docker network inspect 3de10eb9-b4a2-40e9-bd1a-9f4c58c23855
[
    {
        "Name": "3de10eb9-b4a2-40e9-bd1a-9f4c58c23855",
        "Id": "0a5c7d5f49d82227fa2446fd822d0ca7414138904df873747f57160b79b1d6ec",
        "Created": "2021-06-23T19:13:00.123597602Z",
        "Scope": "local",
        "Driver": "kuryr",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "kuryr",
            "Options": {
                "neutron.net.shared": "False",
                "neutron.subnet.uuid": "4a2a46d1-c968-474f-a468-d4f7c74a3e34"
            },
            "Config": [
                {
                    "Subnet": "192.168.100.0/24",
                    "Gateway": "192.168.100.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "19106b014542e8746f2655d4b2bc83a0b1ed01d0c1f6169c2473f450221f54e5": {
                "Name": "zun-cfacc614-5bce-4dfa-82df-db58d83437c6",
                "EndpointID": "747993d7c9dd4442b45522c86f4f66443c716e08a5c9994ca429c58283cfdf83",
                "MacAddress": "fa:16:3e:e4:e4:34",
                "IPv4Address": "192.168.100.6/24",
                "IPv6Address": ""
            },
            "acf0eca95a07f67ee572883e048dbb48df61e8305652038415cc568797565413": {
                "Name": "zun-01b9df40-7670-48dd-b688-2ca12367f56d",
                "EndpointID": "3df72fc949c289f669d039d360b528c32cc7374fc2823a115bb93145dad53dec",
                "MacAddress": "fa:16:3e:a9:e0:43",
                "IPv4Address": "192.168.100.13/24",
                "IPv6Address": ""
            }
        },
        "Options": {
            "neutron.net.shared": "False",
            "neutron.net.uuid": "3de10eb9-b4a2-40e9-bd1a-9f4c58c23855",
            "neutron.subnet.uuid": "4a2a46d1-c968-474f-a468-d4f7c74a3e34"
        },
        "Labels": {}
    }
]

Та-же сеть на нейтрон:

openstack network show 3de10eb9-b4a2-40e9-bd1a-9f4c58c23855
+---------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
| Field                     | Value                                                                                                                                   |
+---------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
| admin_state_up            | UP                                                                                                                                      |
| availability_zone_hints   |                                                                                                                                         |
| availability_zones        | nova                                                                                                                                    |
| created_at                | 2021-06-15T15:21:32Z                                                                                                                    |
| description               |                                                                                                                                         |
| dns_domain                | None                                                                                                                                    |
| id                        | 3de10eb9-b4a2-40e9-bd1a-9f4c58c23855                                                                                                    |
| ipv4_address_scope        | None                                                                                                                                    |
| ipv6_address_scope        | None                                                                                                                                    |
| is_default                | None                                                                                                                                    |
| is_vlan_transparent       | None                                                                                                                                    |
| mtu                       | 1450                                                                                                                                    |
| name                      | k8                                                                                                                                      |
| port_security_enabled     | True                                                                                                                                    |
| project_id                | 476fde6aa42b4da3b972b2f733031db0                                                                                                        |
| provider:network_type     | vxlan                                                                                                                                   |
| provider:physical_network | None                                                                                                                                    |
| provider:segmentation_id  | 8278                                                                                                                                    |
| qos_policy_id             | None                                                                                                                                    |
| revision_number           | 25                                                                                                                                      |
| router:external           | Internal                                                                                                                                |
| segments                  | None                                                                                                                                    |
| shared                    | False                                                                                                                                   |
| status                    | ACTIVE                                                                                                                                  |
| subnets                   | 4a2a46d1-c968-474f-a468-d4f7c74a3e34                                                                                                    |
| tags                      | kuryr.net.existing:0a5c7d5f49d8, kuryr.net.uuid.lh:0a5c7d5f49d82227fa2446fd822d0ca7, kuryr.net.uuid.uh:414138904df873747f57160b79b1d6ec |
| updated_at                | 2021-06-23T19:13:02Z                                                                                                                    |
+---------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+

ETCD

Ставим ETCD:

sudo apt install etcd

Добавляем настройки в /etc/default/etcd:

ETCD_NAME="zun-1"
ETCD_DATA_DIR="/var/lib/etcd"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-01"
ETCD_INITIAL_CLUSTER="zun-1=http://10.212.0.111:2380"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://10.212.0.111:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://10.212.0.111:2379"
ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380"
ETCD_LISTEN_CLIENT_URLS="http://10.212.0.111:2379"

Zun-api

policy.json

Надо обязательно прописать политику в файле /etc/zun/policy.d/policy.json

{
    "context_is_admin":  "role:admin",
    "admin_or_owner":  "is_admin:True or project_id:%(project_id)s",
    "default": "rule:admin_or_owner",
    "admin_api": "rule:context_is_admin",

    "container:create": "rule:default",
    "container:delete": "rule:default",
    "container:get": "rule:default",
    "container:get_all": "rule:default",
    "container:get_all_all_tenants": "rule:admin_api",
    "container:update": "rule:default",
    "container:start": "rule:default",
    "container:stop": "rule:default",
    "container:reboot": "rule:default",
    "container:pause": "rule:default",
    "container:unpause": "rule:default",
    "container:logs": "rule:default",
    "container:execute": "rule:default",
    "container:execute_resize": "rule:default",
    "container:kill": "rule:default",
    "container:rename": "rule:default",
    "container:attach": "rule:default",
    "container:resize": "rule:default",
    "container:top": "rule:default",
    "container:get_archive": "rule:default",
    "container:put_archive": "rule:default",
    "container:stats": "rule:default",
    "container:commit": "rule:default",
    "container:add_security_group": "rule:default",

    "image:pull": "rule:default",
    "image:get_all": "rule:default",
    "image:search": "rule:default",

    "zun-service:delete": "rule:admin_api",
    "zun-service:disable": "rule:admin_api",
    "zun-service:enable": "rule:admin_api",
    "zun-service:force_down": "rule:admin_api",
    "zun-service:get_all": "rule:default",

    "host:get_all": "rule:admin_api",
    "host:get": "rule:admin_api"
}

Zun-compute

Версия python

Выяснил, что на python2.7 не будет работать, т.к. для этой версии нет поддержки google-cloud-scheduler.

В связи с этим, nova-api выдает ошибку:

AttributeError: 'module' object has no attribute 'SchedulerClient'

Исправить ошибку не удалось, поэтому перешел на вариант python3.6 (zun-1, 192.168.30.61)

Сборка из исходного кода

cd /opt
git clone https://opendev.org/openstack/zun.git
pip install --upgrade setuptools
# не катит! # pip install -c http://git.openstack.org/cgit/openstack/requirements/plain/upper-constraints.txt?h=stable/pike /opt/zun
cd /opt/zun
pip install -t requirements.txt
pip install wheel tox
pip install configparser
sudo cp /usr/lib/python3.7/configparser.py /usr/lib/python3.7/ConfigParser.py
export PBR_VERSION=1.2.3
python setup.py sdist
python setup.py install

lspci

В логе ошибка:

FileNotFoundError: [Errno 2] No such file or directory: 'lspci': 'lspci'
Необходимо установить пакет pciutils:

sudo apt-get install pciutils

Docker config

Ошибка конфигурации:

No config file found find_config_file /usr/local/lib/python3.7/dist-packages/docker/utils/config.py:28

Создаем файл конфигурации .dockercfg:

cp /var/lib/kuryr/kuryr-libnetwork/contrib/docker/v2plugin/config.json /var/lib/zun/.dockercfg

Glance images path not exist

Создаем каталог для хранения образов сервиса glance:

mkdir /var/lib/zun/images
chown zun:zun /var/lib/zun/images

Neutron integration

В файле настроек /etc/zun/zun.conf:

[neutron_client]
region_name = RegionOne
...
#endpoint_type = http://10.212.0.10:9696
endpoint_type = internalURL
...

ВАЖНО! На узле с контейнерами нужен neutron-l3-agent.
Иначе не отрабатывает связка docker - kuryr - neutron.

Keystone

Понижение версии keystone:

pip uninstall keystoneauth1
pip install keystoneauth1==3.14.0
pip install python-keystoneclien
pip install python-keystoneclient==3.13.0
pip uninstall keystonemiddleware
pip install keystonemiddleware==4.17.0

Было:

keystoneauth1             4.3.1
keystonemiddleware        9.2.0
python-keystoneclient     4.2.0
requests                  2.25.1
requestsexceptions        1.4.0

Не помогло! Вернул обратно.

Лог с ошибкой - запрос в placement от zun:

10.212.0.13 - - [07/May/2021:13:22:37 +0300] "GET /resource_providers?in_tree=eb175fec-2c71-4d5b-b967-fcbc478d10d3 HTTP/1.1" 406 578 "-" "zun-compute keystoneauth1/4.3.1 python-requests/2.25.1 CPython/3.7.3"

Результат нижеприведенного теста позвроляет сделать вывод, что нам надо работать с версией v3 сервиса keystone:

# curl http://10.212.0.10:5000
{"versions": {"values": [{"status": "stable", "updated": "2017-02-22T00:00:00Z", "media-types": [{"base": "application/json", "type": "application/vnd.openstack.identity-v3+json"}], "id": "v3.8", "links": [{"href": "http://10.212.0.10:5000/v3/", "rel": "self"}]}, {"status": "deprecated", "updated": "2016-08-04T00:00:00Z", "media-types": [{"base": "application/json", "type": "application/vnd.openstack.identity-v2.0+json"}], "id": "v2.0", "links": [{"href": "http://10.212.0.10:5000/v2.0/", "rel": "self"}, {"href": "https://docs.openstack.org/", "type": "text/html", "rel": "describedby"}]}]}}

# curl http://10.212.0.10:5000/v3
{"version": {"status": "stable", "updated": "2017-02-22T00:00:00Z", "media-types": [{"base": "application/json", "type": "application/vnd.openstack.identity-v3+json"}], "id": "v3.8", "links": [{"href": "http://10.212.0.10:5000/v3", "rel": "self"}]}}

Ошибка настройки haproxy

В файле /etc/haproxy/haproxy.cfg в параметре keystone_url_ext был прописан потр 5000, вместо 35357, а блок параметра keystone_uri_ext вообще не было.
Вот фрагмент правильного конфигуратора:

listen keystone_uri_ext
    bind 10.10.31.2:5000
    balance leastconn
    option tcpka
    option httpchk
    maxconn 10000
    server 40526 192.168.30.18:5000 check inter 10000 rise 2 fall 5
listen keystone_url_ext
    bind 10.10.31.2:35357
    balance leastconn
    option tcpka
    option httpchk
    maxconn 10000
    server 40526 192.168.30.18:5000 check inter 10000 rise 2 fall 5

RootWrap

На узле docker-1 (zun-api, zun-wsproxy) надо не забыть:

echo "zun ALL=(root) NOPASSWD: /usr/local/bin/zun-rootwrap  /etc/zun/rootwrap.conf *" | sudo tee /etc/sudoers.d/zun-rootwrap

User zun

Должен быть в двух доменах: default, rgpu:

openstack user create --domain rgpu --password Aepie2ir --enable zun

Системный user zun должен входить в группу docker:

useradd -G docker zun
zun registry-create --name zun --username zun --password Aepie2ir --domain Default
zun registry-list
+--------------------------------------+------+---------+----------+----------+
| uuid                                 | name | domain  | username | password |
+--------------------------------------+------+---------+----------+----------+
| 5219fe5a-0371-4673-b012-27d06d913c11 | zun  | Default | zun      | ***      |
+--------------------------------------+------+---------+----------+----------+
zun registry-show 5219fe5a-0371-4673-b012-27d06d913c11
------------------------------------------------------+
| Property   | Value                                                                                                                                                                                                                   |
+------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| uuid       | 5219fe5a-0371-4673-b012-27d06d913c11                                                                                                                                                                                    |
| links      | ["{'href': 'http://192.168.30.61:9517/v1/registries/5219fe5a-0371-4673-b012-27d06d913c11', 'rel': 'self'}", "{'href': 'http://192.168.30.61:9517/registries/5219fe5a-0371-4673-b012-27d06d913c11', 'rel': 'bookmark'}"] |
| name       | zun                                                                                                                                                                                                                     |
| project_id | d5c1f7a8947941b6860cacc21f736525                                                                                                                                                                                        |
| user_id    | e53606fd856b40efa343e378c433aaab                                                                                                                                                                                        |
| domain     | Default                                                                                                                                                                                                                 |
| username   | zun                                                                                                                                                                                                                     |
| password   | ***                                                                                                                                                                                                                     |
+------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Microversion

Смотрим версии микросервисов:

openstack module list
+-----------------+--------+
| Field           | Value  |
+-----------------+--------+
| cinderclient    | 7.4.0  |
| glanceclient    | 3.3.0  |
| keystoneclient  | 4.2.0  |
| novaclient      | 11.0.0 |
| openstack       | 0.56.0 |
| openstackclient | 3.16.2 |
| zunclient       | 2.1.0  |
+-----------------+--------+

Neutron

Для поддержки контейнеров kubernetes в neutron должен быть еще плагин Trunk.
Его поддержку добавляем в /etc/neutron/neutron.conf на контейнерах сервиса.

service_plugins = router,neutron.services.vpn.plugin.VPNDriverPlugin,neutron_lbaas.services.loadbalancer.plugin.LoadBalancerPluginv2,neutron.services.l3_router.l3_router_plugin.L3RouterPlugin,neutron.services.trunk.plugin.TrunkPlugin

Об этом сказано здесь
Пока непонятно, нужно ли это для docker, но в нашем варианте настройки сети (linuxbridge) добавление этого плагина привело к ошибкам neutron.

ERROR oslo_messaging.rpc.server AgentNotFoundByTypeHost: Agent with agent_type=L3 agent and host=cu-rgpu-02 could not be found

Python

Некоторые ошибки python (pip) и методы их устранения.

1) pip: no module named _internal

python -m pip install --upgrade pip

2) no module named six

cd /usr/local/lib/python2.7/dist-packages
wget https://files.pythonhosted.org/packages/71/39/171f1c67cd00715f190ba0b100d606d440a28c93c7714febeca8b79af85e/six-1.16.0.tar.gz
tar xvf six-1.16.0.tar.gz

3) cannot import name util (from …sqlalchemy.py)

pip uninstall SQLAlchemy
pip install SQLAlchemy --upgrade

4) jsonschema

ERROR: pip's legacy dependency resolver does not consider dependency conflicts when selecting packages. This behaviour is the source of the following dependency conflicts.
kuryr-lib 2.0.0 requires pyroute2>=0.4.21; sys_platform != "win32", but you'll have pyroute2 file-.VERSION which is incompatible.
kuryr-libnetwork 1.2.3 requires jsonschema<3.0.0,>=2.6.0, but you'll have jsonschema 3.2.0 which is incompatible.
kuryr-libnetwork 1.2.3 requires pyroute2>0.4.18, but you'll have pyroute2 file-.VERSION which is incompatible.
oslo-log 3.44.1 requires debtcollector>=1.19.0, but you'll have debtcollector 1.17.2 which is incompatible.
oslo-log 3.44.1 requires oslo.i18n>=3.20.0, but you'll have oslo-i18n 3.17.2 which is incompatible.
oslo-middleware 3.38.1 requires WebOb>=1.8.0, but you'll have webob 1.7.3 which is incompatible.
warlock 1.2.0 requires jsonschema<3,>=0.7, but you'll have jsonschema 3.2.0 which is incompatible.

Horizon

Testing

Создание контейнера

export NET_ID=$(openstack network list | awk '/ k8 / { print $2 }')
#zun create -n nginx --cpu 1 --memory 512 --disk 1 --net network=$NET_ID nginx # не работает, т.к. хост не поддерживает disk quotas
zun create -n nginx --cpu 1 --memory 512 --net network=$NET_ID nginx

Список узлов сервиса

openstack appcontainer service list

Запуск контейнера

openstack appcontainer run \
--net network=19369de1-642e-43bc-b792-782424f8ba1f,v4-fixed-ip=192.168.11.41 \
nginx:latest

Документация

openstack port create --project aa3beb7f1d7a429ba704e2b3068f4cc6 --network internal  --tag zun --host zun-1 --enable zun_port2

Sources

  1. Общее руководство: https://docs.openstack.org/zun/latest/index.html
  2. Wiki Zun: https://wiki.openstack.org/wiki/Zun
  3. Kuryr: https://docs.openstack.org/kuryr-libnetwork/latest/index.html
  4. Kury howto works: https://www.programmersought.com/article/87894897759/
  5. Zun UI (Horizon deploy): https://docs.openstack.org/zun-ui/latest/
  6. ETCD: https://docs.openstack.org/install-guide/environment-etcd.html
  7. Zun API guide: https://docs.openstack.org/python-openstackclient/latest/cli/plugin-commands/zun.html#appcontainer-service-enable
  8. Zun on Pike: https://docs.openstack.org/zun/pike/

[статья не завершена!]