kolla-ansible を使って Zun と Magnum をインストールする
自宅のサーバで 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 は無効化しています。
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 の設定を無効化しています。
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 をダウンロードします。
以下では 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