2025年12月7日日曜日

WIP: Oracle Linux Virtualization Manager Provider で Oracle Cloud Native Environment 2.2 の Kubernetes を構築してみる。

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


OCNE のカタログにもありましたが、今回は CLI 操作の流れでインストールされます。




今回の環境

OCNE では Cluster API という「Kubernetes クラスタ&ノードを Kubernetes で管理する」手法をとっており、クラスタやノードの展開先にあわせた「Provider」を使用します。
そこで、Oracle Linux Virtualization Manager を展開先にする場合には、Oracle Linux Virtualization Manager Provider(OLVM Provider)を使用します。

Cluster API では、管理クラスタとワークロード クラスタという、2種類の Kubernetes クラスタが登場します。
  • 管理クラスタ: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 を用意してあります。今回は次のような手順ですすめます。
    1. OCNE をインストール
    2. スタンドアロンの Oracle Linux KVM を構築
    3. OLVM Provider 実行準備(YAML ファイル作成)
    4. OS ディスク イメージの作成、アップロード(管理クラスタ用 Kubernetesも作成)
    5. (OLVM 側で)ディスク イメージから仮想マシン テンプレートを作成
    6. ワークロード クラスタを作成

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


下記のように、ocne コマンドでも、「ocne」というクラスタが作成されていることを確認できます。
[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


テンプレート作成の処理が完了する(仮想マシンのステータスが Down に戻る)まで、しばらく待ちます。

「コンピュート」→「テンプレート」を開きます。


テンプレートが作成され、ステータスが「OK」になっていることを確認しておきます。



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 件のコメント:

コメントを投稿