👌

OpenMediaVaultのkubernetesプラグインで安全なロードバランシングを利用する

2024/05/24に公開

OpenMediaVaultとは

OpenMediaVault(OMV)はNASの構築に特化したDebianベースのOSです。TrueNASなどの同様の機能を持つOSは他にもありますが、OMVの特徴として機能追加が簡単に行える「プラグイン」の豊富さがあります。
Kubernetes環境の導入・運用もこのプラグインを利用することで簡単に行えます。

OMVのKubernetesプラグイン

導入はSystem > Pluginsに進んでopenmediavault-k8sを選択、インストールするだけです。しばらくするとServices > Kubernetesが追加されます。

alt text

初期設定

Services > Kubernetesに進むと初期設定画面が表示されます。サービスを有効化してsnapshotsの保存先や必要であれば証明書の設定などを済ませます。ダッシュボードアクセス用のトークンをコピーしてOpen UIをクリック。
認証画面が表示されるので先ほどコピーしたトークンを貼り付けてログインします。

alt text

マニフェストのデプロイ、ノードの管理などあらゆる操作がこのダッシュボードから行えます。

ロードバランサー

OMVのKubernetesプラグインではIngressRoute + Traefikを利用したリクエスト転送・ロードバランシング・SSL/TLS対応が可能です。

alt text

初期設定ではHTTPの場合は8080ポート、HTTPSの場合は8443ポートでロードバランサが待ち受けています。必要に応じて変更してください。今回はそのまま進めます。

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

今回はNextjsで構築したアプリケーションをデプロイしていきます。イメージは事前にリポジトリにプッシュ済みです。
マニフェストは以下の通りです。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nextjs-deployment
  labels:
    app: nextjs
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nextjs
  template:
    metadata:
      labels:
        app: nextjs
    spec:
      containers:
        - name: nextjs
          image: [MY_NEXTJS_IMAGE]:latest
          imagePullPolicy: Always
          ports:
            - containerPort: 8080
          env:
            - name: NODE_ENV
              value: "production"
      imagePullSecrets:
        - name: regcred
---
apiVersion: v1
kind: Service
metadata:
  name: nextjs
  labels:
    app: nextjs
spec:
  ports:
    - port: 8080
      targetPort: 8080
      protocol: TCP
  selector:
    app: nextjs
---
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: portal-websecure
  namespace: default
spec:
  entryPoints:
    - websecure
  routes:
    - match: PathPrefix(`/app`)
      kind: Rule
      services:
        - name: nextjs
          port: 8080
  tls:
    secretName: host-selfsigned-cert

Deployment、Serviceに関してはいつも通りです。8080番ポートでコンテナが待ち受けるように設定していて、selectorはサービスがどのPodにトラフィックをルーティングするかを指定するためのラベルセレクタです。この場合、app: nextjsというラベルを持つPodが対象になります。
最後のIngressRouteがTraefikによるKubernetesクラスタ内のトラフィックを管理するためのリバースプロキシおよびロードバランサを設定しています。match: PathPrefix(/app)はURLパスが/appで始まるリクエストにマッチします。servicesはルートされたトラフィックが送信されるサービスを指定します。今回の場合は上で指定したnextjsサービスです。tlsはTLS/SSL証明書を指定します。この場合、host-selfsigned-certという名前のシークレットを指定しています。

ブラウザを開いてhttps://[OMVのIPアドレス]:8443/appにアクセスするとNextjsアプリケーションが表示されます。

Discussion