Kubernetes 功能强大,但它的 YAML 清单就像看油漆干一样无聊。这时,Helm 出现了,作为 Kubernetes 的包管理器,来拯救我们的理智。可以把它想象成 Kubernetes 的 npm,但少了些存在主义危机。

以下是 Helm 成为你新好朋友的原因:

  • 模板化:告别复制粘贴 YAML 文件!
  • 版本控制:比你说“哎呀”还快地回滚部署
  • 可重用性:分享你的图表,成为团队应得的英雄
  • 简化:用一个命令管理复杂的应用程序

为 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

这个 Job 将在你的主应用启动之前运行,确保你的数据库是最新的。

实现金丝雀部署

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 或 Operator 框架。但现在,拍拍自己的背——你已经迈出了驯服 Kubernetes 野兽的重要一步!

“能力越大,责任越大”——本叔叔,可能是在谈论 Helm 图表

进一步阅读和资源

现在,勇敢地去部署吧!记住,如果有人问起,你不仅仅是一个开发者——你是一个 Kubernetes 驯服者,一个 Helm 图表艺术家,一个 Quarkus 四分卫。祝编码愉快!