MCC - Implementación en cluster de Kubernetes utilizando Helm 3

De MCC™ Wiki

Crear un Chart de Helm para una aplicación HTML5

Vamos a crear un Chart de Helm 3 para desplegar una aplicación HTML5 en un clúster de Kubernetes, utilizando una imagen Docker y exponiendo el servicio en el puerto 80 mediante un LoadBalancer.

1. Estructura del Chart de Helm

Primero, creamos la estructura básica del Chart:

helm create my-html-app

Esto creará la siguiente estructura de carpetas dentro del directorio **my-html-app**:

my-html-app/
  ├── charts/
  ├── templates/
  │   ├── deployment.yaml
  │   ├── service.yaml
  │   └── _helpers.tpl
  ├── values.yaml
  ├── Chart.yaml
  └── .helmignore

2. Edición de los archivos del Chart

a. Chart.yaml

Modifica el archivo **Chart.yaml** para reflejar tu proyecto:

apiVersion: v2
name: k8s-maxiscomputers
description: A Helm chart for deploying the k8s-maxiscomputers HTML5 website
version: 0.1.0
appVersion: "1.0.0"

b. values.yaml

Modifica **values.yaml** para configurar los valores predeterminados:

# values.yaml

image:
  repository: malejo/maxiscomputers.com
  tag: "latest"
  pullPolicy: IfNotPresent

imagePullSecrets:
  - name: my-dockerhub-secret

replicaCount: 2

service:
  type: LoadBalancer
  port: 80

namespace: maxiscomputers

ingress:
  enabled: false
  annotations: {}
  hosts:
    - host: k8s-maxiscomputers.com
      paths: []

resources: {}
nodeSelector: {}
tolerations: []
affinity: []

Ajusta los valores de **image.repository** y **image.tag** para que apunten a tu imagen Docker en Docker Hub.

c. templates/deployment.yaml

Este archivo define el Deployment de Kubernetes:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "k8s-maxiscomputers.fullname" . }}
  labels:
    app: {{ include "k8s-maxiscomputers.name" . }}
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app: {{ include "k8s-maxiscomputers.name" . }}
  template:
    metadata:
      labels:
        app: {{ include "k8s-maxiscomputers.name" . }}
    spec:
      containers:
        - name: {{ include "k8s-maxiscomputers.name" . | replace "." "-" | lower }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          ports:
            - containerPort: 80
          resources:
            {{- toYaml .Values.resources | nindent 12 }}
      imagePullSecrets:
        - name: my-dockerhub-secret
      {{- with .Values.nodeSelector }}
      nodeSelector:
        {{- toYaml . | nindent 8 }}
      {{- end }}
      {{- with .Values.affinity }}
      affinity:
        {{- toYaml . | nindent 8 }}
      {{- end }}
      {{- with .Values.tolerations }}
      tolerations:
        {{- toYaml . | nindent 8 }}
      {{- end }}

d. templates/service.yaml

El archivo **service.yaml** define el Servicio de Kubernetes:

apiVersion: v1
kind: Service
metadata:
  name: k8s-maxiscomputers
  namespace: maxiscomputers
spec:
  type: NodePort
  ports:
    - port: 80
      targetPort: 80
      nodePort: 31380
  selector:
    app: k8s-maxiscomputers

e. templates/_helpers.tpl

El archivo **_helpers.tpl** define:

{{- /*
Expand the name of the chart.
*/ -}}
{{- define "k8s-maxiscomputers.name" -}}
{{- .Chart.Name | lower -}}
{{- end -}}

{{- /*
Create a full name for the resources based on the name of the chart and the namespace.
*/ -}}
{{- define "k8s-maxiscomputers.fullname" -}}
{{- printf "%s-%s" .Release.Name (include "k8s-maxiscomputers.name" .) | lower -}}
{{- end -}}

{{- /*
Create a name for the chart release.
*/ -}}
{{- define "k8s-maxiscomputers.chart" -}}
{{- .Chart.Name | lower -}}
{{- end -}}

f. templates/ingress.yml

El archivo **ingress.yml** define el Ingress con NGINX para exponer el servicio:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: k8s-maxiscomputers-ingress
  namespace: maxiscomputers
  annotations:
    cert-manager.io/cluster-issuer: "letsencrypt-prod"
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
    nginx.ingress.kubernetes.io/rewrite-target: /
    kubernetes.io/ingress.class: "nginx"  # Asegúrate de usar la clase correcta
spec:
  rules:
  - host: domus.maxiscomputers.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: k8s-maxiscomputers
            port:
              number: 80
  tls:
  - hosts:
    - domus.maxiscomputers.com
    secretName: domus-tls

3. Personalizar tu Chart con Variables

Puedes ajustar los valores en el archivo **values.yaml** para personalizar el despliegue, como el número de réplicas, recursos de CPU y memoria, etc.

4. Desplegar el Chart en Kubernetes

Para desplegar el Chart en Kubernetes, ejecuta:

Creación namespace para implementación:

kubectl create namespace maxiscomputers.com

Creación de secrets para imágenes de la implementación:

kubectl create secret docker-registry my-dockerhub-secret \
  --docker-server=https://index.docker.io/v1/ \
  --docker-username=<tu-usuario> \
  --docker-password=<tu-password> \
  --docker-email=<tu-email> \
  --namespace maxiscomputers

Comando implementación Helm 3:

helm install k8s-maxiscomputers ./k8s-maxiscomputers --namespace maxiscomputers

Esto creará el Deployment y el Servicio en tu clúster de Kubernetes.

5. Verificar el Despliegue

Para verificar el estado del Deployment:

kubectl get deployments

Para verificar el estado del Servicio:

kubectl get svc

Una vez que el Servicio tenga una **EXTERNAL-IP**, podrás acceder a tu aplicación HTML5 mediante esa dirección IP pública.

6. Actualizar o Eliminar el Chart

Para actualizar el Chart después de hacer cambios:

helm upgrade my-html-app ./my-html-app

Para eliminar el Chart de Kubernetes:

helm uninstall my-html-app

Este Chart de Helm te permitirá desplegar tu aplicación HTML5 en Kubernetes de manera fácil y eficiente.

7. Exponer al mundo el sitio web