MCC - Implementación en cluster de Kubernetes utilizando Helm 3
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.