Nutanix Kubernetes Platform(NKP)の nkp コマンドによる Management Cluster 作成を、一般ユーザー(非 root の)で実行する準備をしてみます。
今回の内容です。
- 今回の環境
- 1. 一般ユーザーの作成
- 2. kubectl のインストール
- 3. nkp コマンドのインストール
- 4. nkp create cluster --dry-run コマンドの実行(と失敗の様子)
- 5. rootless Podman の設定
- 6. nkp create cluster コマンドの実行(rootless モード)
今回の環境
下記の投稿で Podman をインストールした RHEL 8 の仮想マシンを、そのまま利用します。
Podman はインストールしてあります。
[root@lab-nkp-01 ~]# podman version Client: Podman Engine Version: 4.9.4-rhel API Version: 4.9.4-rhel Go Version: go1.21.7 (Red Hat 1.21.7-2.module+el8.10.0+21638+b01be198) Built: Thu Aug 8 07:24:42 2024 OS/Arch: linux/amd64
まだ、Podman の cgroupVersion は v1 です。
[root@lab-nkp-01 ~]# podman info | grep -e rootless -e cgroupVersion cgroupVersion: v1 rootless: false
1. 一般ユーザーの作成
Linux の一般ユーザーを作成します。
[root@lab-nkp-01 ~]# useradd -m gowatana
パスワードを設定します。
[root@lab-nkp-01 ~]# passwd gowatana ユーザー gowatana のパスワードを変更。 新しいパスワード: 新しいパスワードを再入力してください: passwd: すべての認証トークンが正しく更新できました。
作成したユーザー(gowatana)でログインします。
[root@lab-nkp-01 ~]# su - gowatana [gowatana@lab-nkp-01 ~]$
このユーザーで nkp コマンドを利用できるようにします。
[gowatana@lab-nkp-01 ~]$ id uid=1000(gowatana) gid=1000(gowatana) groups=1000(gowatana) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
実行ファイルを配置するディレクトリを作成しておきます。
[gowatana@lab-nkp-01 ~]$ mkdir $HOME/bin
SSH キー ペアのファイルを生成しておきます。
[gowatana@lab-nkp-01 ~]$ ssh-keygen -t rsa -f $HOME/.ssh/id_rsa -P '' [gowatana@lab-nkp-01 ~]$ ls -l $HOME/.ssh/id_rsa* -rw-------. 1 gowatana gowatana 2610 9月 19 10:17 /home/gowatana/.ssh/id_rsa -rw-r--r--. 1 gowatana gowatana 573 9月 19 10:17 /home/gowatana/.ssh/id_rsa.pub
2. kubectl のインストール
kubectl は、NKP 2.12 で作成される Kubernetes クラスタの同バージョン(v1.29.6)をインストールしておきます。
[gowatana@lab-nkp-01 ~]$ curl -Ls -o $HOME/bin/kubectl https://dl.k8s.io/release/v1.29.6/bin/linux/amd64/kubectl
kubectl には実行権限が付与されていないので、chmod で設定します。
[gowatana@lab-nkp-01 ~]$ chmod +x $HOME/bin/kubectl
これで、kubectl が実行できるようになりました。
[gowatana@lab-nkp-01 ~]$ kubectl version --client Client Version: v1.29.6 Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
3. nkp コマンドのインストール
Nutanix Support & Insight Portal から、下記のファイルをダウンロードして Linux マシンに配置しておきます。
- nkp_v2.12.0_linux_amd64.tar.gz
[gowatana@lab-nkp-01 ~]$ ls -l 合計 88148 drwxrwxr-x. 2 gowatana gowatana 21 9月 19 10:11 bin -rw-r--r--. 1 gowatana gowatana 90262087 9月 19 10:12 nkp_v2.12.0_linux_amd64.tar.gz
tar.gz ファイルから nkp ファイルを展開して、$HOME/bin 配下に保存します。
[gowatana@lab-nkp-01 ~]$ tar zxvf nkp_v2.12.0_linux_amd64.tar.gz -C $HOME/bin nkp [gowatana@lab-nkp-01 ~]$ ls -l $HOME/bin/nkp -rwxr-xr-x. 1 gowatana gowatana 93982872 8月 28 02:57 /home/gowatana/bin/nkp
RHEL 8 では、デフォルトで $HOME/bin ディレクトリが PATH 環境変数に含まれているので、nkp コマンドが実行可能になります。
[gowatana@lab-nkp-01 ~]$ nkp version diagnose: v0.10.1 imagebuilder: v0.13.1 kommander: v2.12.0 konvoy: v2.12.0 mindthegap: v1.13.1 nkp: v2.12.0
4. nkp create cluster --dry-run コマンドの実行(と失敗の様子)
nkp コマンドでクラスタを作成する準備として、Prism Centarl のログイン情報を環境変数を設定しておきます。
export NUTANIX_USER=admin export NUTANIX_PASSWORD='パスワード'
以前の 投稿 で Management Cluster を作成した nkp コマンドを、「--dry-run」オプションで実行してみます。
nkp create cluster nutanix \ --endpoint=https://lab-nxpc-01.go-lab.jp:9440 \ --insecure \ --control-plane-prism-element-cluster=lab-nxce-02 \ --worker-prism-element-cluster=lab-nxce-02 \ --control-plane-subnets=nw-vlan-12 \ --worker-subnets=nw-vlan-12 \ --cluster-name=nkpm01 \ --control-plane-endpoint-ip=192.168.12.200 \ --control-plane-vm-image=nkp-rocky-9.4-release-1.29.6-20240816215147.qcow2 \ --worker-vm-image=nkp-rocky-9.4-release-1.29.6-20240816215147.qcow2 \ --kubernetes-service-load-balancer-ip-range=192.168.12.201-192.168.12.204 \ --kubernetes-pod-network-cidr=172.16.0.0/16 \ --kubernetes-service-cidr=10.96.0.0/12 \ --csi-hypervisor-attached-volumes=true \ --csi-storage-container=default-container-88443613598780 \ --ssh-public-key-file=/home/gowatana/.ssh/id_rsa.pub \ --self-managed \ --control-plane-replicas=1 \ --control-plane-vcpus=4 \ --control-plane-memory=8 \ --worker-replicas=2 \ --worker-vcpus=4 \ --worker-memory=6 \ --dry-run
このコマンドを実行すると、rootless Podman の準備が不足しているため以下のように失敗します。
[gowatana@lab-nkp-01 ~]$ nkp create cluster nutanix \ > --endpoint=https://lab-nxpc-01.go-lab.jp:9440 \ > --insecure \ > --control-plane-prism-element-cluster=lab-nxce-02 \ > --worker-prism-element-cluster=lab-nxce-02 \ > --control-plane-subnets=nw-vlan-12 \ > --worker-subnets=nw-vlan-12 \ > --cluster-name=nkpm01 \ > --control-plane-endpoint-ip=192.168.12.200 \ > --control-plane-vm-image=nkp-rocky-9.4-release-1.29.6-20240816215147.qcow2 \ > --worker-vm-image=nkp-rocky-9.4-release-1.29.6-20240816215147.qcow2 \ > --kubernetes-service-load-balancer-ip-range=192.168.12.201-192.168.12.204 \ > --kubernetes-pod-network-cidr=172.16.0.0/16 \ > --kubernetes-service-cidr=10.96.0.0/12 \ > --csi-hypervisor-attached-volumes=true \ > --csi-storage-container=default-container-88443613598780 \ > --ssh-public-key-file=/home/gowatana/.ssh/id_rsa.pub \ > --self-managed \ > --control-plane-replicas=1 \ > --control-plane-vcpus=4 \ > --control-plane-memory=8 \ > --worker-replicas=2 \ > --worker-vcpus=4 \ > --worker-memory=6 \ > --dry-run ✗ Creating a bootstrap cluster error creating a bootstrap cluster: failed to create bootstrap cluster: running kind with rootless provider requires cgroup v2, see https://kind.sigs.k8s.io/docs/user/rootless/
エラーの内容は、nkp が内部で利用している kind が rootless モードで実行できていなそうなものです。
error creating a bootstrap cluster: failed to create bootstrap cluster: running kind with rootless provider requires cgroup v2, see https://kind.sigs.k8s.io/docs/user/rootless/
5. rootless Podman の設定
エラー メッセージで案内されていた kind のページを参考に、rootless Podman を実行できるように設定します。
ここからは、root ユーザーで作業します。
5-1. GRUB の設定変更
GRUB のコマンド ラインに、「systemd.unified_cgroup_hierarchy=1」を追記します。
デフォルトのコマンド ラインです。
[root@lab-nkp-01 ~]# grep GRUB_CMDLINE_LINUX /etc/default/grub GRUB_CMDLINE_LINUX="crashkernel=auto resume=/dev/mapper/rhel-swap rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rhgb quiet"
vi などのエディタで、ファイルを編集します。
[root@lab-nkp-01 ~]# vi /etc/default/grub
下記のように、GRUB_CMDLINE_LINUX の末尾に「systemd.unified_cgroup_hierarchy=1」を追記しました。
[root@lab-nkp-01 ~]# grep GRUB_CMDLINE_LINUX /etc/default/grub GRUB_CMDLINE_LINUX="crashkernel=auto resume=/dev/mapper/rhel-swap rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rhgb quiet systemd.unified_cgroup_hierarchy=1"
/boot/grub2/grub.cfg ファイルを再生します。
[root@lab-nkp-01 ~]# grub2-mkconfig -o /boot/grub2/grub.cfg Generating grub configuration file ... Adding boot menu entry for EFI firmware configuration done
5-2. systemd unit ファイルの作成
今回使用するユーザーの ID(uid)を確認します。
[root@lab-nkp-01 ~]# id gowatana uid=1000(gowatana) gid=1000(gowatana) groups=1000(gowatana)
ディレクトリを作成します。
[root@lab-nkp-01 ~]# mkdir -p /etc/systemd/system/user@.service.d
下記のコマンドを実行して、Unit のドロップ イン ファイルを作成します。
cat << EOF > /etc/systemd/system/user@.service.d/delegate.conf [Service] Delegate=yes DelegateControllers=cpu cpuset io memory pids EOF
作成されたファイルを確認します。
[root@lab-nkp-01 ~]# cat /etc/systemd/system/user@.service.d/delegate.conf [Service] Delegate=yes DelegateControllers=cpu cpuset io memory pids
もうひとつ、slice の Unit ファイルを作成します。今回のユーザーの uid は 1000 なので、ファイル名は下記になります。
- /etc/systemd/system/user-1000.slice
cat << EOF > /etc/systemd/system/user-1000.slice [Unit] Description=Fix cgroup controllers After=user.slice Requires=user.slice Before=systemd-logind.service [Install] WantedBy=multi-user.target EOF
作成したファイルを確認しておきます。
[root@lab-nkp-01 ~]# cat /etc/systemd/system/user-1000.slice [Unit] Description=Fix cgroup controllers After=user.slice Requires=user.slice Before=systemd-logind.service [Install] WantedBy=multi-user.target
作成した slice を有効化します。
[root@lab-nkp-01 ~]# systemctl enable user-1000.slice Created symlink /etc/systemd/system/multi-user.target.wants/user-1000.slice → /etc/systemd/system/user-1000.slice.
5-3. 設定の反映
systemd のデーモンをリロードしておきます。※このあとすぐOS再起動しますが・・・
[root@lab-nkp-01 ~]# systemctl daemon-reload
GRUB の設定変更を反映させるため、OS を再起動します。
[root@lab-nkp-01 ~]# reboot
gowatana ユーザーで SSH ログインすると、cgroupVersion が v2、rootless が true になります。
[gowatana@lab-nkp-01 ~]$ podman info | grep -e rootless -e cgroupVersion cgroupVersion: v2 rootless: true
作成したドロップ インファイルも読み込まれていそうです。
[gowatana@lab-nkp-01 ~]$ echo user@$(id -u).service user@1000.service
[gowatana@lab-nkp-01 ~]$ systemctl cat user@$(id -u).service # /usr/lib/systemd/system/user@.service # SPDX-License-Identifier: LGPL-2.1+ # # This file is part of systemd. # # systemd is free software; you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or # (at your option) any later version. [Unit] Description=User Manager for UID %i After=systemd-user-sessions.service After=user-runtime-dir@%i.service Requires=user-runtime-dir@%i.service [Service] User=%i PAMName=systemd-user Type=notify ExecStart=-/usr/lib/systemd/systemd --user Slice=user-%i.slice KillMode=mixed Delegate=pids memory TasksMax=infinity TimeoutStopSec=120s # /etc/systemd/system/user@.service.d/delegate.conf [Service] Delegate=yes
6. nkp create cluster コマンドの実行(rootless モード)
あらためて、Prism Centarl のログイン情報を環境変数を設定しておきます。
export NUTANIX_USER=admin export NUTANIX_PASSWORD='パスワード'
これで、さきほどの「nkp create cluster nutanix ~ --dry-run」コマンドを実行してみます。これでも Delegate=yes が認識できずエラーになってしまう場合は、下記のように systemd-run から nkp コマンドを実行すると成功するはずです。
systemd-run --scope --user -p "Delegate=yes" \ nkp create cluster nutanix \ --endpoint=https://lab-nxpc-01.go-lab.jp:9440 \ --insecure \ --control-plane-prism-element-cluster=lab-nxce-02 \ --worker-prism-element-cluster=lab-nxce-02 \ --control-plane-subnets=nw-vlan-12 \ --worker-subnets=nw-vlan-12 \ --cluster-name=nkpm01 \ --control-plane-endpoint-ip=192.168.12.200 \ --control-plane-vm-image=nkp-rocky-9.4-release-1.29.6-20240816215147.qcow2 \ --worker-vm-image=nkp-rocky-9.4-release-1.29.6-20240816215147.qcow2 \ --kubernetes-service-load-balancer-ip-range=192.168.12.201-192.168.12.204 \ --kubernetes-pod-network-cidr=172.16.0.0/16 \ --kubernetes-service-cidr=10.96.0.0/12 \ --csi-hypervisor-attached-volumes=true \ --csi-storage-container=default-container-88443613598780 \ --ssh-public-key-file=/home/gowatana/.ssh/id_rsa.pub \ --self-managed \ --control-plane-replicas=1 \ --control-plane-vcpus=4 \ --control-plane-memory=8 \ --worker-replicas=2 \ --worker-vcpus=4 \ --worker-memory=6 \ --dry-run
下記のようになれば成功です。「--dry-run」では、Cluster API の Bootstrap Cluster の作成(Management Cluster 作成開始の直前)までが実行されます。
ちなみにこの場合は、OS を再起動するまでは systemd-run なしでも nkp create cluster が成功するようになります。
[gowatana@lab-nkp-01 ~]$ systemd-run --scope --user -p "Delegate=yes" \ > nkp create cluster nutanix \ > --endpoint=https://lab-nxpc-01.go-lab.jp:9440 \ > --insecure \ > --control-plane-prism-element-cluster=lab-nxce-02 \ > --worker-prism-element-cluster=lab-nxce-02 \ > --control-plane-subnets=nw-vlan-12 \ > --worker-subnets=nw-vlan-12 \ > --cluster-name=nkpm01 \ > --control-plane-endpoint-ip=192.168.12.200 \ > --control-plane-vm-image=nkp-rocky-9.4-release-1.29.6-20240816215147.qcow2 \ > --worker-vm-image=nkp-rocky-9.4-release-1.29.6-20240816215147.qcow2 \ > --kubernetes-service-load-balancer-ip-range=192.168.12.201-192.168.12.204 \ > --kubernetes-pod-network-cidr=172.16.0.0/16 \ > --kubernetes-service-cidr=10.96.0.0/12 \ > --csi-hypervisor-attached-volumes=true \ > --csi-storage-container=default-container-88443613598780 \ > --ssh-public-key-file=/home/gowatana/.ssh/id_rsa.pub \ > --self-managed \ > --control-plane-replicas=1 \ > --control-plane-vcpus=4 \ > --control-plane-memory=8 \ > --worker-replicas=2 \ > --worker-vcpus=4 \ > --worker-memory=6 \ > --dry-run Running scope as unit: run-r0724f85c455048f6bc99fb64d98242f4.scope ✓ Creating a bootstrap cluster ✓ Initializing new CAPI components ✓ Creating ClusterClass resources ✓ Creating ClusterClass resources Generating cluster resources cluster.cluster.x-k8s.io/nkpm01 created secret/nkpm01-pc-credentials created secret/nkpm01-pc-credentials-for-csi created configmap/kommander-bootstrap-configuration created secret/global-nutanix-credentials created ✓ Deleting bootstrap cluster
このあとの Management Cluster 作成(--dry-run なしでの nkp create cluster 実行)については、下記の投稿を参照して下さい。
以上。