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 四分卫。祝编码愉快!