Kubernetesは強力ですが、そのYAMLマニフェストはペンキが乾くのを見ているようなものです。そこで登場するのがHelm、Kubernetesのためのパッケージマネージャーです。Kubernetesのnpmのようなもので、少しだけ気楽に使えます。

Helmがあなたの新しい親友である理由は次の通りです:

  • テンプレート化:YAMLファイルのコピーペーストにさよならを!
  • バージョン管理:「おっと」と言うよりも早くデプロイをロールバック
  • 再利用性:チャートを共有して、チームのヒーローになろう
  • シンプルさ:複雑なアプリケーションを1つのコマンドで管理

HelmでQuarkusアプリをセットアップする

Helmチャートに進む前に、QuarkusアプリがKubernetesデビューの準備ができていることを確認しましょう。まだの場合は、QuarkusプロジェクトにKubernetes拡張機能を追加してください:

./mvnw quarkus:add-extension -Dextensions="kubernetes"

この拡張機能はKubernetesマニフェストを生成し、Helmチャートの出発点として使用します。次に、Quarkusアプリの基本的なDockerfileを作成しましょう:

FROM registry.access.redhat.com/ubi8/openjdk-17:1.14

ENV LANGUAGE='en_US:en'

COPY target/quarkus-app/lib/ /deployments/lib/
COPY target/quarkus-app/*.jar /deployments/
COPY target/quarkus-app/app/ /deployments/app/
COPY target/quarkus-app/quarkus/ /deployments/quarkus/

EXPOSE 8080
USER 185
ENV JAVA_OPTS="-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager"
ENV JAVA_APP_JAR="/deployments/quarkus-run.jar"

ENTRYPOINT [ "/opt/jboss/container/java/run/run-java.sh" ]

初めてのHelmチャートを作成する

Quarkusアプリがコンテナ化され、準備が整ったので、Helmチャートを作成してデプロイしましょう。まず、Helmをインストールしていない場合はインストールします:

curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash

次に、新しいHelmチャートを作成します:

helm create quarkus-app

このコマンドはHelmチャートのディレクトリ構造を作成します。主に作業するファイルは次の通りです:

  • Chart.yaml: チャートのメタデータ
  • values.yaml: デフォルトの設定値
  • templates/: Kubernetesマニフェストテンプレートを含むディレクトリ

チャートのカスタマイズ:ここで魔法が起こる

values.yamlファイルをQuarkusアプリに合わせて修正しましょう:

replicaCount: 1

image:
  repository: your-registry/quarkus-app
  pullPolicy: IfNotPresent
  tag: "latest"

service:
  type: ClusterIP
  port: 8080

ingress:
  enabled: true
  className: "nginx"
  hosts:
    - host: quarkus-app.local
      paths:
        - path: /
          pathType: Prefix

resources:
  limits:
    cpu: 500m
    memory: 512Mi
  requests:
    cpu: 250m
    memory: 256Mi

次に、templates/deployment.yamlファイルをこれらの値を使用するように更新します:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "quarkus-app.fullname" . }}
  labels:
    {{- include "quarkus-app.labels" . | nindent 4 }}
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      {{- include "quarkus-app.selectorLabels" . | nindent 6 }}
  template:
    metadata:
      labels:
        {{- include "quarkus-app.selectorLabels" . | nindent 8 }}
    spec:
      containers:
        - name: {{ .Chart.Name }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          ports:
            - name: http
              containerPort: 8080
              protocol: TCP
          resources:
            {{- toYaml .Values.resources | nindent 12 }}

Quarkusアプリのデプロイ:真実の瞬間

Helmチャートが準備できたので、QuarkusアプリをKubernetesにデプロイしましょう。まず、Kubernetesクラスターに接続していることを確認し、次のコマンドを実行します:

helm install my-quarkus-app ./quarkus-app

これで、QuarkusアプリがKubernetesにデプロイされ、稼働しています。デプロイのステータスを確認するには、次のコマンドを使用します:

kubectl get pods

アップグレードとロールバック:ミスはつきもの

Helmの素晴らしい点の一つは、アップグレードとロールバックが簡単なことです。Quarkusアプリに変更を加え、新しいバージョンをデプロイしたい場合は、values.yamlのDockerイメージタグを更新し、次のコマンドを実行します:

helm upgrade my-quarkus-app ./quarkus-app

何か問題が発生した場合(誰にでもあります)、ロールバックは次のように簡単です:

helm rollback my-quarkus-app

高度なテクニック:Helmのスキルを向上させる

Helmフックを使用したデータベースマイグレーション

Quarkusアプリが起動前にデータベースマイグレーションを実行する必要がある場合、Helmフックを使用して適切なタイミングで実行されるようにできます。templates/db-migrate-job.yamlという新しいテンプレートファイルを追加します:

apiVersion: batch/v1
kind: Job
metadata:
  name: {{ include "quarkus-app.fullname" . }}-db-migrate
  annotations:
    "helm.sh/hook": pre-install,pre-upgrade
    "helm.sh/hook-weight": "-5"
    "helm.sh/hook-delete-policy": hook-succeeded
spec:
  template:
    spec:
      containers:
        - name: db-migrate
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
          command: ["./migrate-database.sh"]
      restartPolicy: Never
  backoffLimit: 5

このジョブはメインアプリケーションが起動する前に実行され、データベースが最新であることを確認します。

カナリアデプロイの実装

Helmチャートは、カナリアリリースのような高度なデプロイ戦略を実装するのにも役立ちます。以下はカナリアデプロイを設定する簡単な例です:

{{- if .Values.canary.enabled }}
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "quarkus-app.fullname" . }}-canary
spec:
  replicas: {{ .Values.canary.replicaCount }}
  selector:
    matchLabels:
      {{- include "quarkus-app.selectorLabels" . | nindent 6 }}
      version: canary
  template:
    metadata:
      labels:
        {{- include "quarkus-app.selectorLabels" . | nindent 8 }}
        version: canary
    spec:
      containers:
        - name: {{ .Chart.Name }}-canary
          image: "{{ .Values.image.repository }}:{{ .Values.canary.tag }}"
          # ... rest of the container spec
{{- end }}

このテンプレートは、カナリアデプロイが有効な場合に別のカナリアデプロイメントを作成し、新しいバージョンにトラフィックの一部をルーティングすることができます。

結論:HelmでKubernetesをマスターする

以上で、Helmチャートの世界を旅し、QuarkusアプリケーションをKubernetesにデプロイするためのスムーズで管理しやすい方法を手に入れました。もうYAMLの悪夢やデプロイの頭痛はありません。Kubernetesの海をスムーズに航海しましょう。

HelmはKubernetesツールキットの一部に過ぎません。旅を続ける中で、Kustomizeやオペレーターフレームワークなどの他の技術を探求することも考えてみてください。しかし今は、自分を褒めてください。Kubernetesの獣を手なずけるための大きな一歩を踏み出しました!

"大いなる力には大いなる責任が伴う" – おそらく、ベンおじさんがHelmチャートについて話していた

さらなる学習とリソース

さあ、自信を持ってデプロイしましょう!そして、誰かに聞かれたら、あなたはただの開発者ではなく、Kubernetesの使い手であり、Helmチャートのアーティストであり、Quarkusのクォーターバックでもあると答えましょう。コーディングを楽しんでください!