NTNX>日記

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

Nutanix Kubernetes Platform(NKP)で Management Cluster を作成してみる。

Nutanix Kubernetes Platform(NKP)v2.12 がリリースされたので、ためしに Nutanix CE 2.1 に Kubernetes クラスタを作成してみます。今回は、Cluster API で Kubernetes クラスタを管理する「Management Cluster」を作成してみます。

今回の内容です。

ドキュメントは下記のあたりです。

今回の環境

下記のソフトウェアを利用しています。

  • Nutanix Community Edition 2.1(Prism Element)
  • Prism Central pc.2024.1.0.2
  • Red Hat Enterprise Linux 8.10(作業マシン)

自宅ラボのマシンでは、搭載している CPU / メモリ容量の都合で Prism Central を起動すると他の VM を起動する余裕がありません。そこで、あえて Prism Central に 2つのシングル ノード Nutanix クラスタを登録しています。

  • 各 Nutanix CE ノードの搭載リソース
    • CPU: 8
    • メモリ: 60GB弱
  • lab-nxce-01 クラスタ: Prism Central 用
  • lab-nxce-02 クラスタ: NKP の Kubernetes クラスタ作成用

1. Linux マシンの用意

今回は、作業用マシンとして RHEL8 を利用します。ちなみに、OS は Minimal インストールです。手順簡素化のため、今回はすべて root ユーザーで作業しますが、rootless Podman の設定をすれば、一般ユーザーでも作業できます。

[root@lab-nkp-01 ~]# cat /etc/redhat-release
Red Hat Enterprise Linux release 8.10 (Ootpa)

RPM パッケージを更新しておきます。

[root@lab-nkp-01 ~]# dnf update -y
[root@lab-nkp-01 ~]# reboot

実行ファイル(nkp、kubectl)を配置するディレクトリを、ホームディレクトリ直下に作成しておきます。

[root@lab-nkp-01 ~]# mkdir $HOME/bin

Bash の補完機能を利用できるように、bash-completion をインストールします。

[root@lab-nkp-01 ~]# dnf install bash-completion -y

NKP の Kubernetes ノードにログインするための SSH キー ペアを生成します。

[root@lab-nkp-01 ~]# ssh-keygen -t rsa -f $HOME/.ssh/id_rsa -P ''
Generating public/private rsa key pair.
Created directory '/root/.ssh'.
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:moovECf4BG4PUG1bSn+hFB1vVNHM4QoOPHkZ2VGmp9E root@lab-nkp-01
The key's randomart image is:
+---[RSA 3072]----+
| ...  .o..o++B+. |
|o   + o.o+.o.=+  |
|+. o * .=.* o E  |
|++o o o .* . =   |
|.*o    .S . o    |
|. ..   o         |
| .    o          |
|  .. .           |
|  .oo            |
+----[SHA256]-----+

生成した公開鍵ファイル(~.pub)を、あとで nkp コマンドで指定します。

[root@lab-nkp-01 ~]# ls -l $HOME/.ssh/id_rsa*
-rw-------. 1 root root 2602  9月 16 03:57 /root/.ssh/id_rsa
-rw-r--r--. 1 root root  569  9月 16 03:57 /root/.ssh/id_rsa.pub

2. Podman のインストール

NKP での Kubernetes クラスタ作成では kind(Kubernetes IN Docker)を利用するので、その前提として必要になる podman をインストールしておきます。

[root@lab-nkp-01 ~]# dnf install podman -y

3. kubectl のインストール

NKP 2.12 では、Kubernetes v1.29.6 のクラスタが作成されます。そこで、対応したバージョンの kubectl をインストールしておきます。

[root@lab-nkp-01 ~]# curl -L -o $HOME/bin/kubectl https://dl.k8s.io/release/v1.29.6/bin/linux/amd64/kubectl

kubectl には実行権限が付与されていないので、chmod で設定します。

[root@lab-nkp-01 ~]# chmod +x $HOME/bin/kubectl

これで、kubectl が実行できるようになりました。

[root@lab-nkp-01 ~]# kubectl version --client
Client Version: v1.29.6
Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3

4. nkp コマンドのインストール

Nutanix Support & Insight Portal から、下記のファイルをダウンロードして、Linux マシンに配置しておきます。

  • nkp_v2.12.0_linux_amd64.tar.gz

tar.gz ファイルから nkp ファイルを展開して、$HOME/bin 配下に保存します。

[root@lab-nkp-01 ~]# tar zxvf nkp_v2.12.0_linux_amd64.tar.gz -C $HOME/bin nkp
[root@lab-nkp-01 ~]# ls -l $HOME/bin/nkp
-rwxr-xr-x. 1 1000 1000 93982872  8月 28 02:57 /root/bin/nkp

RHEL 8 では、デフォルトで $HOME/bin ディレクトリが PATH 環境変数に含まれているので、nkp コマンドが実行できます。

[root@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

5. Kubernetes ノード用ディスク イメージの登録

Nutanix Support & Insight Portal にある NKP のダウンロード ページから、下記の QCOW2 ディスク イメージ ファイルをダウンロードしておきます。

  • nkp-rocky-9.4-release-1.29.6-20240816215147.qcow2

Prism Central にログインして、「Infrastructure」→「Compute & Storage」→「Images」を開き、「Add Image」をクリックします。

Image Source で「Import File」を選択して「Add File」をクリックし、ダウンロードしておいた QCOW2 ファイルを選択します。

イメージの名前と種類を指定して、「Next」を苦リクします。

  • Name: nkp-rocky-9.4-release-1.29.6-20240816215147.qcow2
    ※追加する QCOW2 ファイル名のままにしておく。
  • Type: Disk

Select Location ページでは、デフォルトのまま「Save」をクリックします。これで、Prism Central に登録されている 2クラスタの両方にディスク イメージが追加されます。

しばらく待つとイメージの処理が完了して、名前や容量などが表示されます。

6. ネットワークの作成

AHV に、IP Address Management(IPAM)が有効化された VLAN ネットワークを作成しておきます。

Prism Central の「Infrastructure」→「Network & Security」→「Subnets」を開き、「Create Subnet」をクリックします。

ネットワークの情報を入力して、下にスクロールします。

  • Name: nw-vlan-12
  • Type: VLAN ※デフォルトのまま
  • Compute: lab-nxce-01 ※Nutanix クラスタ名
  • VLAN ID: 12
  • Virtual Switch: vs0 ※デフォルトのまま
  • IP Address Management: チェック ON

IPAM の情報(ネットワーク アドレスとゲートウェイ)を入力して、「Add IP Pool」をクリックします。

  • Network IP Address/Prefix: 192.168.12.0/24
  • Gateway IP Address: 192.168.12.1

IP Pool の情報を入力して「✓」マークをクリックし、さらにスクロールします。

  • Start Address: 192.168.12.100
  • End Address: 192.168.12.149

「Domain Settings」を開いて、DNS 関連のパラメータを入力してから「Create」をクリックします。

  • Domain Name Servers: 192.168.1.101, 192.168.1.102
  • Domain Search: go-lab.jp
  • Domain Name: go-lab.jp

これで、1つめのクラスタ(lab-nxce-01)に VLAN ネットワークが作成されました。つづけて「Create Subnet」をクリックして、2つめのクラスタにも同様のネットワークを作成しておきます。

2つめのクラスタの VLAN ネットワークは、下記のように作成します。1つめの lab-nxce-01 クラスタとの差分は、赤字部分のみです。

  • Name: nw-vlan-12
  • Type: VLAN
  • Compute: lab-nxce-02 ※Nutanix クラスタ名
  • VLAN ID: 12
  • Virtual Switch: vs0
  • IP Address Management: チェック ON
    • Network IP Address/Prefix: 192.168.12.0/24
    • Gateway IP Address: 192.168.12.1
    • IP Pool
      • Start Address: 192.168.12.150
      • End Address: 192.168.12.199
    • Domain Settings
      • Domain Name Servers: 192.168.1.101, 192.168.1.102
      • Domain Search: go-lab.jp
      • Domain Name: go-lab.jp

これで、それぞれのクラスタに IPAM が有効化された VLAN ネットワークが作成できました。

7. Kubernetes クラスタの作成(Management Cluster)

NKP の Management Cluster を、nkp コマンドで作成します。今回は root ユーザーで実行していますが、非 root ユーザーの場合は下記のように実行できました。(でも Delegate=yes がうまく認識させられず)

まず、下記のように Prism Central のユーザーとパスワード を環境変数で指定します。

export NUTANIX_USER=admin
export NUTANIX_PASSWORD='パスワード'

 

Management Cluster は、nkp create cluster nutanix コマンドで作成できます。

このコマンドは、「nkp create cluster nutanix」のみで実行すると、対話モードでパラメータを指定してManagement Cluster を作成できます。しかし操作感が微妙で、Kubernetes ノードのリソース割り当てなどの詳細な設定できないので、今回は nkp コマンドにオプションを指定して実行します。

 

デフォルト構成(そして最小構成)の Management Cluster は、下記のように作成されます。

  • Control Plane: 3 ノード(各 4 vCPU、16GB メモリ)
  • Worker: 4 ノード(各 8 vCPU、32GB メモリ)

この構成ではラボ環境には大きすぎるので、本来の最小構成よりもさらに小さく指定してあります。そこで今回は、下記の nkp create cluster nutanix コマンドを実行します。

  • Control Plane: 1 ノード(各 4 vCPU、8GB メモリ)
  • Worker: 2 ノード(各  4 vCPU、6GB メモリ)
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=/root/.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

nkp create cluster nutanix コマンドを実行してしばらく待つと、Kubernetes クラスタ(Management Cluster)が作成されます。ちなみに、さらに「--dry-run」オプションで追加することで、クラスタ作成直前までの事前確認ができます。

[root@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=/root/.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
 ✓ 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
 ✓ Waiting for cluster infrastructure to be ready
 ✓ Waiting for cluster control-planes to be ready
 ✓ Waiting for machines to be ready
 ✓ Initializing new CAPI components
 ✓ Creating ClusterClass resources
 ✓ Moving cluster resources

You can now view resources in the moved cluster by using the --kubeconfig flag with kubectl.
For example: kubectl --kubeconfig="/root/nkpm01.conf" get nodes

 ✓ Deleting bootstrap cluster

Cluster default/nkpm01 kubeconfig was written to to the filesystem.
You can now view resources in the new cluster by using the --kubeconfig flag with kubectl.
For example: kubectl --kubeconfig="/root/nkpm01.conf" get nodes

Starting kommander installation
 ✓ Deploying Flux
 ✓ Deploying Ingress certificate
 ✓ Creating kommander-overrides ConfigMap
 ✓ Deploying Git Operator
 ✓ Creating GitClaim for management GitRepository
 ✓ Creating GitClaimUser for accessing management GitRepository
 ✓ Creating HTTP Proxy configuration
 ✓ Deploying Flux configuration
 ✓ Deploying Kommander Operator
 ✓ Creating KommanderCore resource
 ✓ Cleaning up kommander bootstrap resources
 ✓ Deploying Substitution variables
 ✓ Deploying Flux configuration
 ✓ Deploying Gatekeeper
 ✓ Deploying Kommander AppManagement
 ✓ Creating Core AppDeployments
 ✓ 4 out of 12 core applications have been installed (waiting for dex, dex-k8s-authenticator and 6 more)
 ✓ 5 out of 12 core applications have been installed (waiting for dex, dex-k8s-authenticator and 5 more)
 ✓ 8 out of 12 core applications have been installed (waiting for dex-k8s-authenticator, kommander and 2 more)
 ✓ 9 out of 12 core applications have been installed (waiting for dex-k8s-authenticator, kommander-ui and 1 more)
 ✓ 10 out of 12 core applications have been installed (waiting for dex-k8s-authenticator, traefik-forward-auth-mgmt)
 ✓ 11 out of 12 core applications have been installed (waiting for traefik-forward-auth-mgmt)
 ✓ Creating cluster-admin credentials

Cluster was created successfully! Get the dashboard details with:
nkp get dashboard --kubeconfig="/root/nkpm01.conf"

[root@lab-nkp-01 ~]#

カレント ディレクトリに kubeconfig(<クラスタ名>.conf)ファイルが作成されるので、kubectl で接続してみます。(記念の参照コマンドはこちら

[root@lab-nkp-01 ~]# kubectl --kubeconfig=nkpm01.conf get nodes
NAME                            STATUS   ROLES           AGE   VERSION
nkpm01-dh72h-sxwm5              Ready    control-plane   22m   v1.29.6
nkpm01-md-0-td65c-k9h78-d7z6g   Ready    <none>          20m   v1.29.6
nkpm01-md-0-td65c-k9h78-m2dnk   Ready    <none>          21m   v1.29.6

Prism Elemet でも、NKP によって Kubernetes ノードの仮想マシンが作成されたことが確認できます。

ちなみに、Prism Centarl のバージョンがサポート対象より低いと、下記のようなエラーになり、Management Cluster の作成に失敗します。これは、「kubectl -n ntnx-system logs -l job-name=nutanix-csi-precheck-job」 コマンドで確認したものです。

main.go:256: [ERROR] PC version: pc.2023.4.0.2 not supported, minimum required version: pc.2024.1

8. Management Cluster へのログイン

nkp get dashboard コマンドで、ダッシュボードにログインするための情報を表示します。このコマンドは、Management Cluster 作成が完了したターミナル画面にも表示されているはずです。kubeconfig ファイルのパスは下記のようになっています。

  • <nkp コマンドの実行ディレクトリ>/<クラスタ名>.conf

ちなみに、ユーザー名とパスワードは、クラスタを作成するたびにランダム生成されます。

[root@lab-nkp-01 ~]# nkp get dashboard --kubeconfig="/root/nkpm01.conf"
Username: intelligent_leakey
Password: 1DSlLSOyl5kpNW3Ky4yfSoJKsjWsYbP4HCVyghcCsZU2KD5HeHh2xWa4Rum2LdhE
URL: https://192.168.12.201/dkp/kommander/dashboard

表示された URL に Web ブラウザでアクセスして、証明書エラーを無視して進みます。

ユーザー名とパスワードを入力して、「Log In」をクリックします。

NKE の Management Cluster のダッシュボードにログインできました。作成した Management Cluster は、「Kommander Host」という名前で表示されています。

つづく。

 

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