logologo
スタート
マニュアル
開発
プラグイン
API
English
简体中文
日本語
한국어
Deutsch
Français
Español
Português
Русский
Italiano
Türkçe
Українська
Tiếng Việt
Bahasa Indonesia
ไทย
Polski
Nederlands
Čeština
العربية
עברית
हिन्दी
Svenska
スタート
マニュアル
開発
プラグイン
API
logologo
クラスターモード
概要
事前準備
Kubernetes デプロイ
運用フロー
サービス分割
開発リファレンス
Previous Page事前準備
Next Page運用フロー
TIP

このドキュメントはAIによって翻訳されました。不正確な情報については、英語版をご参照ください

#Kubernetes デプロイ

本記事では、Kubernetes環境にNocoBaseをクラスターモードで迅速にデプロイする方法を解説します。読者の皆様がKubernetes環境に精通しており、準備作業を完了していることを前提としています。

ヒント

Kubernetesのデプロイプロセスを迅速に検証するため、本記事ではシングルノードのK3Sクラスター(OS: Ubuntu)を動作環境としています。このガイドは標準的なKubernetesクラスターにも適用可能です。もし標準Kubernetesクラスターでのデプロイ時に本記事と異なる状況が発生した場合は、ぜひお知らせください。

#クラスター環境

すでにKubernetesクラスター環境をお持ちの場合は、このステップをスキップしてください。

Debian / Ubuntuがインストールされたサーバーを1台用意し、その上でK3Sクラスターをシングルノードモードで実行します。K3Sの詳細については、K3S公式サイトをご覧ください。

手順は以下の通りです。

  1. サーバーにSSHでログインします。
  2. サーバー上で公式スクリプトを使用してK3Sクラスターのマスターノードをインストールします。
# インストール後、デフォルトのkubeconfigファイルは /etc/rancher/k3s/k3s.yaml です。
curl -sfL https://get.k3s.io | sh -
# 設定が正しいか確認します。
kubectl get node

#クラスターアプリケーションのデプロイ

KubernetesクラスターにNocoBaseアプリケーションをクラスターモードでデプロイします。

#環境変数

通常、環境変数はアプリケーションのデプロイ設定ファイルから分離すべきです。本記事ではConfigMapを例として構成しますが、実際のプロダクション環境では、機密情報をさらに分離するためにSecretsを使用することもできます。

手順は以下の通りです。

  1. nocobase-cm.yaml ファイルを作成します。
apiVersion: v1
kind: ConfigMap
metadata:
  name: nocobase-config
data:
  # タイムゾーンを設定します。例: UTC, Asia/Shanghai
  TZ: Asia/Shanghai
  # 以下のデータベースおよびRedisの設定は、「Kubernetesミドルウェアデプロイ」ドキュメントでクラスター内にデプロイされたPostgreSQLサービスとRedisサービスを使用しています。
  # ターゲット環境に既存のデータベースやRedisサービスがある場合は、以下の対応する設定を変更してください。
  CACHE_DEFAULT_STORE: redis
  # 既存または自身でデプロイしたRedisサービスを使用します。
  CACHE_REDIS_URL: "redis://redis-0.redis-service:6379/0"
  PUBSUB_ADAPTER_REDIS_URL: "redis://redis-0.redis-service:6379/1"
  LOCK_ADAPTER_REDIS_URL: "redis:/redis-0.redis-service:6379/2"
  # 既存または自身でデプロイしたPostgreSQLサービスを使用します。
  DB_DATABASE: nocobase
  DB_DIALECT: postgres
  DB_HOST: "postgres-0.postgres-service"
  DB_PASSWORD: nocobase123
  DB_PORT: "5432"
  DB_UNDERSCORED: "true"
  DB_USER: nocobase
  # service platform username
  NOCOBASE_PKG_USERNAME: "<your user>"
  # service platform password
  NOCOBASE_PKG_PASSWORD: "<your password>"

  # ... その他の環境変数
  1. kubectl コマンドを実行してConfigMapをデプロイします。
kubectl apply -f nocobase-cm.yaml

#共有ストレージ

クラスターモードでデプロイされたNocoBaseアプリケーションの異なるノードは、同じストレージディレクトリ(storage)をマウントする必要があります。そのためには、複数のノードからの読み書き(ReadWriteMany)をサポートする永続ボリューム(Persistent Volume)を作成する必要があります。通常、クラウドプロバイダーのプラットフォームでクラウドディスクを作成し、PVとしてバインドするか、NFSなどの他の方法で共有ストレージディレクトリをマウントすることができます。

#アプリケーションのデプロイ

最初のデプロイでは、まず1つのノードから開始し、完了後に複数のノードにスケールアップしてください。

  1. nocobase-apps.yaml ファイルを作成します。
# PVCを作成します。このDeploymentによってデプロイされる複数のPodは、このPVCを介して同じ永続ストレージディレクトリをマウントします。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nocobase-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 10Gi
  storageClassName: "" # 例ではマスターノードのNFSサービスを使用しているため、デフォルトのStorageClassの使用を避けるために明示的に空に設定しています。
---
# アプリケーションのService。Ingressにバインドされた後、クラスター外部にサービスを提供します。
apiVersion: v1
kind: Service
metadata:
  name: nocobase
spec:
  ports:
    - name: nocobase
      port: 13000
      targetPort: 13000
  selector:
    app: nocobase
  type: ClusterIP
# アプリケーションのDeployment。複数のアプリケーションコンテナをデプロイできます。
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nocobase
spec:
  replicas: 1 # 最初のデプロイではノードは1つのみです。
  selector:
    matchLabels:
      app: nocobase
  template:
    metadata:
      labels:
        app: nocobase
    spec:
      containers:
        - name: nocobase
          image: nocobase/nocobase:1.6
          ports:
            - containerPort: 13000
          # 環境変数は、以前にデプロイしたConfigMapからロードされます。
          envFrom:
            - configMapRef:
                name: nocobase-config
          volumeMounts:
            - name: nocobase-data
              mountPath: /app/nocobase/storage
          # サービスの実行リソース要求と制限を宣言します。
          resources:
            requests:
              memory: "512Mi"
              cpu: "250m"
            limits:
              memory: "1Gi"
              cpu: "500m"
          # サービス生存性プローブコマンド。クラスターはこのコマンドを使用して、Podを再起動する必要があるかどうかを判断します。
          livenessProbe:
            httpGet:
              path: /api/__health_check
              port: 13000
            initialDelaySeconds: 60
          # サービス可用性プローブコマンド。クラスターはこのコマンドを使用して、ServiceトラフィックをPodにルーティングするかどうかを判断します。
          readinessProbe:
            httpGet:
              path: /api/__health_check
              port: 13000
            initialDelaySeconds: 30
      # PVCを介して永続ストレージをマウントします。
      volumes:
        - name: nocobase-data
          persistentVolumeClaim:
            claimName: nocobase-pvc
  1. kubectl コマンドを実行してNocoBaseアプリケーションサービスをデプロイします。
kubectl apply -f nocobase-apps.yaml
  1. NocoBaseアプリケーションサービスのステータスを確認します。
# NocoBaseサービスのPodステータスを確認します。
kubectl get pods -l app=nocobase

出力例は以下の通りです。STATUSがRunningの場合、サービスが正常に起動していることを示します。

NAME                        READY   STATUS    RESTARTS   AGE
nocobase-5558b774d7-w6swf   1/1     Running   0          7h6m
  1. アプリケーションの初回起動時には、管理画面で以下のプラグインを手動で有効にする必要があります。
  • @nocobase/plugin-sync-adapter-redis
  • @nocobase/plugin-lock-adapter-redis

その後、スケールアップを行います。例えば、4つのノードにスケールアップするには、次のようにします。

kubectl scale deployment nocobase --replicas=4

#アプリケーションの変更

アプリケーションの変更とは、以下の状況を指します。

  • アプリケーションバージョンのアップグレード
  • 新しいプラグインのインストール
  • プラグインの有効化

NocoBaseは、上記のシナリオにおけるクラスター内の複数インスタンス間での変更の自動同期をまだサポートしていません。そのため、以下の手順に従って手動で処理する必要があります。以下の手順はアプリケーションサービスの変更のみを対象としています。変更を行う前に、ご自身でデータベースと永続ストレージのバックアップを必ず行ってください。

#アプリケーションバージョンのローリングアップグレード

  1. kubectl set image コマンドを実行して、Deploymentのコンテナイメージバージョンを変更します。

    kubectl set image deployment/nocobase nocobase=nocobase/nocobase:1.7
  2. ローリングアップデートのステータスを確認します。

    # Deployment全体のローリングアップデートの進捗を確認します。
    kubectl rollout status deployment/nocobase
    
    # 各Podのステータスを確認します。
    kubectl get pods -l app=nocobase

アプリケーションバージョンのアップグレード中またはアップグレード後に異常が発見され、バージョンをロールバックする必要がある場合は、以下のコマンドを実行してコンテナイメージバージョンをロールバックしてください。

kubectl rollout undo deployment/nocobase

#アプリケーションのGraceful Restart

新しいプラグインをインストールまたは有効化した後、アプリケーションの設定や状態を更新する必要があります。以下のコマンドを使用して、各PodをGraceful Restartできます。

  1. kubectl rollout restart コマンドを実行します。

    kubectl rollout restart deployment/nocobase
  2. ローリングリスタートのステータスを確認します。

    # Deployment全体の再起動の進捗を確認します。
    kubectl rollout status deployment/nocobase
    
    # 各Podのステータスを確認します。
    kubectl get pods -l app=nocobase

#アプリケーションゲートウェイ

Kubernetesクラスターにデプロイされたアプリケーションを外部からアクセス可能にするには、アプリケーションのServiceにIngressをバインドする必要があります。本記事で使用しているクラスター環境はK3Sであり、K3SにはデフォルトでIngress ControllerコンポーネントとしてTraefikがインストールされています。

#Traefik IngressRoute

手順は以下の通りです。

  1. nocobase-ingress.yaml ファイルを作成します。

    apiVersion: traefik.containo.us/v1alpha1
    kind: IngressRoute
    metadata:
      name: nocobase-ingress
    spec:
      entryPoints:
        - web
      routes:
        # ここで「nocobase.local」は、クラスターのIPを指す実際のドメイン名に置き換える必要があります。
        # 検証用のドメインがない場合は、ローカルのhostsファイルを変更し、nocobase.localがクラスターのIPを指すレコードを追加してください。
        # その後、ブラウザで http://nocobase.local を開くと、クラスター内のNocoBaseアプリケーションにアクセスできます。
        - match: Host(`nocobase.local`)
          kind: Rule
          services:
            # このServiceは、上記の「アプリケーションのデプロイ」セクションでnocobaseアプリケーションをデプロイした際に作成されたServiceです。
            - name: nocobase
              port: 13000
  2. kubectl コマンドを実行してNocoBaseアプリケーションのIngressをデプロイします。

    kubectl apply -f nocobase-ingress.yaml

#Ingress-Nginx

ほとんどのKubernetesクラスターでは、Ingress ControllerコンポーネントとしてIngress-Nginxがインストールされています。以下は、Ingress-Nginxに基づいたnocobase-ingress.yamlファイルです。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
  name: nocobase-ingress
spec:
  rules:
    # ここで「nocobase.local」は、クラスターのIPを指す実際のドメイン名に置き換える必要があります。
    # 検証用のドメインがない場合は、ローカルのhostsファイルを変更し、nocobase.localがクラスターのIPを指すレコードを追加してください。
    # その後、ブラウザで http://nocobase.local を開くと、クラスター内のNocoBaseアプリケーションにアクセスできます。
    - host: nocobase.local
      http:
        paths:
          - backend:
              serviceName: nocobase
              servicePort: 13000

#Helm Charts の使用

NocoBaseアプリケーション用のHelm Chartsを作成しました。Helm CLIを使用して、KubernetesにNocoBaseアプリケーションサービスをデプロイできます。

#前提条件

動作環境にkubectlやhelmなどのクライアントがインストールされており、kubectlがターゲットクラスターに正しく接続できることを確認してください。

#リポジトリの追加

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

# NocoBaseのHelm Chartsリポジトリを追加します。
helm repo add nocobase https://nocobase.github.io/helm-charts

# Helmインデックスを更新します。
helm repo update

#Helmによるデプロイ

  1. values.yaml ファイルを作成します。

    persistent:
      # NocoBaseクラスターの共有ストレージに必要なサイズ
      size: 10Gi
      # クラウドサービスのKubernetesが提供するストレージクラス
      # 「アプリケーションのデプロイ」セクションと同様に、マスターノードのNFSサービスを使用するため、明示的に空に設定しています。
      storageClassName: ""
    
    configMap:
      data:
        # タイムゾーンを設定します。例: UTC, Asia/Shanghai
        TZ: Asia/Shanghai
        # 以下のデータベースおよびRedisの設定は、「Kubernetesミドルウェアデプロイ」ドキュメントでクラスター内にデプロイされたPostgreSQLサービスとRedisサービスを使用しています。
        # ターゲット環境に既存のデータベースやRedisサービスがある場合は、以下の対応する設定を変更してください。
        CACHE_DEFAULT_STORE: redis
        # 既存または自身でデプロイしたRedisサービスを使用します。
        CACHE_REDIS_URL: "redis://redis-0.redis-service:6379/0"
        PUBSUB_ADAPTER_REDIS_URL: "redis://redis-0.redis-service:6379/1"
        LOCK_ADAPTER_REDIS_URL: "redis:/redis-0.redis-service:6379/2"
        # 既存または自身でデプロイしたPostgreSQLサービスを使用します。
        DB_DATABASE: nocobase
        DB_DIALECT: postgres
        DB_HOST: "postgres-0.postgres-service"
        DB_PASSWORD: nocobase123
        DB_PORT: "5432"
        DB_UNDERSCORED: "true"
        DB_USER: nocobase
        # service platform username
        NOCOBASE_PKG_USERNAME: "<your user>"
        # service platform password
        NOCOBASE_PKG_PASSWORD: "<your password>"
    
        # ... その他の環境変数
  2. helm install コマンドを実行してインストールを開始します。

    helm install nocobase nocobase/nocobase --values values.yaml