Helm Chart 部署 PHP 应用:配置 Ingress、ConfigMap 与 Persistent Volume 的模板化
大家好,今天我们来深入探讨如何使用 Helm Chart 部署 PHP 应用,并重点关注 Ingress、ConfigMap 和 Persistent Volume 的模板化配置。通过 Helm Chart,我们可以将复杂的 Kubernetes 部署过程进行封装,实现应用的快速部署、升级和回滚。本次讲座将以实例驱动,从零开始构建一个可复用的 PHP 应用 Helm Chart。
1. Helm Chart 基础:目录结构与核心文件
首先,我们需要了解 Helm Chart 的基本结构。一个典型的 Helm Chart 目录结构如下:
my-php-app/
├── Chart.yaml # Chart 的元数据信息
├── values.yaml # Chart 的默认配置值
├── templates/ # Kubernetes 资源模板
│ ├── deployment.yaml
│ ├── service.yaml
│ ├── ingress.yaml
│ ├── configmap.yaml
│ └── persistentvolumeclaim.yaml
└── README.md # Chart 的说明文档
- Chart.yaml: 包含 Chart 的名称、版本、描述等元数据信息。
- values.yaml: 定义 Chart 的默认配置值,这些值可以在部署时被覆盖。
- templates/: 存放 Kubernetes 资源的模板文件,使用 Go 模板语言进行编写。这些模板文件会被 Helm 渲染成最终的 Kubernetes 资源定义。
- README.md: 提供 Chart 的使用说明和配置指南。
2. 创建基础 Helm Chart
我们首先创建一个名为 my-php-app 的 Helm Chart:
helm create my-php-app
然后,我们需要修改 Chart.yaml 文件,添加一些基本的元数据信息:
apiVersion: v2
name: my-php-app
description: A Helm chart for deploying a PHP application.
type: application
version: 0.1.0
appVersion: 7.4 # PHP 版本示例
3. 配置 PHP 应用 Deployment
接下来,我们修改 templates/deployment.yaml 文件,配置 PHP 应用的 Deployment。我们需要使用 values.yaml 中的值来动态配置 Deployment 的参数,例如镜像名称、副本数量、资源限制等。
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "my-php-app.fullname" . }}
labels:
{{- include "my-php-app.labels" . | nindent 4 }}
spec:
{{- if not .Values.autoscaling.enabled }}
replicas: {{ .Values.replicaCount }}
{{- end }}
selector:
matchLabels:
{{- include "my-php-app.selectorLabels" . | nindent 6 }}
template:
metadata:
{{- with .Values.podAnnotations }}
annotations:
{{- toYaml . | nindent 8 }}
{{- end }}
labels:
{{- include "my-php-app.selectorLabels" . | nindent 8 }}
spec:
{{- with .Values.imagePullSecrets }}
imagePullSecrets:
{{- toYaml . | nindent 8 }}
{{- end }}
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
ports:
- name: http
containerPort: 80
protocol: TCP
livenessProbe:
httpGet:
path: /index.php
port: http
readinessProbe:
httpGet:
path: /index.php
port: http
resources:
{{- toYaml .Values.resources | nindent 12 }}
volumeMounts:
- name: php-config
mountPath: /usr/local/etc/php/conf.d/
- name: php-data
mountPath: /var/www/html/data
volumes:
- name: php-config
configMap:
name: {{ include "my-php-app.fullname" . }}-php-config
- name: php-data
persistentVolumeClaim:
claimName: {{ include "my-php-app.fullname" . }}-php-data
在这个 Deployment 模板中,我们使用了以下 values.yaml 中的配置:
replicaCount: Deployment 的副本数量。image.repository: PHP 应用的镜像仓库。image.tag: PHP 应用的镜像标签。image.pullPolicy: 镜像拉取策略。resources: 容器的资源限制(CPU 和内存)。podAnnotations: Pod 的注解
4. 配置 PHP 应用 Service
接下来,我们修改 templates/service.yaml 文件,配置 PHP 应用的 Service。
apiVersion: v1
kind: Service
metadata:
name: {{ include "my-php-app.fullname" . }}
labels:
{{- include "my-php-app.labels" . | nindent 4 }}
spec:
type: {{ .Values.service.type }}
ports:
- port: {{ .Values.service.port }}
targetPort: http
protocol: TCP
name: http
selector:
{{- include "my-php-app.selectorLabels" . | nindent 4 }}
在这个 Service 模板中,我们使用了以下 values.yaml 中的配置:
service.type: Service 的类型(例如:ClusterIP,NodePort,LoadBalancer)。service.port: Service 的端口。
5. 配置 Ingress (可选,但通常需要)
Ingress 允许我们通过外部网络访问集群内部的服务。修改 templates/ingress.yaml 文件,配置 Ingress 规则。
{{- if .Values.ingress.enabled -}}
{{- $fullName := include "my-php-app.fullname" . -}}
{{- $ingressPath := .Values.ingress.path -}}
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: {{ $fullName }}
labels:
{{- include "my-php-app.labels" . | nindent 4 }}
{{- with .Values.ingress.annotations }}
annotations:
{{- toYaml . | nindent 4 }}
{{- end }}
spec:
{{- if .Values.ingress.tls }}
tls:
{{- range .Values.ingress.tls }}
- hosts:
- {{ .host }}
secretName: {{ .secretName }}
{{- end }}
{{- end }}
rules:
- host: {{ .Values.ingress.host | quote }}
http:
paths:
- path: {{ $ingressPath }}
pathType: ImplementationSpecific
backend:
service:
name: {{ $fullName }}
port:
name: http
{{- end }}
在这个 Ingress 模板中,我们使用了以下 values.yaml 中的配置:
ingress.enabled: 是否启用 Ingress。ingress.annotations: Ingress 的注解。ingress.tls: TLS 配置(HTTPS)。ingress.host: 域名。ingress.path: 路径。
6. 配置 ConfigMap
ConfigMap 用于存储配置数据,例如 PHP 的配置文件。创建 templates/configmap.yaml 文件,配置 ConfigMap。
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ include "my-php-app.fullname" . }}-php-config
labels:
{{- include "my-php-app.labels" . | nindent 4 }}
data:
php.ini: |
memory_limit = {{ .Values.phpConfig.memoryLimit }}
upload_max_filesize = {{ .Values.phpConfig.uploadMaxFilesize }}
post_max_size = {{ .Values.phpConfig.postMaxSize }}
在这个 ConfigMap 模板中,我们使用了以下 values.yaml 中的配置:
phpConfig.memoryLimit: PHP 的内存限制。phpConfig.uploadMaxFilesize: 上传文件大小限制。phpConfig.postMaxSize: POST 数据大小限制。
7. 配置 Persistent Volume Claim (PVC)
Persistent Volume Claim (PVC) 用于申请持久化存储。创建 templates/persistentvolumeclaim.yaml 文件,配置 PVC。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: {{ include "my-php-app.fullname" . }}-php-data
labels:
{{- include "my-php-app.labels" . | nindent 4 }}
spec:
accessModes:
- {{ .Values.persistence.accessMode }}
resources:
requests:
storage: {{ .Values.persistence.size }}
storageClassName: {{ .Values.persistence.storageClass }}
在这个 PVC 模板中,我们使用了以下 values.yaml 中的配置:
persistence.accessMode: 访问模式(例如:ReadWriteOnce,ReadWriteMany)。persistence.size: 存储大小。persistence.storageClass: 存储类。
8. 修改 values.yaml 文件
现在,我们需要修改 values.yaml 文件,定义 Chart 的默认配置值。
replicaCount: 1
image:
repository: your-dockerhub-username/my-php-app
pullPolicy: IfNotPresent
tag: "latest"
imagePullSecrets: []
nameOverride: ""
fullnameOverride: ""
serviceAccount:
create: true
annotations: {}
name: ""
podAnnotations: {}
podSecurityContext: {}
# fsGroup: 2000
securityContext: {}
# capabilities:
# drop:
# - ALL
# readOnlyRootFilesystem: true
# runAsNonRoot: true
# runAsUser: 1000
service:
type: ClusterIP
port: 80
ingress:
enabled: false
annotations: {}
# kubernetes.io/ingress.class: nginx
# kubernetes.io/tls-acme: "true"
host: chart-example.local
path: /
tls: []
# - secretName: chart-example-tls
# hosts:
# - chart-example.local
resources:
limits:
cpu: 200m
memory: 256Mi
requests:
cpu: 100m
memory: 128Mi
autoscaling:
enabled: false
minReplicas: 1
maxReplicas: 100
targetCPUUtilizationPercentage: 80
# targetMemoryUtilizationPercentage: 80
phpConfig:
memoryLimit: 128M
uploadMaxFilesize: 20M
postMaxSize: 20M
persistence:
enabled: true
accessMode: ReadWriteOnce
size: 1Gi
storageClass: standard # 或者您集群中可用的存储类名称
请根据您的实际情况修改 values.yaml 中的配置,例如镜像仓库、镜像标签、资源限制、PHP 配置等。特别是 persistence.storageClass,需要设置成您 Kubernetes 集群中可用的存储类。
9. 部署 Helm Chart
现在,我们可以使用 Helm 部署我们的 PHP 应用了。
helm install my-php-app ./my-php-app
或者,如果您想覆盖 values.yaml 中的默认配置,可以使用 -f 参数指定一个自定义的配置文件:
helm install my-php-app ./my-php-app -f my-values.yaml
10. 测试与验证
部署完成后,我们可以使用 kubectl 命令来查看 Deployment、Service、Ingress、ConfigMap 和 PVC 的状态:
kubectl get deployments
kubectl get services
kubectl get ingresses
kubectl get configmaps
kubectl get persistentvolumeclaims
如果 Ingress 配置正确,我们可以通过浏览器访问 ingress.host 来访问我们的 PHP 应用。
11. 升级 Helm Chart
如果我们需要更新 PHP 应用的配置或代码,可以修改 values.yaml 文件或镜像标签,然后使用 helm upgrade 命令来升级 Helm Chart:
helm upgrade my-php-app ./my-php-app -f my-values.yaml
12. 回滚 Helm Chart
如果升级过程中出现问题,可以使用 helm rollback 命令来回滚到之前的版本:
helm history my-php-app # 查看发布历史
helm rollback my-php-app <revision> # 回滚到指定的 revision
代码总结:将配置与部署分离,实现灵活的应用部署
通过这次讲座,我们学习了如何使用 Helm Chart 部署 PHP 应用,并重点关注了 Ingress、ConfigMap 和 Persistent Volume 的模板化配置。通过 Helm Chart,我们可以将复杂的 Kubernetes 部署过程进行封装,实现应用的快速部署、升级和回滚。通过模板化配置,我们可以灵活地调整应用的参数,以适应不同的环境和需求。
现在,我们回顾一下关键代码片段:
- Deployment 模板: 使用
.Values来动态配置镜像、副本数量和资源限制。 - Service 模板: 使用
.Values来配置 Service 的类型和端口。 - Ingress 模板: 使用
.Values来配置域名、路径和 TLS。 - ConfigMap 模板: 使用
.Values来配置 PHP 的参数。 - PVC 模板: 使用
.Values来配置存储大小和存储类。
灵活配置的 Helm Chart:简化部署,方便管理
通过本次实践,我们创建了一个可复用的 PHP 应用 Helm Chart,并掌握了 Helm Chart 的基本使用方法。希望大家能够将 Helm Chart 应用到实际的项目中,简化应用的部署和管理。