Come distribuire un Ingress con TLS
Questa guida spiega come esporre un'applicazione tramite HTTPS con un certificato TLS automatico su un cluster Kubernetes Hikube, utilizzando gli addon cert-manager e ingress-nginx.
Prerequisiti
- Un cluster Kubernetes Hikube distribuito (vedere l'avvio rapido)
kubectlconfigurato per interagire con l'API Hikube- Un nome di dominio che punta al vostro cluster (record DNS A o CNAME)
- Il kubeconfig del cluster figlio recuperato
Fasi
1. Attivare gli addon certManager e ingressNginx
Modificate la configurazione del vostro cluster per attivare gli addon necessari:
apiVersion: apps.cozystack.io/v1alpha1
kind: Kubernetes
metadata:
name: my-cluster
spec:
controlPlane:
replicas: 3
nodeGroups:
web:
minReplicas: 2
maxReplicas: 5
instanceType: "s1.large"
ephemeralStorage: 50Gi
roles:
- ingress-nginx
addons:
certManager:
enabled: true
ingressNginx:
enabled: true
hosts:
- app.example.com
Il campo hosts sotto ingressNginx definisce i domini per i quali l'Ingress Controller accettera il traffico. Potete utilizzare dei wildcard (*.example.com) per coprire più sottodomini.
2. Assegnare il ruolo ingress-nginx a un node group
Il node group che ospitera l'Ingress Controller deve avere il ruolo ingress-nginx nella sua configurazione. Verificate che il vostro node group sia correttamente configurato:
nodeGroups:
web:
minReplicas: 2
maxReplicas: 5
instanceType: "s1.large"
ephemeralStorage: 50Gi
roles:
- ingress-nginx
Dedicare un node group all'Ingress permette di isolare il traffico in entrata e dimensionare indipendentemente le risorse di esposizione HTTP/HTTPS.
3. Applicare la configurazione del cluster
kubectl apply -f cluster-ingress-tls.yaml
# Attendere che il cluster sia pronto
kubectl get kubernetes my-cluster -w
Verificate che gli addon siano distribuiti nel cluster figlio:
export KUBECONFIG=cluster-admin.yaml
# Verificare cert-manager
kubectl get pods -n cert-manager
# Verificare l'Ingress Controller
kubectl get pods -n ingress-nginx
# Recuperare l'IP esterno dell'Ingress Controller
kubectl get svc -n ingress-nginx ingress-nginx-controller
4. Creare un Ingress con TLS nel cluster figlio
Distribuite la vostra applicazione, poi create un Ingress con terminazione TLS automatica:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-app
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
ingressClassName: nginx
tls:
- hosts:
- app.example.com
secretName: app-tls
rules:
- host: app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-app
port:
number: 80
Applicate la configurazione nel cluster figlio:
kubectl apply -f ingress-tls.yaml
L'annotazione cert-manager.io/cluster-issuer: letsencrypt-prod indica a cert-manager di ottenere automaticamente un certificato Let's Encrypt per il dominio specificato.
5. Verificare il certificato
# Verificare lo stato del certificato
kubectl get certificate
# Risultato atteso
# NAME READY SECRET AGE
# app-tls True app-tls 2m
# Dettagli del certificato
kubectl describe certificate app-tls
Verifica
Testate l'accesso HTTPS alla vostra applicazione:
# Verificare l'Ingress
kubectl get ingress my-app
# Testare l'accesso HTTPS
curl -v https://app.example.com
Risultato atteso:
NAME CLASS HOSTS ADDRESS PORTS AGE
my-app nginx app.example.com 203.0.113.10 80, 443 5m
Il provisioning del certificato Let's Encrypt può richiedere alcuni minuti. Se il certificato rimane in stato False, verificate che il vostro record DNS punti correttamente verso l'IP dell'Ingress Controller e che la porta 80 sia accessibile (necessario per la validazione HTTP-01).
Per approfondire
- Riferimento API -- Configurazione degli addon
certManagereingressNginx - Concetti -- Architettura del cluster e componenti di rete
- Come configurare il networking -- Gestione avanzata della rete