OpenMediaVaultのkubernetesプラグインで安全なロードバランシングを利用する
OpenMediaVaultとは
OpenMediaVault(OMV)はNASの構築に特化したDebianベースのOSです。TrueNASなどの同様の機能を持つOSは他にもありますが、OMVの特徴として機能追加が簡単に行える「プラグイン」の豊富さがあります。
Kubernetes環境の導入・運用もこのプラグインを利用することで簡単に行えます。
OMVのKubernetesプラグイン
導入はSystem > Pluginsに進んでopenmediavault-k8sを選択、インストールするだけです。しばらくするとServices > Kubernetesが追加されます。

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

マニフェストのデプロイ、ノードの管理などあらゆる操作がこのダッシュボードから行えます。
ロードバランサー
OMVのKubernetesプラグインではIngressRoute + Traefikを利用したリクエスト転送・ロードバランシング・SSL/TLS対応が可能です。

初期設定では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