2024年12月7日土曜日

Oracle Linux 9 で Oracle Cloud Native Environment 2.0 の Kubernetes を構築してみる。

JPOUG Advent Calendar 2024 の 7日目の投稿です。
6日目は s4r_agent さんの クラウド・シェルでJava21を使いたい(csruntimectlを調べる) でした。

今日は、Oracle Linux 9.5 で Oracle Cloud Native Environment 2.0 の Kubernetes クラスタを構築してみます。そしてついでに、OCNE Application として KubeVirt をインストールしてみます。

ドキュメントでは、下記のあたりが参考になります。

Oracle Cloud Native Environment


今回の環境

Oracle Linux 9.5 の KVM ホストに、OCNE の Kubernetes クラスタを作成します。

マシンのリソースは、次のとおりです。

  • CPU:2コア
  • メモリ:8GB
  • ディスク:30GB

今回の、Oracle Linux です。

[root@lab-ol9-kvm-01 ~]# cat /etc/oracle-release
Oracle Linux Server release 9.5
[root@lab-ol9-kvm-01 ~]# uname -a
Linux lab-ol9-kvm-01 5.15.0-302.167.6.1.el9uek.x86_64 #2 SMP Thu Nov 21 21:48:29 PST 2024 x86_64 x86_64 x86_64 GNU/Linux



今回の内容のイメージ図です。



1. 事前準備 / KVM ホストの構築

まず、Oracle Linux 9.5 に KVM をインストールしておきます。

ol9_kvm_utils の Yum リポジトリを有効化して、「Virtualization Host」グループをインストールします。

[root@lab-ol9-kvm-01 ~]# dnf config-manager --enable ol9_kvm_utils
[root@lab-ol9-kvm-01 ~]# dnf group install "Virtualization Host" -y


Systemd の Unit を有効化しておきます。

for n in qemu network nodedev nwfilter secret storage interface proxy   
do
  systemctl enable virt${n}d.service
  systemctl enable virt${n}d{,-ro,-admin}.socket
done


OS を再起動しておきます。

[root@lab-ol9-kvm-01 ~]# reboot


KVM が利用可能になったことを確認しておきます。(枠からあふれた表示は、とりあえずそのまま・・・)

[root@lab-ol9-kvm-01 ~]# LANG=C virt-host-validate qemu
  QEMU: Checking for hardware virtualization                                 : PASS
  QEMU: Checking if device /dev/kvm exists                                   : PASS
  QEMU: Checking if device /dev/kvm is accessible                            : PASS
  QEMU: Checking if device /dev/vhost-net exists                             : PASS
  QEMU: Checking if device /dev/net/tun exists                               : PASS
  QEMU: Checking for cgroup 'cpu' controller support                         : PASS
  QEMU: Checking for cgroup 'cpuacct' controller support                     : PASS
  QEMU: Checking for cgroup 'cpuset' controller support                      : PASS
  QEMU: Checking for cgroup 'memory' controller support                      : PASS
  QEMU: Checking for cgroup 'devices' controller support                     : PASS
  QEMU: Checking for cgroup 'blkio' controller support                       : PASS
  QEMU: Checking for device assignment IOMMU support                         : WARN (No ACPI DMAR table found, IOMMU either disabled in BIOS or not supported by this hardware platform)
  QEMU: Checking for secure guest support                                    : WARN (Unknown if this platform has Secure Guest support)


2. Oracle Cloud Native Environment 2.0 のインストール

OCNE(OLCNE)では、1.9 までは Kubernetes のプロビジョニングなどで、olcnectl コマンドを使用していました。しかし Kubernetes をインストールする Oracle Linux は、事前に用意していました。

2.0 からは ocne コマンドが提供されて、libvirt を使用して、Kubernetes クラスタを作成する前段の、KVM 上の仮想マシンもプロビジョニング対象になりました。そこで今回は、ocne コマンドで Kubernetes クラスタを作成してみます。

まずは、olcne の RPM をインストールします。
OCNE の .repo ファイルをインストールして、Yum リポジトリを有効化します。

[root@lab-ol9-kvm-01 ~]# dnf install oracle-ocne-release-el9 -y
[root@lab-ol9-kvm-01 ~]# dnf config-manager --enable ol9_ocne
[root@lab-ol9-kvm-01 ~]# dnf list --repo ol9_ocne --available メタデータの期限切れの最終確認: 0:00:13 前の 2024年12月07日 15時01分51秒 に実施しました。 利用可能なパッケージ kubectl.x86_64 1.30.3-1.el9 ol9_ocne kubernetes.src 1.30.3-1.el9 ol9_ocne ocne.src 2.0.4-2.el9 ol9_ocne ocne.x86_64 2.0.4-2.el9 ol9_ocne


ocne と kubectl をインストールします。

[root@lab-ol9-kvm-01 ~]# dnf install ocne kubectl -y


3. Kubernetes クラスタの作成(ocne cluster start)

ocne コマンドで、Kubernetes クラスタを作成します。下記のコマンドを実行すると、Kubernetes ノードの仮想マシン イメージ(2.3GB 程度)が自動的にダウロードされて、1ノードの Kubernetes クラスタが作成されます。

[root@lab-ol9-kvm-01 ~]# ocne cluster start


しばらく待つと Kubernetes クラスタが起動されて、下記のように kubeconfig ファイルのパスなどが表示されます。

INFO[2024-12-07T16:58:49+09:00] Installing flannel into kube-flannel: waiting   INFO[2024-12-07T16:58:51+09:00] Installing flannel into kube-flannel: waiting.. INFO[2024-12-07T16:58:51+09:00] Installing flannel into kube-flannel: waiting . INFO[2024-12-07T16:58:52+09:00] Installing flannel into kube-flannel: waiting   INFO[2024-12-07T16:58:54+09:00] Installing flannel into kube-flannel: waiting.. INFO[2024-12-07T16:58:54+09:00] Installing flannel into kube-flannel: waiting . INFO[2024-12-07T16:58:55+09:00] Installing flannel into kube-flannel: ok
INFO[2024-12-07T16:58:55+09:00] Installing ui into ocne-system: waiting
INFO[2024-12-07T16:59:07+09:00] Installing ui into ocne-system: ok
INFO[2024-12-07T16:59:07+09:00] Installing ocne-catalog into ocne-system: waitinINFO[2024-12-07T16:59:07+09:00] Installing ocne-catalog into ocne-system: waitinINFO[2024-12-07T16:59:08+09:00] Installing ocne-catalog into ocne-system: waitinINFO[2024-12-07T16:59:08+09:00] Installing ocne-catalog into ocne-system: ok
INFO[2024-12-07T16:59:08+09:00] Kubernetes cluster was created successfully
INFO[2024-12-07T17:01:40+09:00] Waiting for the UI to be ready: ok

Run the following command to create an authentication token to access the UI:
    KUBECONFIG='/root/.kube/kubeconfig.ocne.local' kubectl create token ui -n ocne-system
Browser window opened, enter 'y' when ready to exit: y ★yを入力してEnter。

INFO[2024-12-07T17:02:28+09:00] Post install information:

To access the cluster from the VM host:
    copy /root/.kube/kubeconfig.ocne.vm to that host and run kubectl there
To access the cluster from this system:
    use /root/.kube/kubeconfig.ocne.local
To access the UI, first do kubectl port-forward to allow the browser to access the UI.
Run the following command, then access the UI from the browser using via https://localhost:8443
    kubectl port-forward -n ocne-system service/ui 8443:443
Run the following command to create an authentication token to access the UI:
    kubectl create token ui -n ocne-system
[root@lab-ol9-kvm-01 ~]#


自動生成された kubeconfig ファイルを環境変数に設定して、kubectl get nodes を実行すると、1ノードの Kubernetes クラスタが Ready になっています。

[root@lab-ol9-kvm-01 ~]# export KUBECONFIG='/root/.kube/kubeconfig.ocne.local'
[root@lab-ol9-kvm-01 ~]# kubectl get nodes
NAME                   STATUS   ROLES           AGE     VERSION
ocne-control-plane-1   Ready    control-plane   7m43s   v1.30.3+1.el8


この Kubernetes ノードは、KVM の仮想マシンです。

[root@lab-ol9-kvm-01 ~]# virsh list
 Id   名前                   状態
-------------------------------------
 1    ocne-control-plane-1   実行中


下記のように Pod が起動されています。じつは Web UI(ui-~ Pod)も起動されていますが、今回は気にせず進みます。

[root@lab-ol9-kvm-01 ~]# kubectl get pod -A
NAMESPACE      NAME                                           READY   STATUS    RESTARTS        AGE
kube-flannel   kube-flannel-ds-msfwt                          1/1     Running   1 (6m10s ago)   6m58s
kube-system    coredns-f7d444b54-bd5hs                        1/1     Running   0               6m57s
kube-system    coredns-f7d444b54-hp4zr                        1/1     Running   0               6m57s
kube-system    etcd-ocne-control-plane-1                      1/1     Running   0               8m28s
kube-system    kube-apiserver-ocne-control-plane-1            1/1     Running   0               8m28s
kube-system    kube-controller-manager-ocne-control-plane-1   1/1     Running   3 (3m53s ago)   8m28s
kube-system    kube-proxy-qsj8h                               1/1     Running   0               6m58s
kube-system    kube-scheduler-ocne-control-plane-1            1/1     Running   3 (3m5s ago)    8m28s
ocne-system    ocne-catalog-578c959566-7bg84                  1/1     Running   0               6m57s
ocne-system    ui-84dd57ff69-5vlmt                            1/1     Running   0               6m57s


4. OCNE Application のインストール(KubeVirt)

ocne コマンドで、Kubernetes クラスタに Application をインストールしてみます。Application の実態は Helm Chart のようです。

カタログに登録されている Application の一覧です。

[root@lab-ol9-kvm-01 ~]# ocne catalog search
APPLICATION                     VERSION
bootstrap-capi                  1.7.1
cert-manager                    1.9.1
cert-manager                    1.14.5
cert-manager-webhook-oci        1.1.0
control-plane-capi              1.7.1
core-capi                       1.7.1
dex                             2.39.1
externalip-webhook              1.0.0
flannel                         0.22.3
fluent-operator                 3.2.0
fluentd                         1.14.5
grafana                         7.5.17
ingress-nginx                   1.9.6
istio-base                      1.19.9
istio-base                      1.20.5
istio-egress                    1.20.5
istio-egress                    1.19.9
istio-ingress                   1.20.5
istio-ingress                   1.19.9
istiod                          1.20.5
istiod                          1.19.9
kube-prometheus-stack           45.25.0
kube-state-metrics              2.8.2
kubevirt                        0.58.0
kubevirt                        1.1.1
kubevirt                        1.0.1
kubevirt                        0.59.0
metallb                         0.13.10
metallb                         0.12.1
multus                          4.0.2
oci-capi                        0.15.0
oci-ccm                         1.27.2
oci-ccm                         1.28.0
ocne-catalog                    2.0.0
prometheus                      2.31.1
prometheus-adapter              0.10.0
prometheus-node-exporter        1.6.1
rook                            1.12.3
rook                            1.11.6
rook                            1.10.9
tigera-operator                 1.29.3
tigera-operator                 1.32.4
ui                              2.0.0


OCNE では、下記のような Web UI でも Application をインストールできます。


しかし今回は、ocne CLI から kubevirt 1.1.1 をインストールしてみます。

[root@lab-ol9-kvm-01 ~]# kubectl create ns kubevirt
namespace/kubevirt created
[root@lab-ol9-kvm-01 ~]# ocne application install -N kubevirt -r kubevirt -v 1.1.1 -n kubevirt
INFO[2024-12-07T17:10:27+09:00] Application installed successfully


OCNE の Application として、kubevirt がインストールされました。

[root@lab-ol9-kvm-01 ~]# ocne application list
Releases
NAME    NAMESPACE       CHART   STATUS  REVISION        APPVERSION
[root@lab-ol9-kvm-01 ~]# ocne application list -A
Releases
NAME            NAMESPACE       CHART           STATUS          REVISION        APPVERSION
flannel         kube-flannel    flannel         deployed        1               0.22.3
kubevirt        kubevirt        kubevirt        deployed        1               1.1.1
ocne-catalog    ocne-system     ocne-catalog    deployed        1               2.0.0
ui              ocne-system     ui              deployed        1               2.0.0


カスタム リソースが追加され、Kubernetes で VirtualMachine などが作成できるようになりました。

[root@lab-ol9-kvm-01 ~]# kubectl api-resources | grep kubevirt
virtualmachineclones                 vmclone,vmclones                                          clone.kubevirt.io/v1alpha1         true         VirtualMachineClone
virtualmachineexports                vmexport,vmexports                                        export.kubevirt.io/v1alpha1        true         VirtualMachineExport
virtualmachineclusterinstancetypes   vmclusterinstancetype,vmclusterinstancetypes,vmcf,vmcfs   instancetype.kubevirt.io/v1beta1   false        VirtualMachineClusterInstancetype
virtualmachineclusterpreferences     vmcp,vmcps                                                instancetype.kubevirt.io/v1beta1   false        VirtualMachineClusterPreference
virtualmachineinstancetypes          vminstancetype,vminstancetypes,vmf,vmfs                   instancetype.kubevirt.io/v1beta1   true         VirtualMachineInstancetype
virtualmachinepreferences            vmpref,vmprefs,vmp,vmps                                   instancetype.kubevirt.io/v1beta1   true         VirtualMachinePreference
kubevirts                            kv,kvs                                                    kubevirt.io/v1                     true         KubeVirt
virtualmachineinstancemigrations     vmim,vmims                                                kubevirt.io/v1                     true         VirtualMachineInstanceMigration
virtualmachineinstancepresets        vmipreset,vmipresets                                      kubevirt.io/v1                     true         VirtualMachineInstancePreset
virtualmachineinstancereplicasets    vmirs,vmirss                                              kubevirt.io/v1                     true         VirtualMachineInstanceReplicaSet
virtualmachineinstances              vmi,vmis                                                  kubevirt.io/v1                     true         VirtualMachineInstance
virtualmachines                      vm,vms                                                    kubevirt.io/v1                     true         VirtualMachine
migrationpolicies                                                                              migrations.kubevirt.io/v1alpha1    false        MigrationPolicy
virtualmachinepools                  vmpool,vmpools                                            pool.kubevirt.io/v1alpha1          true         VirtualMachinePool
virtualmachinerestores               vmrestore,vmrestores                                      snapshot.kubevirt.io/v1alpha1      true         VirtualMachineRestore
virtualmachinesnapshotcontents       vmsnapshotcontent,vmsnapshotcontents                      snapshot.kubevirt.io/v1alpha1      true         VirtualMachineSnapshotContent
virtualmachinesnapshots              vmsnapshot,vmsnapshots                                    snapshot.kubevirt.io/v1alpha1      true         VirtualMachineSnapshot


KubeVirt 関連の Pod が起動されたことを確認しておきます。

[root@lab-ol9-kvm-01 ~]# kubectl get all -n kubevirt
Warning: kubevirt.io/v1 VirtualMachineInstancePresets is now deprecated and will be removed in v2.
NAME                                   READY   STATUS    RESTARTS   AGE
pod/virt-api-5d77f885dc-6cwjj          1/1     Running   0          4m16s
pod/virt-controller-77b8465986-c9grl   1/1     Running   0          3m40s
pod/virt-controller-77b8465986-rhfxx   1/1     Running   0          3m40s
pod/virt-handler-tctdm                 1/1     Running   0          3m40s
pod/virt-operator-6f97b58c97-cjjnz     1/1     Running   0          5m43s
pod/virt-operator-6f97b58c97-n2wsc     1/1     Running   0          5m43s

NAME                                  TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
service/kubevirt-operator-webhook     ClusterIP   10.101.188.143   <none>        443/TCP   4m19s
service/kubevirt-prometheus-metrics   ClusterIP   None             <none>        443/TCP   4m20s
service/virt-api                      ClusterIP   10.106.42.10     <none>        443/TCP   4m19s
service/virt-exportproxy              ClusterIP   10.98.84.124     <none>        443/TCP   4m19s

NAME                          DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
daemonset.apps/virt-handler   1         1         1       1            1           kubernetes.io/os=linux   3m40s

NAME                              READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/virt-api          1/1     1            1           4m16s
deployment.apps/virt-controller   2/2     2            2           3m41s
deployment.apps/virt-operator     2/2     2            2           5m43s

NAME                                         DESIRED   CURRENT   READY   AGE
replicaset.apps/virt-api-5d77f885dc          1         1         1       4m16s
replicaset.apps/virt-controller-77b8465986   2         2         2       3m40s
replicaset.apps/virt-operator-6f97b58c97     2         2         2       5m43s

NAME                            AGE     PHASE
kubevirt.kubevirt.io/kubevirt   5m43s   Deployed


KubeVirt で、仮想マシンを作成してみます。今回は、下記のような YAML ファイル(vm01-ol95.yml)を用意しました。

[root@lab-ol9-kvm-01 ~]# cat vm01-ol95.yml
---
apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:
  name: vm01
  labels:
    kubevirt.io/vm: vm01
spec:
  runStrategy: Always
  template:
    metadata:
      labels:
        kubevirt.io/vm: vm01
    spec:
      domain:
        devices:
          disks:
          - disk:
              bus: virtio
            name: containerdisk
          - disk:
              bus: virtio
            name: cloudinitdisk
        resources:
          requests:
            memory: 512M
      terminationGracePeriodSeconds: 0
      volumes:
      - name: containerdisk
        containerDisk:
          image: ghcr.io/gowatana/kubevirt-oraclelinux:9.5
      - name: cloudinitdisk
        cloudInitNoCloud:
          userDataBase64: |
            I2Nsb3VkLWNvbmZpZwp1c2VyczoKICAtIG5hbWU6IHNjb3R0CiAgICBzaGVsbDogL2Jpbi9iYXNo
            CiAgICBzdWRvOiBBTEw9KEFMTCkgTk9QQVNTV0Q6QUxMCmNocGFzc3dkOgogICAgbGlzdDogfAog
            ICAgICBzY290dDp0aWdlcgogICAgZXhwaXJlOiBmYWxzZQpzc2hfcHdhdXRoOiB5ZXMKCndyaXRl
            X2ZpbGVzOgogIC0gcGF0aDogL2V0Yy9tb3RkCiAgICBjb250ZW50OiB8CiAgICAgIH4gICAqCiAg
            ICAgICAgIHh4eAogICAgICAgIHh4eHh4CiAgICAgICB4eHh4eHh4ICBKUE9VRyBBZHZlbnQgQ2Fs
            ZW5kYXIgMjAyNAogICAgICBfXyAgbCAgX18gaHR0cHM6Ly9hZHZlbnRhci5vcmcvY2FsZW5kYXJz
            LzEwMjU4CiAgICBhcHBlbmQ6IGZhbHNlCiAgICBwZXJtaXNzaW9uczogJzA2NDQnCg==


そして、Oracle Linux 9.5 の Cloud Image を、GitHub のコンテナ レジストリにアップロードしてあります。


Kubernetes に、VirtualMachine リソースの YAML を適用します。

[root@lab-ol9-kvm-01 ~]# kubectl apply -f vm01-ol95.yml
virtualmachine.kubevirt.io/vm01 created


VirtualMachine(vm)と VirtualMachineInstance(vmi)が作成されました。

[root@lab-ol9-kvm-01 ~]# kubectl get vm
NAME   AGE   STATUS    READY
vm01   12m   Running   True
[root@lab-ol9-kvm-01 ~]# kubectl get vmi
NAME   AGE   PHASE     IP            NODENAME               READY
vm01   12m   Running   10.244.0.18   ocne-control-plane-1   True


ここからは、KubeVirt の CLI である、virtctl を使用します。OCNE 2.0 のリポジトリには virtctl がないので、OCNE 1.9 のリポジトリにある RPM をインストールしておきます。

[root@lab-ol9-kvm-01 ~]# dnf install https://yum.oracle.com/repo/OracleLinux/OL9/olcne19/x86_64/getPackage/virtctl-1.1.1-1.el9.x86_64.rpm -y


5分くらい待ってから、SSH で接続してみます。virtctl で、VirtualMachineInstance に SSH 接続するためのサービスを作成します。

[root@lab-ol9-kvm-01 ~]# virtctl expose vmi vm01 --port=22 --name=vm01-ssh --type=NodePort
Service vm01-ssh successfully exposed for vmi vm01
[root@lab-ol9-kvm-01 ~]# kubectl get service vm01-ssh
NAME       TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
vm01-ssh   NodePort   10.101.171.243   <none>        22:31132/TCP   10s


NodePort で接続するので、Kubernetes ノードの IP アドレスを確認しておきます。

[root@lab-ol9-kvm-01 ~]# kubectl get nodes -o wide
NAME                   STATUS   ROLES           AGE    VERSION         INTERNAL-IP       EXTERNAL-IP   OS-IMAGE                   KERNEL-VERSION                     CONTAINER-RUNTIME
ocne-control-plane-1   Ready    control-plane   140m   v1.30.3+1.el8   192.168.122.253   <none>        Oracle Linux Server 8.10   5.15.0-302.167.6.1.el8uek.x86_64   cri-o://1.30.3


そして、Kubernetes ノードに NodePort で設定されたポート宛に接続すると、Cloud-Init で指定しておいた OS ユーザーで、仮想マシンのゲスト OS にログインできます。仮想マシンの内部では、VirtualMachineInstance の IP アドレスが設定されていることがわかります。


ocne cluster console コマンドで、Kubernetes ノードの仮想マシンに直接ログインすると、Oracle Linux 8.5 が利用されていることがわかります。そしてここからであれば VirtualMachineInstance の 実際の IP アドレスに SSH できます。

[root@lab-ol9-kvm-01 ~]# ocne cluster console --node ocne-control-plane-1
sh-4.4#
sh-4.4#
sh-4.4# cat /etc/oracle-release
Oracle Linux Server release 8.10
sh-4.4#
sh-4.4#
sh-4.4# ssh scott@10.244.0.18
The authenticity of host '10.244.0.18 (10.244.0.18)' can't be established.
ECDSA key fingerprint is SHA256:6s2Tsk1gurLBbIZEz8j8miGbeCQs7LuyDrrUQFlxxKw.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.244.0.18' (ECDSA) to the list of known hosts.
scott@10.244.0.18's password:
~   *
   xxx
  xxxxx
 xxxxxxx  JPOUG Advent Calendar 2024
__  l  __ https://adventar.org/calendars/10258
Last login: Sat Dec  7 10:28:03 2024 from 10.244.0.1
[scott@vm01 ~]$


以上、Oracle Linux に最近の OCNE で Kubernetes を構築してみる話でした。

明日の JPOUG Advent Calendar 2024 は asahide さんです。
よろしくお願いします。

0 件のコメント:

コメントを投稿