💻

kolla-ansible を使って Zun と Magnum をインストールする

2023/07/19に公開

自宅のサーバで kolla-ansible を使って構築した openstack で仮想マシンで開発や検証を行っています。最近なんとなく openstack のコンテナ関連のコンポーネントを使ってみようと思い、Zun と Magnum をインストールしました。せっかくなのでその時の手順について記事にしました。

環境

ホスト OS : Rocky-linux 9.0
kolla-ansible version: 16.1.0
ホスト PC メモリ : 64 GB
ホスト PC disk : 512 GB

openstack 環境は kolla-ansible ドキュメントの Quick Start for deployment/evaluation に沿って All-in-one 構成で構築しました。構築手順については割愛します。

今回の範囲ではインストール・動作確認までしか行わないので、ホスト PC はそれほど高いスペックは要求されません。基本的は kolla-ansible のインストール要件 (メモリ 8 GB, disk 40 GB) を満たしていれば十分かと思います。

Zun

Zun はコンテナを管理する Openstack サービスです。パブリッククラウドでいうと AWS ECS 等のサービスに対応していると考えて良いでしょう。
kolla-ansible の Zun - Container service に沿ってインストールします。

インストール

zun をデプロイするように設定ファイル /etc/kolla/globals.yaml の以下の箇所を設定します。デフォルトでは horizon から zun の環境を管理できるように更新されますが、自分の環境では horizon アクセス時にエラーが生じたため、いったん enable_horizon_zun: "no" として horizon は無効化しています。

/etc/kolla/globals.yaml
enable_zun: "yes"
enable_kuryr: "yes"
enable_etcd: "yes"
enable_horizon_zun: "no"
docker_configure_for_zun: "yes"
containerd_configure_for_zun: "yes"
docker_apt_package_pin: "5:20.*"
docker_yum_package_pin: "20.*"

All-in-one 環境構築時に使用したインベントリ all-in-one のあるディレクトリで以下を実行し、zun をデプロイします。

$ kolla-ansible bootstrap-servers -i all-in-one
$ kolla-ansible deploy -i all-in-one

コマンド実行後に zun, kuryr, etcd 関連の docker コンテナが起動していればデプロイに成功しています。

IMAGE                                                              STATUS                       PORTS     NAMES
quay.io/openstack.kolla/zun-cni-daemon:master-rocky-9              Up 6 hours (healthy)                   zun_cni_daemon
quay.io/openstack.kolla/zun-compute:master-rocky-9                 Up 6 hours (healthy)                   zun_compute
quay.io/openstack.kolla/zun-wsproxy:master-rocky-9                 Up 6 hours (healthy)                   zun_wsproxy
quay.io/openstack.kolla/zun-api:master-rocky-9                     Up 6 hours (healthy)                   zun_api
quay.io/openstack.kolla/heat-engine:master-rocky-9                 Up 6 hours (healthy)                   heat_engine
quay.io/openstack.kolla/heat-api-cfn:master-rocky-9                Up 6 hours (healthy)                   heat_api_cfn
quay.io/openstack.kolla/kuryr-libnetwork:master-rocky-9            Up 5 hours (healthy)                   kuryr
quay.io/openstack.kolla/etcd:master-rocky-9                        Up 5 hours                             etcd
quay.io/openstack.kolla/heat-api:master-rocky-9                    Up 6 hours (healthy)                   heat_api

動作確認

ドキュメントの Verification section に沿って動作確認します。今回の環境では既に clouds.yaml 等の環境ファイルを作成しているため、ドキュメントにある kolla-ansible post-deploy の実行は不要です。

はじめにコンテナに使用するイメージをダウンロードし、openstack (glance) に登録します。ドキュメントでは cirros をダウンロードしていますが、後々の動作確認のためここでは nginx のイメージを使用します。

$ docker pull nginx
$ docker save nginx | openstack image create nginx --public \
  --container-format docker --disk-format raw

次にコンテナ (appcontainer) を作成します。ドキュメントでは zun CLI を使用していますが、openstack CLI では appcontainer サブコマンドに統合されているのでこちらを使用します。

test1 という名前でコンテナを作成します。オプションは以下。

  • ネットワーク : 内部ネットワークの demo-net にコンテナを接続します(今回の範囲では特に使用しない)。
  • セキュリティグループ : 事前に作成しておいた mysg という名前のセキュリティグループを適用します。動作確認のため、 HTTP の ingress port を開けておく。
openstack appcontainer create \
    --name test1 \
    --net=network=demo-net \
    --security-group=mysg \
    nginx

作成した appcontainer のステータスは Created となっているので、openstack appcontainer start コマンドで開始します。

$ openstack appcontainer show test1 -f yaml | yq -r '.status_detail'
Created

# Start appcontainer
$ openstack appcontainer start test1

これで appcontainer が起動したので、コンテナに正常にアクセスできることを確認します。
確認のやり方は色々ありますが、ここでは通常のサーバと同様に floating ip address を付加してアクセスできること確認します。

事前に作成していた外部ネットワーク public1 から floating ip を確保します。

$ openstack floating ip create public1
+---------------------+--------------------------------------+
| Field               | Value                                |
+---------------------+--------------------------------------+
| created_at          | 2023-07-18T09:33:41Z                 |
| description         |                                      |
| dns_domain          | None                                 |
| dns_name            | None                                 |
| fixed_ip_address    | None                                 |
| floating_ip_address | 192.168.3.240                        |
| floating_network_id | bac31e0e-0804-46cf-a944-5daff4073501 |
| id                  | f43c0f0b-56ca-4992-b92b-ccca9129c020 |
| name                | 192.168.3.240                        |
| port_details        | None                                 |
| port_id             | None                                 |
| project_id          | 0c9b0991c5914c90b4080798f9a8dd9d     |
| qos_policy_id       | None                                 |
| revision_number     | 0                                    |
| router_id           | None                                 |
| status              | DOWN                                 |
| subnet_id           | None                                 |
| tags                | []                                   |
| updated_at          | 2023-07-18T09:33:41Z                 |
+---------------------+--------------------------------------+

アドレス 192.168.3.240 が確保されたのでこれをアタッチ。

openstack appcontainer add floating ip test1 192.168.3.240

これでコンテナにアクセスできるようになったので curl を実行します。
返り値で nginx デフォルトの応答が返ってきたので、コンテナが正常に起動していることが確認できました。

$ curl 192.168.3.240
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

ついでに、openstack appcontainer exec [command] で作成した appcontainer 上でコマンドを実行できます。--interactive オプションを付けて shell を指定することでコンテナ内の環境に入ることが出来るので、docker exec -it nginx bash のような使用感でコンテナ内の状況確認やデバッグを行うことが出来ます。

$ openstack appcontainer exec --interactive test1 bash
connected to test1, press Enter to continue
type ~. to disconnect
root@50a95a2cf696:/# curl  localhost -I
HTTP/1.1 200 OK
Server: nginx/1.25.1
Date: Tue, 18 Jul 2023 09:42:51 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Tue, 13 Jun 2023 15:08:10 GMT
Connection: keep-alive
ETag: "6488865a-267"
Accept-Ranges: bytes

root@50a95a2cf696:/#

これで基本的な動作は確認できました。
作成した環境は openstack appcontainer delete test1 で削除できます。

Magnum

Magnum’s Developer Documentation

Openstack における Magnum はコンテナオーケストレーションのためのプロジェクトとなっています。またほとんど触れてはいませんが、軽く触った感じではパブリッククラウドサービスにおけるマネージドのコンテナクラスタサービス (AWS EKS など) に近い感じです。

インストール

kolla ansible における magnum のインストール に従って magnum 用のコンテナをデプロイします。

こちらも zun のインストールと同様、設定ファイル /etc/kolla/globals.yaml でインストールを有効化した上でデプロイコマンドを実行することで容易にインストールできます。
こちらでも zun と同様に magnum 用の horizon を有効化するとアクセス時にエラーが出たため、いったん magnum 用の horizon の設定を無効化しています。

/etc/kolla/globals.yaml
enable_magnum: true
enable_horizon_magnum: "no"

デプロイ

kolla-ansible -i all-in-one deploy --tags common,magnum

magnum 関連のコンテナが起動していれば ok

STATUS                  PORTS     NAMES
quay.io/openstack.kolla/magnum-conductor:master-rocky-9            Up 20 hours (healthy)             magnum_conductor
quay.io/openstack.kolla/magnum-api:master-rocky-9                  Up 20 hours (healthy)             magnum_api

動作確認

kolla-ansible のドキュメントにはこれ以上のことは書いていないので、これから先は magnum ドキュメントの Installation Guide に沿ってインストール後の動作確認を行います。

magnum のクラスタに関する操作は openstack CLI の coe (container orchestration engines) サブコマンドを使って行いますが、こちらの環境ではデフォルトで coe サブコマンドが有効化されていませんでした。そのため python-magnumclient をインストールします。

$ pip install python-magnumclient

openstack coe と打った時に coe コマンドの候補が表示されていれば ok。

$ openstack coe
openstack: 'coe' is not an openstack command. See 'openstack --help'.
Did you mean one of these?
  coe ca rotate
  coe ca show
  coe ca sign
  coe cluster config
  coe cluster create
  coe cluster delete
  coe cluster list
  coe cluster resize
  coe cluster show
  coe cluster template create
  coe cluster template delete
  coe cluster template list
  coe cluster template show
  coe cluster template update
...

次に、クラスタノードで使用するイメージを登録します。今回使用している kolla-ansible に対応した magnum のバージョンでは Image Management に書いてあるように Fedora CoreOS を使用できるとあるので、下記のダウンロードサイトから Cloud Images > Openstack の qcow2.xz をダウンロードします。

https://fedoraproject.org/en/coreos/download/?tab=cloud_operators&stream=stable

以下では wget で直接取得。

$ wget https://builds.coreos.fedoraproject.org/prod/streams/stable/builds/38.20230625.3.
...
fedora-coreos-38.20230625.3.0-openstack.x86_64.qcow2.xz     100%[=========================================================================================================================================>] 643.18M  4.70MB/s 時間 2m 23s

2023-07-18 23:38:17 (4.49 MB/s) - `fedora-coreos-38.20230625.3.0-openstack.x86_64.qcow2.xz' へ保存完了 [674420752/674420752]

$ unxz fedora-coreos-38.20230625.3.0-openstack.x86_64.qcow2.xz

fedora イメージを openstack に登録します。image 名はここでは fedora-38-2023-amd64 としました。

openstack image create \
    --disk-format=qcow2 \
    --container-format=bare \
    --file=fedora-coreos-38.20230625.3.0-openstack.x86_64.qcow2 \
    --property os_distro="fedora-coreos" \
    fedora-38-2023-amd64

次に、クラスタの設定やノードの設定を記載した cluster template を作成します。主なオプションは以下。

  • test1: 作成する cluster template の名前。何でも良い。
  • image: 上記で登録した fedora イメージを指定。
  • external-network: 外部ネットワークを指定
  • master-flavor, flavor: master, worker ノードで使用する flavor を指定。ここで指定している m1.small は All-in-one 環境構築時の setup スクリプト実行時に作成されます。
  • keypair: 後々ノードに ssh したいので、事前に登録しておいた ssh keypair を指定。
openstack coe cluster template create test1 \
   --image fedora-38-2023-amd64 \
   --external-network public1 \
   --dns-nameserver 8.8.8.8 \
   --master-flavor m1.small \
   --flavor m1.small \
   --keypair mykey \
   --coe kubernetes

このテンプレートを用いて実際のクラスタ test1-cluster を作成します。

openstack coe cluster create test1-cluster \
  --cluster-template test1 \
  --master-count 1 \
  --node-count 1

cluster 作成コマンドを実行すると、裏では openstack heat のスタックが作成され、cluster に必要なリソースがまとめて作成されます。

スタックの詳細。

$ openstack stack list -f yaml
- Creation Time: '2023-07-18T12:43:35Z'
  ID: ed544ec4-889a-42ba-a9da-59cd8f4850dc
  Project: 0c9b0991c5914c90b4080798f9a8dd9d
  Stack Name: test1-cluster-jyscan7wyn7w
  Stack Status: CREATE_IN_PROGRESS
  Updated Time: null

スタックでどのようなリソースが作成されているかは openstack stack resource list [stack_name] で確認できます。

$ openstack stack resource  list test1-cluster-jyscan7wyn7w
+-----------------------------------------+--------------------------------------+-----------------------------------------------------------------------------------------------------+-----------------+----------------------+
| resource_name                           | physical_resource_id                 | resource_type                                                                                       | resource_status | updated_time         |
+-----------------------------------------+--------------------------------------+-----------------------------------------------------------------------------------------------------+-----------------+----------------------+
| secgroup_rule_tcp_kube_minion_pods_cidr | 07159fdc-bfb3-45ed-ba2b-9cf6996c3810 | OS::Neutron::SecurityGroupRule                                                                      | CREATE_COMPLETE | 2023-07-18T12:43:36Z |
| kube_cluster_deploy                     | 3cf6bb50-e8d0-4f6e-a5a9-c6a1f058e364 | OS::Heat::SoftwareDeployment                                                                        | CREATE_COMPLETE | 2023-07-18T12:43:36Z |
| kube_cluster_config                     | 95535823-bbe4-4d44-ac02-7b94250d547a | OS::Heat::SoftwareConfig                                                                            | CREATE_COMPLETE | 2023-07-18T12:43:36Z |
| secgroup_rule_tcp_kube_minion           | 22c3237c-4445-4d8f-8aa0-ec75d2fd66c4 | OS::Neutron::SecurityGroupRule                                                                      | CREATE_COMPLETE | 2023-07-18T12:43:36Z |
| secgroup_rule_udp_kube_minion           | a70c5da6-ec46-4222-bc96-a305f28c422a | OS::Neutron::SecurityGroupRule                                                                      | CREATE_COMPLETE | 2023-07-18T12:43:36Z |
| kube_minions                            | a2f10698-a099-4f28-89d9-f58ced393910 | OS::Heat::ResourceGroup                                                                             | CREATE_COMPLETE | 2023-07-18T12:43:36Z |
| worker_nodes_server_group               | b8c874ba-ddfa-415a-875d-1f9c0cbbfafb | OS::Nova::ServerGroup                                                                               | CREATE_COMPLETE | 2023-07-18T12:43:36Z |
| etcd_address_lb_switch                  | 3e142985-79f3-4eac-9171-dfd9dd922ce1 | Magnum::ApiGatewaySwitcher                                                                          | CREATE_COMPLETE | 2023-07-18T12:43:36Z |
| api_address_floating_switch             | 01ce2aa9-88a1-4726-b188-f2982655429b | Magnum::FloatingIPAddressSwitcher                                                                   | CREATE_COMPLETE | 2023-07-18T12:43:36Z |
| api_address_lb_switch                   | 05a95772-d4e1-45ce-a46c-8bbfb823ebc7 | Magnum::ApiGatewaySwitcher                                                                          | CREATE_COMPLETE | 2023-07-18T12:43:36Z |
| kube_masters                            | 0f8f9224-a11b-4fc0-bc09-9486475941b9 | OS::Heat::ResourceGroup                                                                             | CREATE_COMPLETE | 2023-07-18T12:43:36Z |
| etcd_lb                                 | daf02b22-b513-4f78-8ed0-d9c67ffb5bb0 | file:///var/lib/kolla/venv/lib/python3.9/site-packages/magnum/drivers/common/templates/lb_etcd.yaml | CREATE_COMPLETE | 2023-07-18T12:43:36Z |
| master_nodes_server_group               | 95a0e74d-3434-44e2-bea7-34b1b2fe592b | OS::Nova::ServerGroup                                                                               | CREATE_COMPLETE | 2023-07-18T12:43:36Z |
| api_lb                                  | 02d345de-2411-40ab-a347-d13dc1d9def0 | file:///var/lib/kolla/venv/lib/python3.9/site-packages/magnum/drivers/common/templates/lb_api.yaml  | CREATE_COMPLETE | 2023-07-18T12:43:36Z |
| network                                 | 5f3892e3-ff25-46ec-a6bc-df53b5be528f | file:///var/lib/kolla/venv/lib/python3.9/site-packages/magnum/drivers/common/templates/network.yaml | CREATE_COMPLETE | 2023-07-18T12:43:36Z |
| secgroup_rule_udp_kube_minion_pods_cidr | d660d0b2-f5e3-4a82-affc-19b0ef9a5a4c | OS::Neutron::SecurityGroupRule                                                                      | CREATE_COMPLETE | 2023-07-18T12:43:36Z |
| secgroup_kube_minion                    | 9fa71c44-662d-4811-ad9d-6be9bd54c33d | OS::Neutron::SecurityGroup                                                                          | CREATE_COMPLETE | 2023-07-18T12:43:36Z |
| secgroup_kube_master                    | b3e3918e-2ad2-4052-8cbb-3f4d7df41f1e | OS::Neutron::SecurityGroup                                                                          | CREATE_COMPLETE | 2023-07-18T12:43:36Z |
+-----------------------------------------+--------------------------------------+-----------------------------------------------------------------------------------------------------+-----------------+----------------------+

スタックによってすべてのリソースが作成されるにはしばらく時間がかかります。しばらく待つと master node, worker node 用のサーバが作成されるので、ドキュメントに沿ってkubectl 用の config をダウンロードします。

$ mkdir -p ~/clusters/kubernetes-cluster
$ cd ~/clusters/kubernetes-cluster
$ openstack coe cluster config test1-cluster
$ export KUBECONFIG=/home/user/clusters/kubernetes-cluster/config

これで通常の kubernetes と同様に kubectl を使ってクラスタと対話できます。

$ kubectl get node -o wide
NAME                                  STATUS   ROLES    AGE     VERSION   INTERNAL-IP   EXTERNAL-IP   OS-IMAGE                        KERNEL-VERSION          CONTAINER-RUNTIME
test1-cluster-jyscan7wyn7w-master-0   Ready    master   11m     v1.23.3   10.0.0.213    <none>        Fedora CoreOS 38.20230625.3.0   6.3.8-200.fc38.x86_64   docker://20.10.23
test1-cluster-jyscan7wyn7w-node-0     Ready    <none>   6m24s   v1.23.3   10.0.0.167    <none>        Fedora CoreOS 38.20230625.3.0   6.3.8-200.fc38.x86_64   docker://20.10.23

今回の設定では kubernetes の version 1.23.3, CRI として docker version 20.10.23 が使われていました。まあまあ古い。

クラスタを構成するノードは openstack server として作成されるので、openstack server list でも詳細を確認できます。
今回の設定では external network を設定していたので、ip pool から確保され得た floating ip address がサーバに割り当てられています。

$ openstack server list
+--------------------------------------+-------------------------------------+--------+-----------------------------------------+----------------------+----------+
| ID                                   | Name                                | Status | Networks                                | Image                | Flavor   |
+--------------------------------------+-------------------------------------+--------+-----------------------------------------+----------------------+----------+
| 509acd44-8435-46e4-ad9a-c9a12b226e83 | test1-cluster-jyscan7wyn7w-node-0   | ACTIVE | test1-cluster=10.0.0.167, 192.168.3.155 | fedora-38-2023-amd64 | m1.small |
| e995d76d-b775-46f0-818d-38b5c4e03811 | test1-cluster-jyscan7wyn7w-master-0 | ACTIVE | test1-cluster=10.0.0.213, 192.168.3.115 | fedora-38-2023-amd64 | m1.small |
+--------------------------------------+-------------------------------------+--------+-----------------------------------------+----------------------+----------+

この ip address で node に ssh することが可能です。cluster template に指定した keypair を使用して ssh してみます。
fedora core の場合は core ユーザでログインできます。
docker コンテナではクラスタ上のこのノードで稼働しているコンテナを確認できるので、pod のデバッグ等に役立つかも知れません。

$ ssh -i ~/.ssh/mykey core@192.168.3.155
Fedora CoreOS 38.20230625.3.0
Tracker: https://github.com/coreos/fedora-coreos-tracker
Discuss: https://discussion.fedoraproject.org/tag/coreos

[core@test1-cluster-jyscan7wyn7w-node-0 ~]$ sudo docker ps
CONTAINER ID   IMAGE                                                            COMMAND                  CREATED          STATUS          PORTS     NAMES
5713d978293a   k8s.gcr.io/metrics-server/metrics-server                         "/metrics-server --s…"   13 minutes ago   Up 13 minutes             k8s_metrics-server_magnum-metrics-server-6c4c77844b-gl8w5_kube-system_e3f8286e-8a5b-4a80-ab1d-6ad50050a926_0
64578bc6c9a0   k8s.gcr.io/node-problem-detector                                 "/bin/sh -c 'exec /n…"   14 minutes ago   Up 14 minutes             k8s_node-problem-detector_npd-hwndx_kube-system_e9d49e5c-d405-4f77-8f85-96a3c88b90b9_0
38dbcc061a55   gcr.io/google_containers/cluster-proportional-autoscaler-amd64   "/cluster-proportion…"   14 minutes ago   Up 14 minutes             k8s_autoscaler_kube-dns-autoscaler-6d5b5dc777-dr9s5_kube-system_7624d861-b912-446b-a873-5b306f04a577_0
c381df4c9455   gcr.io/google_containers/pause:3.1                               "/pause"                 14 minutes ago   Up 14 minutes             k8s_POD_npd-hwndx_kube-system_e9d49e5c-d405-4f77-8f85-96a3c88b90b9_0
8d3e2595b5e4   gcr.io/google_containers/pause:3.1                               "/pause"                 14 minutes ago   Up 14 minutes             k8s_POD_magnum-metrics-server-6c4c77844b-gl8w5_kube-system_e3f8286e-8a5b-4a80-ab1d-6ad50050a926_0
8bf6a2dbdfd0   gcr.io/google_containers/pause:3.1                               "/pause"                 14 minutes ago   Up 14 minutes             k8s_POD_kube-dns-autoscaler-6d5b5dc777-dr9s5_kube-system_7624d861-b912-446b-a873-5b306f04a577_0
5dc9f484e2ab   e6ea68648f0c                                                     "/opt/bin/flanneld -…"   14 minutes ago   Up 14 minutes             k8s_kube-flannel_kube-flannel-ds-6kfsg_kube-system_d53bc7cb-df09-4b26-bc5c-9ecacaba8d3d_0
03ed1998f82f   gcr.io/google_containers/pause:3.1                               "/pause"                 14 minutes ago   Up 14 minutes             k8s_POD_kube-flannel-ds-6kfsg_kube-system_d53bc7cb-df09-4b26-bc5c-9ecacaba8d3d_0

まとめ

kolla-ansible で zun, magnum をインストール・動作確認する手順をまとめました。
単にコンテナ等を使いたいのであれば openstack server を立てて docker を入れたり kubernetes cluster を構築すればいいだけなので、個人で使う分にはわざわざ zun, magnum のようなコンポーネントを使うメリットは薄いかと感じました (個人的な興味で入れるのは別として)。
パブリッククラウドに匹敵する大規模な仮想インフラ環境を運用できるのが openstack のメリットであるので、そのぐらいの規模になって初めてメリットを感じられるのかも知れません。

おまけ

自宅で仮想マシン (server) を作成する際は Ansible の openstack module と Terraform の Openstack provider を使用して作成・削除を自動化しています。今回インストールした zun, magnum について対応する module があるのかと確認してみました。

Ansible openstack module に関しては、magnum のクラスタを管理するための module は存在しているようですが、Zun のコンテナを管理する module は見当たりませんでした。

Terraform も同様に、Container Infra としては magnum のものしかないようです。

Discussion