Helm Chart部署PHP应用:配置Ingress、ConfigMap与Persistent Volume的模板化

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 应用到实际的项目中,简化应用的部署和管理。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注