NTNX>日記

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

Nutanix Enterprise AI 2.6 をデプロイしてみる。Part-07:NAI のインストール

NKP の Kubernetes クラスタに、Nutanix Enterprise AI(NAI)2.6 を展開してみます。今回は、NAI をインストールし、初期設定を実施します。

 

前回はこちら。

 

今回の内容です。

 

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

 

1. Nutanix Docker Hub トークンの入手

NAI のインストール時にコンテナ イメージをダウンロードするため、Nutanix Docker Hub のトークン(dckr_pat_~)を生成しておきます。

 

トークンは、Nutanix Support & Insight Portal の NAI ダウンロード ページで生成できます。

 

2. Helm Repo の追加

Nutanix の Helm リポジトリを追加します。

gowatana@nkp-work-02:~$ helm repo add ntnx-charts https://nutanix.github.io/helm-releases
"ntnx-charts" has been added to your repositories

 

Helm リポジトリの情報を更新する場合は、下記のように helm repo update を実行します。

gowatana@nkp-work-02:~$ helm repo update ntnx-charts
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "ntnx-charts" chart repository
Update Complete. ⎈Happy Helming!⎈

 

NAI Operator(nai-operators)の Helm Chart は v2.5.0 から提供されています。

gowatana@nkp-work-02:~$ helm search repo ntnx-charts/nai-operators --versions
NAME                            CHART VERSION   APP VERSION     DESCRIPTION
ntnx-charts/nai-operators       2.6.0           0.1.0           A Helm chart for CRDs and Operators required by...
ntnx-charts/nai-operators       2.5.0           0.1.0           A Helm chart for CRDs and Operators required by...

 

nai-core の Helm Chart は、v2.3.0 以降が提供されています。

gowatana@nkp-work-02:~$ helm search repo ntnx-charts/nai-core --versions
NAME                    CHART VERSION   APP VERSION     DESCRIPTION
ntnx-charts/nai-core    2.6.0           0.1.0           A Helm chart for NAI core components
ntnx-charts/nai-core    2.5.0           0.1.0           A Helm chart for NAI core components
ntnx-charts/nai-core    2.4.0           0.1.0           A Helm chart for NAI core components
ntnx-charts/nai-core    2.3.0           0.1.0           A Helm chart for NAI core components

 

3. NAI のインストール

Helm で、NAI の Chart をインストールします。

 

3-1. Namespace の作成

Docker Hub の認証情報を登録する Secret を作成するため、さきに NAI のインストール先となる nai-system Namespace を作成しておきます。

gowatana@nkp-work-02:~$ kubectl create namespace nai-system --dry-run=client -o yaml | kubectl apply -f -
namespace/nai-system created

 

3-2. Nutanix Docker Hub 認証情報の登録

環境変数に、認証情報を格納します。NAI のコンテナを格納する場合、ユーザー名は固定値で「ntnxsvcgpt」です。

export REGISTRY_SECRET_NAME=nai-regcred
export DOCKER_SERVER=https://index.docker.io/v1/
export DOCKER_USERNAME=ntnxsvcgpt
export DOCKER_PASSWORD=dckr_pat_XXXXXXXXXXXXXXXXXXX

 

Secret を作成します。

kubectl create secret docker-registry ${REGISTRY_SECRET_NAME} \
-n nai-system \
--docker-server=${DOCKER_SERVER} \
--docker-username=${DOCKER_USERNAME} \
--docker-password=${DOCKER_PASSWORD} \
--dry-run=client -o yaml | kubectl apply -f -

 

3-3. NAI Operator のインストール

NAI Operator をインストールします。

helm upgrade --install nai-operators ntnx-charts/nai-operators \
--version=2.6.0  \
-n nai-system \
--create-namespace \
--wait \
--set "naiAIGateway.enabled=true" \
--set "global.imagePullSecrets[0].name=${REGISTRY_SECRET_NAME}" \
--insecure-skip-tls-verify

 

実際に実行すると、下記のようになります。

gowatana@nkp-work-02:~$ helm upgrade --install nai-operators ntnx-charts/nai-operators \
--version=2.6.0  \
-n nai-system \
--create-namespace \
--wait \
--set "naiAIGateway.enabled=true" \
--set "global.imagePullSecrets[0].name=${REGISTRY_SECRET_NAME}" \
--insecure-skip-tls-verify
Release "nai-operators" does not exist. Installing it now.
I0328 08:33:49.004020   55108 warnings.go:107] "Warning: spec.template.spec.containers[1].ports[0]: duplicate port name \"metrics\" with spec.template.spec.containers[0].ports[0], services and probes that select ports by name will use spec.template.spec.containers[0].ports[0]"
I0328 08:33:49.070503   55108 warnings.go:107] "Warning: spec.privateKey.rotationPolicy: In cert-manager >= v1.18.0, the default value changed from `Never` to `Always`."
NAME: nai-operators
LAST DEPLOYED: Sat Mar 28 08:33:44 2026
NAMESPACE: nai-system
STATUS: deployed
REVISION: 1
DESCRIPTION: Install complete
TEST SUITE: None

 

この時点で、nai-system Namespace には、下記のように Pod が起動されます。

gowatana@nkp-work-02:~$ kubectl get pod -n nai-system
NAME                                                    READY   STATUS    RESTARTS   AGE
ai-gateway-controller-6b786974b5-hct7w                  1/1     Running   0          66s
nai-operators-nai-clickhouse-operator-f8f666db9-g7j8b   2/2     Running   0          66s
redis-standalone-684f6dd8f7-frbth                       2/2     Running   0          66s

 

3-4. NAI(nai-core)のインストール

あらためて、NAI で使用する Storage Class の名前(nai-nfs-storage と nutanix-volume)を確認しておきます。

gowatana@nkp-work-02:~$ kubectl get sc
NAME                       PROVISIONER                     RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
dkp-object-store           kommander.ceph.rook.io/bucket   Delete          Immediate              false                  20h
nai-nfs-storage            csi.nutanix.com                 Delete          Immediate              false                  17h
nutanix-volume (default)   csi.nutanix.com                 Delete          WaitForFirstConsumer   true                   2d4h

 

NKP クラスタの Workspace(今回は管理クラスタなので Management Cluster Workspace)に対応する Namespace を確認しておきます。

gowatana@nkp-work-02:~$ kubectl get workspace
NAME                  DISPLAY NAME                   WORKSPACE NAMESPACE           AGE
default-workspace     Default Workspace              kommander-default-workspace   2d3h
kommander-workspace   Management Cluster Workspace   kommander                     2d3h

 

確認したパラメータを、変数に格納しておきます。

NAI_API_RWX_STORAGECLASS=nai-nfs-storage
NAI_DEFAULT_RWO_STORAGECLASS=nutanix-volume
NKP_WORKSPACE_NAMESPACE=kommander
REGISTRY_SECRET_NAME=nai-regcred

 

Helm で、NAI(nai-core)をインストールします。

helm upgrade --install nai-core ntnx-charts/nai-core \
--version=2.6.0 \
-n nai-system \
--create-namespace \
--wait \
--set "global.imagePullSecrets[0].name=${REGISTRY_SECRET_NAME}" \
--set "naiAIGateway.enabled=true" \
--set "naiApi.storageClassName=${NAI_API_RWX_STORAGECLASS}" \
--set "defaultStorageClassName=${NAI_DEFAULT_RWO_STORAGECLASS}" \
--set "naiMonitoring.opentelemetry.storageClassName=${NAI_API_RWX_STORAGECLASS}" \
--set "nai-clickhouse-keeper.clickhouseKeeper.storage.storageClass=${NAI_DEFAULT_RWO_STORAGECLASS}" \
--set "nai-clickhouse-server.clickhouse.storage.storageClass=${NAI_DEFAULT_RWO_STORAGECLASS}" \
--set "naiMonitoring.nodeExporter.serviceMonitor.namespaceSelector.matchNames[0]=${NKP_WORKSPACE_NAMESPACE}" \
--set "naiMonitoring.dcgmExporter.serviceMonitor.namespaceSelector.matchNames[0]=${NKP_WORKSPACE_NAMESPACE}" \
--insecure-skip-tls-verify

 

しばらく待つと、nai-system Namespace では下記のように Pod が起動されます。

gowatana@nkp-work-02:~$ kubectl get pod -n nai-system
NAME                                                    READY   STATUS      RESTARTS   AGE
ai-gateway-controller-6b786974b5-sfgl9                  1/1     Running     0          11m
chi-nai-clickhouse-server-chcluster1-0-0-0              1/1     Running     0          9m24s
chk-nai-clickhouse-keeper-chkeeper-0-0-0                1/1     Running     0          9m7s
iam-database-bootstrap-lc0vb-h55kz                      0/1     Completed   0          9m38s
iam-proxy-686fff8f6d-mnsk7                              1/1     Running     0          9m38s
iam-proxy-control-plane-854c76b8cc-59ss6                1/1     Running     0          9m38s
iam-themis-757776777b-w2xz8                             1/1     Running     0          9m38s
iam-themis-bootstrap-scqkl-4v4gt                        0/1     Completed   0          9m38s
iam-ui-7f6bb5b477-fb96d                                 1/1     Running     0          9m38s
iam-user-authn-78d6b7d8df-9ksfs                         1/1     Running     0          9m38s
nai-api-557d94c66f-nnb75                                1/1     Running     0          9m38s
nai-api-db-migrate-t6ljz-prsqc                          0/1     Completed   0          9m38s
nai-clickhouse-schema-job-1774699534-2jmlg              0/1     Completed   0          9m38s
nai-db-0                                                1/1     Running     0          9m38s
nai-iep-model-controller-77f44f88c-q9sgn                1/1     Running     0          9m38s
nai-labs-86cb964886-bfmrp                               1/1     Running     0          9m38s
nai-oauth2-proxy-bdf7f85cf-hs64m                        1/1     Running     0          9m38s
nai-oidc-client-registration-ft0fh-nr4wd                0/1     Completed   0          9m38s
nai-operators-nai-clickhouse-operator-f8f666db9-rk5jk   2/2     Running     0          11m
nai-otel-collector-collector-6djns                      1/1     Running     0          9m36s
nai-otel-collector-collector-8dhgx                      1/1     Running     0          9m36s
nai-otel-collector-collector-b6l6z                      1/1     Running     0          9m36s
nai-otel-collector-collector-gmkdx                      1/1     Running     0          9m36s
nai-otel-collector-collector-sfnq2                      1/1     Running     0          9m36s
nai-otel-collector-collector-shqps                      1/1     Running     0          9m36s
nai-otel-collector-collector-wpptx                      1/1     Running     0          9m36s
nai-otel-collector-targetallocator-fbc8688d7-jvfp9      1/1     Running     0          9m36s
nai-ui-8648bd7dbc-j4fj7                                 1/1     Running     0          9m38s
redis-standalone-684f6dd8f7-6zfc9                       2/2     Running     0          11m

 

そして、Envoy Gateway インストール時点ではエラーになっていた envoy-ratelimit Pod も起動されています。

gowatana@nkp-work-02:~$ kubectl get pod -n envoy-gateway-system
NAME                                                             READY   STATUS    RESTARTS      AGE
envoy-gateway-9b8b654fd-6bfrb                                    1/1     Running   1 (38m ago)   48m
envoy-nai-system-nai-ingress-gateway-ff52ba1f-795c466f9b-qggv2   2/2     Running   0             14m
envoy-ratelimit-6b4657bddd-l5k9h                                 1/1     Running   0             50m

 

3-5. NAI UI の IP アドレス確認

Web ブラウザから NAI UI にアクセスするための IP アドレスを確認しておきます。

下記のようにコマンドを実行すると、LoadBalancer から払い出された IP アドレスが確認できます。このアドレスは、後続の SSL/TLS 証明書の発行でも必要になります。

  • 10.1.7.122
gowatana@nkp-work-02:~$ kubectl get svc -n envoy-gateway-system -l "gateway.envoyproxy.io/owning-gateway-name=nai-ingress-gateway,gateway.envoyproxy.io/owning-gateway-namespace=nai-system"
NAME                                            TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
envoy-nai-system-nai-ingress-gateway-ff52ba1f   LoadBalancer   10.98.117.153   10.1.7.122    80:31848/TCP   25m

 

ちなみに、下記のようにコマンドを実行すると、IP アドレスのみを取得できます。

gowatana@nkp-work-02:~$ kubectl get svc -n envoy-gateway-system -l "gateway.envoyproxy.io/owning-gateway-name=nai-ingress-gateway,gateway.envoyproxy.io/owning-gateway-namespace=nai-system" -o jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}' | more
10.1.7.122

 

4. SSL/TLS 証明書の発行

NAI では、nai-system Namespace に nai-ingress-gateway という Gateway リソースを作成します。

gowatana@nkp-work-02:~$ kubectl get gateways.gateway.networking.k8s.io -A
NAMESPACE    NAME                  CLASS              ADDRESS      PROGRAMMED   AGE
nai-system   nai-ingress-gateway   nai-gatewayclass   10.1.7.122   True         30m

 

この Gateway は、証明書として nai-system Namespace にある ingress-certificate Secret を参照します。

gowatana@nkp-work-02:~$ kubectl get gateways.gateway.networking.k8s.io -n nai-system nai-ingress-gateway -o json | jq -r .spec
{
  "gatewayClassName": "nai-gatewayclass",
  "infrastructure": {
    "labels": {
      "serving.kserve.io/gateway": "nai-ingress-gateway"
    }
  },
  "listeners": [
    {
      "allowedRoutes": {
        "namespaces": {
          "from": "All"
        }
      },
      "name": "http",
      "port": 80,
      "protocol": "HTTP"
    },
    {
      "allowedRoutes": {
        "namespaces": {
          "from": "All"
        }
      },
      "name": "https",
      "port": 443,
      "protocol": "HTTPS",
      "tls": {
        "certificateRefs": [
          {
            "group": "",
            "kind": "Secret",
            "name": "ingress-certificate",
            "namespace": "nai-system"
          }
        ],
        "mode": "Terminate"
      }
    }
  ]
}

 

今回は NKP クラスタにインストールされている cert-manager の ClusterIssuer(selfsigned-issuer)で、既存の Gateway 設定にあわせて証明書(Certificate)を発行します。

gowatana@nkp-work-02:~$ kubectl get clusterissuers.cert-manager.io
NAME                READY   AGE
kommander-ca        True    2d8h
selfsigned-issuer   True    2d8h

 

下記のように Certificate の YAML ファイルを作成します。

cert_ingress-certificate.yaml

  • L5:Certificate リソースの名前は ingress-certificate
  • L12, L14:DNS 名には、ワイルドカード DNS サービスによる FQDN を指定(nai.10.1.7.122.nip.io)
  • L16:NAI UI の IP アドレスを指定(10.1.7.122)

gist.github.com

 

YAML を適用して、証明書を発行します。この証明書は、Gateway に自動反映されます。

gowatana@nkp-work-02:~$ kubectl apply -f cert_ingress-certificate.yaml
Warning: spec.privateKey.rotationPolicy: In cert-manager >= v1.18.0, the default value changed from `Never` to `Always`.
certificate.cert-manager.io/ingress-certificate created

 

5. NAI UI への初回ログイン

Web ブラウザから NAI UI にログインして、初期設定を実施します。FQDN でアクセスすると理想的ですが、今回はラボ環境なので IP アドレスでアクセスします。

 

5-1. admin パスワードの変更

Web ブラウザで、HTTPS で NAI UI の IP アドレスにアクセスします。HTTP のアクセスでも認証画面を開けますが、認証後に 404 エラーなどになるはずです。

Web ブラウザの証明書エラーは、無視して進みます。

 

デフォルトのパスワードでログインします。

  • ユーザー:admin
  • パスワード:Nutanix.123

 

パスワード変更を要求されるので、現在と新規パスワード(2回)を入力して「Submit」をクリックします。

 

あらためて、admin ユーザーでログインします。

 

5-2. 初期設定

最初に、「Nutanix License and Services Agreement」を受け入れる必要があります。利用者の名前と会社名を入力して「Accept」をクリックします。

 

ラボ環境なので、Pulse は無効にして「Save and Proceed」をクリックします。

  • Enable Pulse:OFF

 

これで、NAI UI にアクセスできるようになりました。

 

5-3. UI 言語の変更

UI の表示言語を、日本語に変更しておきます。

「Settings」→「Language Settings」を開き、「Edit」をクリックします。

 

「ja-JP」を選択して、「Update」をクリックします。

 

これで、UI が日本語表示になりました。

 

つづく。

 

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