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のクォーターバックでもあると答えましょう。コーディングを楽しんでください!