تخطَّ إلى المحتوى

TLS مع Ingress و cert-manager

ستفهم كيف يربط Ingress بين host و Secret يحتوي certificate، وكيف يستخدم cert-manager Issuer أو ClusterIssuer لإدارة TLS.

TLS في Ingress يحتاج Secret من نوع kubernetes.io/tls. cert-manager يستطيع إنشاء هذا Secret وتجديده تلقائيا من جهة إصدار مثل Let’s Encrypt.

flowchart LR
I[Ingress] --> C[Certificate]
C --> CI[ClusterIssuer]
CI --> CA[Certificate Authority]
C --> S[TLS Secret]
S --> IC[Ingress Controller]

cluster-issuer.yaml:

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: admin@example.com
privateKeySecretRef:
name: letsencrypt-prod
solvers:
- http01:
ingress:
class: nginx

ingress-tls.yaml:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
ingressClassName: nginx
tls:
- hosts:
- web.example.com
secretName: web-tls
rules:
- host: web.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web
port:
name: http
Terminal window
kubectl apply -f cluster-issuer.yaml
kubectl apply -f ingress-tls.yaml
kubectl get certificate
kubectl describe certificate web-tls
kubectl get secret web-tls

Expected output:

NAME READY SECRET AGE
web-tls True web-tls 2m

Lab: فحص TLS readiness

المستوى: مبتدئ الوقت: 30 دقيقة الأدوات: kubectl

الهدف: قراءة Certificate و Secret وتشخيص سبب فشل الإصدار.

  • cert-manager مثبت.
  • DNS حقيقي يشير إلى Ingress Controller إذا كنت ستستخدم Let’s Encrypt فعليا.
Terminal window
kubectl get clusterissuer
kubectl get certificate
kubectl describe certificate web-tls
kubectl get challenges,orders
Status:
Conditions:
Type: Ready
Status: True
Terminal window
kubectl delete -f ingress-tls.yaml
kubectl delete -f cluster-issuer.yaml
المشكلةالسبب
Certificate لا يصبح ReadyDNS لا يشير إلى Ingress أو challenge يفشل
Secret غير موجودcert-manager لم يصدر الشهادة بعد
mixed content في browserالتطبيق يستخدم روابط HTTP داخل صفحة HTTPS