NTNX>日記

個人的な趣味による Nutanix Community Edition 日記。Japanese のみですみません。

Nutanix Kubernetes Platform(NKP)で nkp コマンドを一般ユーザーで実行してみる。(rootless Podman)

Nutanix Kubernetes Platform(NKP)の nkp コマンドによる Management Cluster 作成を、一般ユーザー(非 root の)で実行する準備をしてみます。

今回の内容です。

今回の環境

下記の投稿で 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 実行)については、下記の投稿を参照して下さい。

以上。

 

 

©2024 gowatana
クリエイティブ・コモンズ・ライセンスこの 作品 は クリエイティブ・コモンズ 表示 4.0 国際 ライセンスの下に提供されています。