JPOUG Advent Calendar 2025 の 7日目の投稿です。
6日目は asahide さんの Oracle Databaseバージョンとマルチクラウドモデルの選択における考察'25 でした。
今日は、Oracle Cloud Native Environment 2.2 の Kubernetes クラスタを、Oracle Linux Virtualization Manager(OLVM)Provider で構築してみます。
なんと、OCNE 2.2.0 新機能として OLVM Provider に対応したので、ためしに使用してみます。(ただし、今のところ私は成功できてません)
Oracle Linux Virtualization Manager Provider
A new provider is added to deploy Kubernetes clusters on Oracle Linux Virtualization Manager (the olvm provider). The olvm provider is an implementation of the Kubernetes Cluster API. The olvm provider uses the oVirt REST API to communicate with Oracle Linux Virtualization Manager.
https://docs.oracle.com/en/operating-systems/olcne/2/relnotes/ocne-220.html
ドキュメントでは、下記のあたりが参考になります。
https://docs.oracle.com/en/operating-systems/olcne/2/clusters/olvm_provider_concept.html
今回の環境
- 管理クラスタ:Kubernetes クラスタ群を管理するクラスタ。OCNE のデフォルトでは libvirt Provider(つまり KVM)に作成する。
- ワークロード クラスタ:本来のアプリのコンテナを展開する目的で使用するクラスタ。今回は、これを OLVM 配下の KVM に、仮想マシンとして作成する。
- OLVM 環境は構築済みです。
- OLVM は、いまのところ Oracle Linux 8.x 環境が必要なので、Manager と KVM の両方で Oracle Linux 8.10 を使用しています。
- Manager の名前は、lab-ovirt-mgr-01.go-lab.jp です。
- NFS 共有のストレージ ドメインを登録してあります。
- 仮想マシン用ネットワークも作成ずみです。
- OCNE の ocne コマンド実行環境と、管理クラスタ用 KVM のために、Oracle Linux 9.7 を用意してあります。今回は次のような手順ですすめます。
- OCNE をインストール
- スタンドアロンの Oracle Linux KVM を構築
- OLVM Provider 実行準備(YAML ファイル作成)
- OS ディスク イメージの作成、アップロード(管理クラスタ用 Kubernetesも作成)
- (OLVM 側で)ディスク イメージから仮想マシン テンプレートを作成
- ワークロード クラスタを作成
1. OCNE のインストール
ここからは、lab-ocne-01 で作業しています。
OCNE の Yum リポジトリ ファイルをインストールして、ol9_ocne チャネルを有効化しておきます。
# dnf install oracle-ocne-release-el9 -y # dnf config-manager --enable ol9_ocne
そして、OCNE をインストールします。
# dnf install ocne -y
ついでに、kubectl もインストールしておきます。
# dnf install kubectl -y
2. ocne 実行 / 管理クラスタ用の Oracle Linux KVM 構築
ひきつづき、lab-ocne-01 に KVM 関連のパッケージをインストールして、仮想マシンを起動できるようにします。まず、Yum リポジトリの ol9_kvm_utils チャネルを有効化します。
# dnf config-manager --enable ol9_kvm_utils
KVM 関連のパッケージをインストールします。
# dnf group install "Virtualization Host" -y # dnf install virt-install virt-viewer -y
サービスを有効化します。対象 Unit が多いので、ドキュメントに掲載されている for 文で実行しますが、今回は root で作業しているので sudo は削除しています。
for drv in qemu network nodedev nwfilter secret storage interface proxy
do
systemctl enable virt${drv}d.service
systemctl enable virt${drv}d{,-ro,-admin}.socket
systemctl start virt${drv}d{,-ro,-admin}.socket
done
ここで、OS を再起動しておきます。
# reboot
ここで、OCNE の libvirt Provider で Kubernetes クラスタが作成できることを確認しておきます。下記のコマンドを実行すると、ocne という名前のシングル ノード Kubernetes クラスタが、仮想マシンで作成されます。
# ocne cluster start
下記のようにクラスタが作成されるはずです。virsh で確認した様子です。
[root@lab-ocne-01 ~]# virsh list Id 名前 状態 ------------------------------------- 1 ocne-control-plane-1 実行中 [root@lab-ocne-01 ~]# virsh dominfo ocne-control-plane-1 Id: 1 名前: ocne-control-plane-1 UUID: 1091c2de-976d-4541-a3ce-c46d46f3c0b9 OS タイプ: hvm 状態: 実行中 CPU: 2 CPU 時間: 89.7s 最大メモリー: 4194304 KiB 使用メモリー: 4194304 KiB 永続: はい (yes) 自動起動: 無効にする 管理保存: いいえ (no) セキュリティモデル: selinux セキュリティ DOI: 0 セキュリティラベル: system_u:system_r:svirt_t:s0:c188,c502 (enforcing) メッセージ: テイント済み: 指定されたカスタム設定パラメーター
kubectl では、自動生成された kubeconfig ファイルを使用すると接続できます。
# kubectl get nodes --kubeconfig=/root/.kube/kubeconfig.ocne.local NAME STATUS ROLES AGE VERSION ocne-control-plane-1 Ready control-plane 12m v1.32.9+1.el8
[root@lab-ocne-01 ~]# ocne cluster list ocne
ocne クラスタは、このまま管理クラスタとして利用できますが、いったん削除しておきます。
[root@lab-ocne-01 ~]# ocne cluster delete INFO[2025-12-07T00:12:10+09:00] Deleting volume ocne-control-plane-1-init.ign INFO[2025-12-07T00:12:10+09:00] Deleting volume ocne-control-plane-1.qcow2 INFO[2025-12-07T00:12:10+09:00] Deleting file /root/.kube/kubeconfig.ocne.local INFO[2025-12-07T00:12:10+09:00] Deleting file /root/.kube/kubeconfig.ocne.vm
3. OLVM Provider 実行準備
OLVM Provider でクラスタを作成するため、下記のように設定を記載した YAML ファイルを用意します。
olvm-wlc-01.yml
- L2:OLVM Provider (olvm)を使用します。
- L3:クラスタ名は olvm-wlc-01
- L5-L6:Control Plane と Worker は、各1ノード
- L9:OLVM のデータセンターは、Default
- L11:OLVM の API エンドポイントの URL
- L12:OLVM から ocne コマンド実行マシンにダウンロードした CA 証明書のパス
- L13~L16:このあとの、OS イメージ(OCK)のビルドで使用する情報
- L14:OLVM のストレージ ドメイン(今回は NFS)
- L18:Control Plane ノードの仮想マシンを作成する OLVM クラスタ(名前は Default)
- L20-22:OLVM のネットワークと、仮想 NIC プロファイルの名前(両方とも vlan-11)
- L25-L29:Control Plane ノード仮想マシンのゲスト OS のネットワーク設定
- L30~:Worker ノードの仮想マシンの設定(今回はほぼ Control Plane と同様)
CA 証明書は、下記のように OLVM からダウンロードしてあります。
# curl -k -o ca.crt "https://lab-ovirt-mgr-01.go-lab.jp/ovirt-engine/services/pki-resource?resource=ca-certificate&format=X509-PEM-CA"
データセンターとクラスタの名前は、どちらも Default です。
ネットワークの名前は、vlan-0011 です。
仮想 NIC プロファイルの名前も、ネットワークと同様にvlan-0011 です。
ストレージ ドメインは、「lab-ovirt-nfs-01」という名前で NFS 共有を登録してあります。
4. OCK イメージ作成 / アップロード
OLVM Provider 用の Oracle Container Host for Kubernetes(OCK)イメージをビルドします。ベースとなるイメージは、下記のあたりで公開されていますが、今回は自動ダウンロードされいます。
https://container-registry.oracle.com/ords/ocr/ba/olcne/ock
下記のように ocne image create を実行すると、自動的に libvirt Provider により「ocne-ephemeral」という名前のクラスタが作成されてイメージがビルドされます。
このクラスタでは、ocne-system Namespace の、ocne-image-builder Pod が自動起動され、ビルド後にその Pod は削除されます。出力の最後には、生成されたイメージ ファイルのパスが表示されています。
[root@lab-ocne-01 ~]# ocne image create --type olvm --arch amd64 INFO[2025-12-07T12:18:12+09:00] Creating Image INFO[2025-12-07T12:18:12+09:00] Preparing pod used to create image INFO[2025-12-07T12:18:17+09:00] Waiting for pod ocne-system/ocne-image-builder to be ready: ok INFO[2025-12-07T12:18:17+09:00] Getting local boot image for architecture: amd64 INFO[2025-12-07T12:18:44+09:00] Uploading boot image to pod ocne-system/ocne-image-builder: ok INFO[2025-12-07T12:19:31+09:00] Downloading boot image from pod ocne-system/ocne-image-builder: ok INFO[2025-12-07T12:19:31+09:00] New boot image was created successfully at /root/.ocne/images/boot.qcow2-1.32-amd64.olvm
ocne-ephemeral クラスタは自動削除されないので、今回はこのまま Cluster API の管理クラスタとして利用します。自動生成された kubeconfig を KUBECONFIG 環境変数に登録して、kubectl で接続できるようにしておきます。
# export KUBECONFIG=$(pwd)/.kube/kubeconfig.ocne-ephemeral.local # kubectl get nodes NAME STATUS ROLES AGE VERSION ocne-ephemeral-control-plane-1 Ready control-plane 24m v1.32.9+1.el8
作成されたイメージを、OLVM のストレージ ドメインにアップロードします。ここからは OLVM への接続が必要なので、次の環境変数を設定しておきます。
- OLVM 4.5 にデフォルトで作成される管理者「admin@ovirt」で接続します。以前のバージョンとは異なり、@internal のかわりに @internalsso を追記します。
- OCNE_OLVM_SCOPE の ovirt-app-api は固定値です。
# export OCNE_OLVM_USERNAME='admin@ovirt@internalsso' # export OCNE_OLVM_PASSWORD='パスワード' # export OCNE_OLVM_SCOPE=ovirt-app-api
生成されたイメージ ファイルを、ocne image upload コマンドで OLVM にアップロードします。olvm-wlc-01.yml は、さきほど作成した YAML ファイルです。
[root@lab-ocne-01 ~]# ocne image upload --type olvm --file $HOME/.ocne/images/boot.qcow2-1.32-amd64.olvm --arch amd64 --config olvm-wlc-01.yml INFO[2025-12-07T12:26:02+09:00] Starting uploaded OCK image `/root/.ocne/images/boot.qcow2-1.32-amd64.olvm` to disk `ock-1.32` in storage domain `lab-ovirt-nfs-01` INFO[2025-12-07T12:26:02+09:00] Waiting for disk status to be OK INFO[2025-12-07T12:26:11+09:00] Waiting for image transfer phase transferring INFO[2025-12-07T12:28:59+09:00] Uploading image /root/.ocne/images/boot.qcow2-1.32-amd64.olvm with 2551644160 bytes to ock-1.32: ok INFO[2025-12-07T12:29:06+09:00] Waiting for image transfer phase finished_success INFO[2025-12-07T12:29:18+09:00] Successfully uploaded OCK image
これで、OS イメージのディスクが OLVM にアップロードされました。
5. OLVM でのテンプレート作成
ここからは、OLVM の Web UI で作業しています。アップロードしたディスクから、仮想マシン → テンプレートを作成します。
5-1. 仮想マシンの作成
「コンピュート」→「仮想マシン」を開きます。
「新規作成」をクリックします。
仮想マシンのパラメーターを入力します。オペレーティング システム:Oracle CNE - OCK x64,名前:ock-1.32、「仮想マシンのディスクイメージ」にある、「アタッチ」をクリックします。
アップロードしたディスクイメージを選択して、「OK」をクリックします。エイリアス:ock-1.32、OS:チェック ボックス ON(ブート)
ディスクイメージが接続されたこと確認して、「OK」をクリックします。
少し待つと、仮想マシンが作成されます。
5-2. テンプレートの作成
テンプレートの名前を入力して、「OK」をクリックします。これは、ocne コマンドに渡す YAML ファイル(今回は olvm-wlc-01.yml)の vmTemplateName と揃えておく必要があります。
- 名前:ock-1.32
6. OLVM Provider ワークロード クラスタの作成
準備ができたので、ocne で OLVM Provider によるワークロード クラスタを作成してみます。しかし、今回は残念ながら失敗してしまいました・・・
[root@lab-ocne-01 ~]# ocne cluster start -c olvm-wlc-01.yml INFO[2025-12-07T16:01:46+09:00] Installing cert-manager into cert-manager: ok INFO[2025-12-07T16:01:47+09:00] Installing core-capi into capi-system: ok INFO[2025-12-07T16:01:47+09:00] Installing olvm-capi into cluster-api-provider-olvm: ok INFO[2025-12-07T16:01:48+09:00] Installing bootstrap-capi into capi-kubeadm-bootstrap-system: ok INFO[2025-12-07T16:01:48+09:00] Installing control-plane-capi into capi-kubeadm-control-plane-system: ok INFO[2025-12-07T16:01:49+09:00] Waiting for Core Cluster API Controllers: ok INFO[2025-12-07T16:01:49+09:00] Waiting for Kubadm Boostrap Cluster API Controllers: ok INFO[2025-12-07T16:01:49+09:00] Waiting for Kubadm Control Plane Cluster API Controllers: ok INFO[2025-12-07T16:01:49+09:00] Waiting for Olvm Cluster API Controllers: ok INFO[2025-12-07T16:01:49+09:00] Applying Cluster API resources INFO[2025-12-07T16:01:50+09:00] Waiting for kubeconfig: ok ERRO[2025-12-07T16:17:22+09:00] Waiting for the Kubernetes cluster to be ready: Timeout waiting for get nodes to succeed ERRO[2025-12-07T16:17:22+09:00] Failed to access Kubernetes cluster: Timeout waiting for get nodes to succeed
失敗したものの、OLVM Provider によるクラスタの様子を見ておこうと思います。
OLVM では、Kubernetes ノードの仮想マシンが作成・自動的に起動されます。今回は仮想マシンが1台だけ作成されていますが、本来はもう1台の仮想マシンが作成されます。
管理クラスタ側では、Kubernetes クラスタにあたる「Cluster」リソースと、OLVM Provider 独自の「OLVMCluster」リソースが作成されています。
[root@lab-ocne-01 ~]# kubectl get cluster -n ocne NAME CLUSTERCLASS PHASE AGE VERSION olvm-wlc-01 Provisioned 15m [root@lab-ocne-01 ~]# kubectl get olvmcluster -n ocne NAME READY DATACENTER AGE olvm-wlc-01 true Default 15m
Kubernetes ノードの仮想マシンにあたる、「Machine」リソースと、「OLVMMachine」リソースが作成されています。今回は失敗しているので、PHASE: Provisioning で止まっており、READY: false になっています。
このように仮想マシンが Kubernetes リソースとして管理されているため、OLVM 側で停止しても自動起動されたりします。
[root@lab-ocne-01 ~]# kubectl get machine -n ocne NAME CLUSTER NODENAME PROVIDERID PHASE AGE VERSION olvm-wlc-01-control-plane-x6qqg olvm-wlc-01 Provisioning 15m v1.32.0 olvm-wlc-01-md-0-jr6bz-4kmbt olvm-wlc-01 Pending [root@lab-ocne-01 ~]# kubectl get olvmmachine -n ocne NAME READY AGE VMIPADDRESS olvm-wlc-01-control-plane-x6qqg false 15m 192.168.11.201 olvm-wlc-01-md-0-jr6bz-4kmbt false 15m 192.168.11.202
管理クラスタでは、「capi-~」という Namespace で Cluster API 関連の Pod が起動されています。そして、OLVM Provider の olvm-capi-controller-manager Pod も起動されています。
[root@lab-ocne-01 ~]# kubectl get pod -A NAMESPACE NAME READY STATUS RESTARTS AGE capi-kubeadm-bootstrap-system bootstrap-capi-controller-manager-68c64fb99-g6jlr 1/1 Running 26 12h capi-kubeadm-control-plane-system control-plane-capi-controller-manager-6859778d4b-shv78 1/1 Running 2 12h capi-system core-capi-controller-manager-6d685cb74d-89xkw 1/1 Running 26 12h cert-manager cert-manager-5fbdbccdfc-pfkjk 1/1 Running 3 12h cert-manager cert-manager-cainjector-5b94f5f5f5-w7bcf 1/1 Running 3 12h cert-manager cert-manager-webhook-6958b58c46-rzf99 1/1 Running 1 12h cluster-api-provider-olvm olvm-capi-controller-manager-75449c665-22qtt 1/1 Running 1 12h kube-flannel kube-flannel-ds-ctwhv 1/1 Running 2 13h kube-system coredns-7cbdbfd99c-7fzv5 1/1 Running 2 13h kube-system coredns-7cbdbfd99c-jrlqr 1/1 Running 2 13h kube-system etcd-ocne-ephemeral-control-plane-1 1/1 Running 6 13h kube-system kube-apiserver-ocne-ephemeral-control-plane-1 1/1 Running 7 13h kube-system kube-controller-manager-ocne-ephemeral-control-plane-1 1/1 Running 36 13h kube-system kube-proxy-b2xdl 1/1 Running 2 13h kube-system kube-scheduler-ocne-ephemeral-control-plane-1 1/1 Running 35 13h
Cluster API 関連の「~.cluster.x-k8s.io」カスタム リソースの定義(CRD)も追加されています。
[root@lab-ocne-01 ~]# kubectl get crd NAME CREATED AT certificaterequests.cert-manager.io 2025-12-06T18:25:53Z certificates.cert-manager.io 2025-12-06T18:25:53Z challenges.acme.cert-manager.io 2025-12-06T18:25:53Z clusterclasses.cluster.x-k8s.io 2025-12-06T18:29:16Z clusterissuers.cert-manager.io 2025-12-06T18:25:53Z clusterresourcesetbindings.addons.cluster.x-k8s.io 2025-12-06T18:29:16Z clusterresourcesets.addons.cluster.x-k8s.io 2025-12-06T18:29:16Z clusters.cluster.x-k8s.io 2025-12-06T18:29:16Z extensionconfigs.runtime.cluster.x-k8s.io 2025-12-06T18:29:16Z gatewayclasses.gateway.networking.k8s.io 2025-12-06T16:49:44Z gateways.gateway.networking.k8s.io 2025-12-06T16:49:44Z grpcroutes.gateway.networking.k8s.io 2025-12-06T16:49:44Z httproutes.gateway.networking.k8s.io 2025-12-06T16:49:44Z ipaddressclaims.ipam.cluster.x-k8s.io 2025-12-06T18:29:16Z ipaddresses.ipam.cluster.x-k8s.io 2025-12-06T18:29:16Z issuers.cert-manager.io 2025-12-06T18:25:53Z kubeadmconfigs.bootstrap.cluster.x-k8s.io 2025-12-06T18:29:23Z kubeadmconfigtemplates.bootstrap.cluster.x-k8s.io 2025-12-06T18:29:23Z kubeadmcontrolplanes.controlplane.cluster.x-k8s.io 2025-12-06T18:29:25Z kubeadmcontrolplanetemplates.controlplane.cluster.x-k8s.io 2025-12-06T18:29:25Z machinedeployments.cluster.x-k8s.io 2025-12-06T18:29:16Z machinedrainrules.cluster.x-k8s.io 2025-12-06T18:29:16Z machinehealthchecks.cluster.x-k8s.io 2025-12-06T18:29:16Z machinepools.cluster.x-k8s.io 2025-12-06T18:29:16Z machines.cluster.x-k8s.io 2025-12-06T18:29:16Z machinesets.cluster.x-k8s.io 2025-12-06T18:29:16Z olvmclusters.infrastructure.cluster.x-k8s.io 2025-12-06T18:29:21Z olvmclustertemplates.infrastructure.cluster.x-k8s.io 2025-12-06T18:29:21Z olvmmachines.infrastructure.cluster.x-k8s.io 2025-12-06T18:29:21Z olvmmachinetemplates.infrastructure.cluster.x-k8s.io 2025-12-06T18:29:21Z orders.acme.cert-manager.io 2025-12-06T18:25:53Z referencegrants.gateway.networking.k8s.io 2025-12-06T16:49:44Z
おまけ:ocne での Kubernetes クラスタ削除
失敗したワークロード クラスタを OLVM と管理クラスタから削除しておきます。
[root@lab-ocne-01 ~]# ocne cluster delete -c olvm-wlc-01.yml INFO[2025-12-07T16:00:48+09:00] Installing cert-manager into cert-manager: ok INFO[2025-12-07T16:00:49+09:00] Installing core-capi into capi-system: ok INFO[2025-12-07T16:00:49+09:00] Installing olvm-capi into cluster-api-provider-olvm: ok INFO[2025-12-07T16:00:50+09:00] Installing bootstrap-capi into capi-kubeadm-bootstrap-system: ok INFO[2025-12-07T16:00:50+09:00] Installing control-plane-capi into capi-kubeadm-control-plane-system: ok INFO[2025-12-07T16:00:51+09:00] Waiting for Core Cluster API Controllers: ok INFO[2025-12-07T16:00:51+09:00] Waiting for Kubadm Boostrap Cluster API Controllers: ok INFO[2025-12-07T16:00:51+09:00] Waiting for Kubadm Control Plane Cluster API Controllers: ok INFO[2025-12-07T16:00:51+09:00] Waiting for Olvm Cluster API Controllers: ok INFO[2025-12-07T16:00:51+09:00] Deleting Cluster ocne/olvm-wlc-01 INFO[2025-12-07T16:01:05+09:00] Waiting for deletion: ok
そして、管理クラスタは下記のように削除します。
# ocne cluster delete -C ocne-ephemeral
以上、OLVM Provider で OCNE の Kubernetes を構築してみる話でした。
明日の JPOUG Advent Calendar 2025 は がきさん さんです。
よろしくお願いします。
0 件のコメント:
コメントを投稿