Einführung
Der Betrieb einer mandantenfähigen Webanwendung auf Kubernetes bringt zahlreiche Vorteile mit sich, führt aber auch zu Komplexität, insbesondere bei der Implementierung von SSL-Terminierung und Ratenbegrenzung. Dieser Leitfaden führt Sie durch fortgeschrittene Schritte zur Fehlerbehebung, um einen reibungslosen und sicheren Betrieb Ihrer Anwendung zu gewährleisten.
Szenario
Sie verwalten eine mandantenfähige Webanwendung in einem Kubernetes-Cluster mit benutzerdefinierten Domänen für jeden Mandanten. Ein NGINX Ingress Controller übernimmt die SSL-Terminierung und die Ratenbegrenzung. Kürzlich wurde ein neuer Tenant hinzugefügt, aber der Datenverkehr wird nicht korrekt zum Service des Tenants geleitet, und die SSL-Terminierung und die Ratenbegrenzung funktionieren nicht.
Einrichtung
- Kubernetes-Cluster: Betrieb bei einem Cloud-Anbieter (z. B. GKE, EKS oder AKS)
- NGINX Ingress Controller: Installiert und konfiguriert für SSL und Ratenbegrenzung
- Ingress-Ressourcen: Definiert für das Routing mehrerer benutzerdefinierter Domains mit SSL-Terminierung und Ratenbegrenzung
- Dienste: Separater Dienst für jeden Mandanten innerhalb des Clusters
- Cert-Manager: Verwaltet SSL-Zertifikate automatisch
- ConfigMap und Annotationen: Benutzerdefinierte Konfigurationen für den Ingress-Controller
Beispiel für eine Ingress-Konfiguration
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: multi-tenant-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/ssl-redirect: "true"
nginx.ingress.kubernetes.io/use-regex: "true"
nginx.ingress.kubernetes.io/limit-rps: "10"
nginx.ingress.kubernetes.io/limit-burst-multiplier: "3"
cert-manager.io/cluster-issuer: "letsencrypt-prod"
spec:
tls:
- hosts:
- tenant1.example.com
- tenant2.example.com
- tenant3.example.com
secretName: multi-tenant-tls
rules:
- host: tenant1.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: tenant1-service
port:
number: 80
- host: tenant2.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: tenant2-service
port:
number: 80
- host: tenant3.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: tenant3-service
port:
number: 80
Problem: Datenverkehr wird für einen neuen Mieter mit SSL und Ratenbegrenzung nicht korrekt weitergeleitet
Obwohl alles korrekt konfiguriert ist, erreicht der Datenverkehr für die Domain des neuen Mandanten (tenant3.example.com) nicht den vorgesehenen Dienst (tenant3-service). Außerdem funktionieren die SSL-Terminierung und die Ratenbegrenzung nicht wie erwartet.
Erweiterte Schritte zur Fehlersuche
1. Überprüfen der DNS-Konfiguration
- Stellen Sie sicher, dass der DNS-Eintrag für
tenant3.example.comzeigt auf die externe IP-Adresse des Ingress-Controllers
- Verwenden Sie Tools wie
nslookupoderdigum die DNS-Konfiguration zu bestätigen
nslookup tenant3.example.com
dig tenant3.example.com
2. Status des SSL-Zertifikats prüfen
Überprüfen Sie, ob das SSL-Zertifikat für tenant3.example.com korrekt ausgestellt und mit der Ingress-Ressource verbunden ist.
kubectl describe certificate tenant3-cert
3. Prüfen Sie die Logs des Ingress Controllers:
- Greifen Sie auf die Protokolle des NGINX-Ingress-Controllers zu, um nach Fehlern oder Fehlkonfigurationen zu suchen.
- Beispielbefehl:
kubectl logs -n ingress-nginx <pod-ingress-controller>
4. Inspektion der Ingress-Ressource
- Stellen Sie sicher, dass die Ingress-Ressource für tenant3.example.com korrekt definiert und angewendet wird.
- Beispielbefehl zum Anzeigen der Ingress-Ressource:
kubectl get ingress multi-tenant-ingress -o yaml
5. Servicestatus prüfen:
Vergewissern Sie sich, dass der tenant3-Dienst läuft und innerhalb des Clusters erreichbar ist.
kubectl get service tenant3-service
6. Testen Sie die interne Konnektivität:
Verwenden Sie einen temporären Pod, um die Konnektivität mit dem tenant3-Dienst innerhalb des Clusters zu testen.
kubectl run curlpod --image=radial/busyboxplus:curl -i --tty
curl http://tenant3-service
7. Prüfen Sie Ingress-Regeln und Anmerkungen
Stellen Sie sicher, dass keine Konflikte oder Fehlkonfigurationen in den Ingress-Regeln und -Anmerkungen vorliegen.
8. Überprüfung der NGINX-Konfiguration
Überprüfen Sie die vom Ingress-Controller generierte NGINX-Konfiguration auf Anomalien.
kubectl exec -it <nginx-ingress-controller-pod> -- cat /etc/nginx/nginx.conf
9. Überprüfen Sie die Konfiguration der Ratenbegrenzung
Stellen Sie sicher, dass die Anmerkungen zur Ratenbegrenzung korrekt angewendet werden und nicht mit anderen Einstellungen in Konflikt geraten.
10. Überprüfen Sie die Netzwerkrichtlinien
Stellen Sie sicher, dass die Netzwerkrichtlinien den Verkehr zwischen dem Ingress-Controller und dem tenant3-Service zulassen.
11. Aktualisieren Sie die Ingress Annotations
Fügen Sie spezifische Anmerkungen hinzu, um Routing-Probleme zu beheben oder zu entschärfen.
nginx.ingress.kubernetes.io/ssl-redirect: "false"
12. Debug-Protokollierung einschalten
Erhöhen Sie die Protokollstufe des NGINX Ingress-Controllers, um detailliertere Informationen zu erhalten.
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-configuration
namespace: ingress-nginx
data:
log-level: debug
Schlussfolgerung
Wenn Sie diese Schritte zur erweiterten Fehlerbehebung befolgen, können Sie Probleme mit dem Traffic-Routing, der SSL-Terminierung und der Ratenbegrenzung für Ihre mandantenfähige Webanwendung auf Kubernetes identifizieren und beheben. Eine ordnungsgemäße DNS-Konfiguration, korrekte Ingress-Ressourcendefinitionen, eine detaillierte SSL-Zertifikatsverwaltung und eine gründliche Fehlerbehebung sind entscheidend für einen reibungslosen und sicheren Betrieb.
Entdecken Sie die Dienstleistungen von ITGix und erfahren Sie mehr über unser Know-how.