Transformar un proyecto en el método de implementación de Helm Chart

Notas de práctica

En la actualidad, hay un proyecto redis maestro-esclavo implementado en kubernetes. Si quiero distribuir este proyecto a otras personas, la práctica habitual es entregar los archivos de configuración y la documentación relevantes, lo que trae ciertos problemas. Deje que otros comiencen el proyecto directamente con un solo comando, sin tener que hacer muchas otras operaciones adicionales, algunas, esa es la popular herramienta de administración de paquetes actual: Helm, permítanme practicar cómo transformar el proyecto en línea.

El objeto del proyecto de la transformación puede hacer referencia a este documento:
Kubernetes Deploying Redis Master-Slave Service (StatefulSet)
https://blog.51cto.com/4073279/2676397

Pasos practicos

  1. Crear un paquete de archivos de plantilla
    $ helm create redis-ms
    $ cd redis-ms 
    $ rmdir charts
    #删除这些文件
    $ rm -f deployment.yaml hpa.yaml ingress.yaml serviceaccount.yaml NOTES.txt 
    $rm -rf tests
    #最后的项目结构
    $ tree -L 2
    .
    ├── Chart.yaml
    ├── templates
    │   ├── _helpers.tpl
    │   ├── NOTES.txt
    │   ├── service.yaml
    │   └── tests
    └── values.yaml
  2. Análisis
    1) Primero analice qué campos se pueden reutilizar y cambiar fácilmente, luego póngalos en values.yaml como valores de variable
    • Nombre de la aplicación
    • Nombre de etiqueta
    • Nombre del espejo
    • Número de copias
    • Límite de recursos de POD
    • HPA

2) Si se trata de una gran parte de contenido, como el script utilizado, colóquelo en el archivo _helpers.tpl como valor de plantilla

Por ejemplo: el contenido de Configmap

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Values.appName }}-config
data:
  launch.sh: |
    #!/bin/bash

    PASSWORD=$(cat /etc/redis-passwd/passwd)

    if [ "${HOSTNAME}" == "redis-0" ]
    then
      redis-server --requirepass ${PASSWORD}
    else
      redis-server --slaveof redis-0.redis 6379 --masterauth ${PASSWORD} --requirepass ${PASSWORD}
    fi
....
  1. Operación de modificación
    1) Complete el contenido del archivo values.yaml
#APP名称
appName: redis
#标签
labels: redis
#副本数
replicaCount: 2
#镜像资源配置
image:
  repository:  redis
  pullPolicy: IfNotPresent
  tag: "5-alpine"
imagePullSecrets: []
#Service资源配置
service:
  type: None
  port: 6379

#POD资源限制
resources: 
  enabled: false 
  limits:
    cpu: 100m
    memory: 128Mi
  requests:
    cpu: 100m
    memory: 128Mi
#redis密码
redis:
  passwd: password

2) Transformar el servicio

$ cat templates/service.yaml 
apiVersion: v1
kind: Service
metadata:
  name: {{ .Values.appName }}
  labels:
    app: {{ .Values.labels }}
spec:
  ports:
  - port: {{ .Values.service.port }}
    name: redis
  #StatefulSet资源Service默认是没有集群IP的
  clusterIP: None
  selector:
    app: {{ .Values.labels }}

3) Modificar mapa de configuración

$ cat redis-ms/templates/configmap.yaml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Values.appName }}-config
data:
  {{- include "launch" . |indent 2}}

4) Modifique el secreto y escriba la contraseña en values.yaml

$ cat redis-ms/templates/secret.yaml 
apiVersion: v1
kind: Secret
metadata:
  name: redis-passwd
stringData:
  passwd: {{ .Values.redis.passwd }}

5) Transformar statefulset

$ cat redis-ms/templates/statefulset.yaml 
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: {{ .Values.appName }}
spec:
  serviceName: {{ .Values.appName }}
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app: {{ .Values.labels }}
  template:
    metadata:
      labels:
        app: {{ .Values.labels }}
    spec:
      containers:
      - name: {{ .Values.appName }}
        image:{{ .Values.image.repository }}:{{ .Values.image.tag }}
        ports:
        - containerPort: 6379
        volumeMounts:
        - name: data
          mountPath: /data
        - name: script
          mountPath: /script/launch.sh
          subPath: launch.sh
        - name: passwd-volume
          mountPath: /etc/redis-passwd
        command:
        - sh
        - -c
        - sleep 10 && sh /script/launch.sh
      {{- if .Values.resources.enabled }}
        resources:
          limits: 
            cpu: {{ .Values.resources.limits.cpu }}
            memory: {{ .Values.resources.limits.memory }}
          requests:
            cpu:  {{ .Values.resources.requests.cpu }}
            memory: {{ .Values.resources.requests.memory }}
      {{ end }}
      volumes:
      - name: script
        configMap:
          name: redis-config
          defaultMode: 0777
      - name: passwd-volume
        secret:
          secretName: redis-passwd
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: ["ReadWriteOnce"]
      resources:
        requests:
          storage: 1Gi

6) Verificación y empaque

#语法验证,主要是渲染输出,检查是否有异常问题
$ helm install redis-ms -n  developer --dry-run redis-ms/ 
#部署
$ helm install redis-ms -n  developer  redis-ms/ 
#将项目打包,然后就可以将redis-ms-0.1.0.tgz发给他人
$ helm package redis-ms
Successfully packaged chart and saved it to: /root/redis-slave-statefulset/redis-ms-0.1.0.tgz
#通过一条命令启动项目,看,是不是很方便
$ helm install redis-ms redis-ms-0.1.0.tgz -n developer
NAME: redis-ms
LAST DEPLOYED: Wed Mar 31 10:16:02 2021
NAMESPACE: developer
STATUS: deployed
REVISION: 1
TEST SUITE: None
$ helm list -n developer
NAME        NAMESPACE   REVISION    UPDATED                                 STATUS      CHART           APP VERSION
redis-ms    developer   1           2021-03-31 10:16:02.690429125 +0800 CST deployed    redis-ms-0.1.0  1.16.0
$ kubectl logs -f redis-0 -n developer
9:C 31 Mar 2021 02:16:23.867 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
9:C 31 Mar 2021 02:16:23.867 # Redis version=5.0.10, bits=64, commit=00000000, modified=0, pid=9, just started
9:C 31 Mar 2021 02:16:23.867 # Configuration loaded
9:M 31 Mar 2021 02:16:23.868 * Running mode=standalone, port=6379.
9:M 31 Mar 2021 02:16:23.868 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
9:M 31 Mar 2021 02:16:23.868 # Server initialized
9:M 31 Mar 2021 02:16:23.868 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
9:M 31 Mar 2021 02:16:23.869 * DB loaded from disk: 0.001 seconds
9:M 31 Mar 2021 02:16:23.869 * Ready to accept connections
9:M 31 Mar 2021 02:16:25.881 * Replica 10.244.1.126:6379 asks for synchronization
9:M 31 Mar 2021 02:16:25.881 * Partial resynchronization not accepted: Replication ID mismatch (Replica asked for '75640cf19c78b679a8e581b84c2b05855d17c931', my replication IDs are '6ad76548f491d5547947835322c98520c843c0c0' and '0000000000000000000000000000000000000000')
9:M 31 Mar 2021 02:16:25.881 * Starting BGSAVE for SYNC with target: disk
9:M 31 Mar 2021 02:16:25.881 * Background saving started by pid 13
13:C 31 Mar 2021 02:16:25.883 * DB saved on disk
13:C 31 Mar 2021 02:16:25.883 * RDB: 0 MB of memory used by copy-on-write
9:M 31 Mar 2021 02:16:25.979 * Background saving terminated with success
9:M 31 Mar 2021 02:16:25.980 * Synchronization with replica 10.244.1.126:6379 succeeded

Resumen de práctica

El proceso de transformar el método de implementación de proyectos en el método de instalación de Helm es también mi revisión de Helm. Helm es realmente muy simple. El núcleo principal es pensar y analizar los proyectos actuales comunes, cambiantes, estables e invariables. Extraerlos y luego compílelos, complételos y mejórelos con algunas características funcionales proporcionadas por Helm, como plantillas, bucles, juicios, etc.

Adjunte el paquete completo de gráficos: Enlace: https://share.weiyun.com/X8JzQY5l Contraseña: uik42u

Supongo que te gusta

Origin blog.51cto.com/4073279/2678073
Recomendado
Clasificación