پرش به محتویات

شب ۲۱: Ingress و IngressRoute در Kubernetes

بخش ۲۱ از مجموعهٔ آموزش Traefik در ۳۰ شب؛ هر جلسه برای ۶۰ تا ۹۰ دقیقه مطالعه، تمرین عملی، بررسی نتیجه و تمرین رفع خرابی طراحی شده است. مثال‌ها مطابق منبع با Traefik Proxy v3.7 نوشته شده‌اند؛ برای محیط عملیاتی نسخهٔ اصلاحی آزموده‌شده یا digest مشخصی را ثابت کنید. تمرین‌ها را روی میزبان یا کلاستر آزمایشگاهی اجرا کنید.

فهرست کامل دورهٔ ترافیک در ۳۰ شب

هدف‌های یادگیری

  • مسیریابی برنامه با Ingress استاندارد و CRDهای Traefik.
  • اعمال میان‌افزار و درک فضای نام Kubernetes و ارائه‌دهنده.
  • عیب‌یابی مسیر با وضعیت، رویداد، لاگ، Service و EndpointSlice.

تمرین عملی: بار کاری و Ingress استاندارد

apiVersion: v1
kind: Namespace
metadata: {name: apps}
---
apiVersion: apps/v1
kind: Deployment
metadata: {name: whoami, namespace: apps}
spec:
  replicas: 2
  selector: {matchLabels: {app: whoami}}
  template:
    metadata: {labels: {app: whoami}}
    spec:
      containers:
        - name: whoami
          image: traefik/whoami:v1.11
          ports: [{name: http, containerPort: 80}]
          readinessProbe: {httpGet: {path: /, port: http}, periodSeconds: 5}
---
apiVersion: v1
kind: Service
metadata: {name: whoami, namespace: apps}
spec:
  selector: {app: whoami}
  ports: [{name: http, port: 80, targetPort: http}]
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: whoami-standard
  namespace: apps
  annotations:
    traefik.ingress.kubernetes.io/router.entrypoints: web
spec:
  ingressClassName: traefik
  rules:
    - host: whoami.k8s.example.test
      http:
        paths:
          - path: /
            pathType: Prefix
            backend: {service: {name: whoami, port: {name: http}}}

گزینهٔ جایگزین CRD همراه میان‌افزار:

apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata: {name: security, namespace: apps}
spec:
  headers: {contentTypeNosniff: true, frameDeny: true}
---
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata: {name: whoami-crd, namespace: apps}
spec:
  entryPoints: [web]
  routes:
    - kind: Rule
      match: Host(`whoami-crd.k8s.example.test`)
      priority: 100
      middlewares: [{name: security}]
      services: [{name: whoami, port: 80}]
kubectl apply -f routes.yaml
kubectl -n apps rollout status deploy/whoami
kubectl -n apps get pod,svc,endpointslice,ingress,ingressroute,middleware
kubectl -n apps describe ingress whoami-standard
kubectl -n apps describe ingressroute whoami-crd
kubectl -n traefik logs deploy/traefik --since=5m
curl -I --resolve whoami.k8s.example.test:80:127.0.0.1 http://whoami.k8s.example.test/
curl -I --resolve whoami-crd.k8s.example.test:80:127.0.0.1 http://whoami-crd.k8s.example.test/

اگر کلاستر به loopback نگاشت نشده است، 127.0.0.1 را با آدرس ورودی یا متعادل‌کنندهٔ بار جایگزین کنید.

تمرین‌های خرابی

  • پورت Service را اشتباه تعیین کنید و خطای کنترلر و نتیجهٔ HTTP را مقایسه کنید.
  • selector را نامنطبق کنید و endpointهای خالی EndpointSlice را ببینید.
  • ingressClassName را اشتباه بگذارید و مالکیت مسیر را مشاهده کنید.
  • به Middleware ناموجود ارجاع دهید و وضعیت IngressRoute و لاگ‌ها را بررسی کنید.
  • تنظیمات را برگردانید و هدرها و پاسخ 200 را تأیید کنید.

نکته‌های عیب‌یابی

  • خطای 404: ingress class، entrypoint، Host و Path، وضعیت منبع و مالکیت کنترلر را بررسی کنید.
  • خطای 502 یا 503: پورت Service، selector، podهای آماده و EndpointSliceها را بررسی کنید.
  • خطای میان‌افزار: نسخهٔ CRD، namespace و نام و لاگ کنترلر را بررسی کنید.

خودآزمایی

  1. ارجاع Middleware بدون namespace به کدام فضای نام تعلق دارد؟ فضای نام IngressRoute.
  2. EndpointSlice خالی چه معنایی دارد؟ Service هیچ endpoint مربوط به pod آماده و منطبق ندارد.
  3. چرا مثال Ingress استاندارد و CRD را جدا نگه می‌داریم؟ قابلیت جابه‌جایی و مجموعهٔ امکانات متفاوتی دارند.
  4. اثبات کنید: هر دو مسیر پاسخ 200 می‌دهند و مسیر CRD هدر امنیتی اضافه می‌کند.