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

شب ۲۲: Gateway API در Kubernetes

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

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

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

  • استفاده از GatewayClass، Gateway و HTTPRoute با مالکیت‌های مستقل.
  • محدودکردن اتصال مسیر و اعطای صریح مجوز ارجاع میان namespaceها.
  • عیب‌یابی منابع از روی شرایط وضعیت آن‌ها.

تمرین عملی

طبق نسخهٔ مبنای این آموزش، Traefik v3.7 از Gateway API v1.5.1 پشتیبانی می‌کند. در آزمایشگاه موقت، CRDهای استاندارد را فقط پس از بازبینی انتشار و CRDهای موجود نصب یا ارتقا دهید:

kubectl get crd gateways.gateway.networking.k8s.io httproutes.gateway.networking.k8s.io
kubectl apply --server-side -f \
  https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.5.1/standard-install.yaml
kubectl get gatewayclass
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata: {name: edge, namespace: traefik}
spec:
  gatewayClassName: traefik
  listeners:
    - name: web
      protocol: HTTP
      port: 8000
      allowedRoutes:
        namespaces:
          from: Selector
          selector:
            matchLabels: {edge-access: "true"}
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata: {name: whoami, namespace: apps}
spec:
  parentRefs:
    - {name: edge, namespace: traefik, sectionName: web}
  hostnames: [whoami-gw.k8s.example.test]
  rules:
    - matches:
        - path: {type: PathPrefix, value: /}
      backendRefs:
        - {name: whoami, port: 80, weight: 1}
kubectl label namespace apps edge-access=true
kubectl apply -f gateway.yaml
kubectl -n traefik get gateway edge -o yaml
kubectl -n apps get httproute whoami -o yaml
kubectl wait -n traefik --for=condition=Programmed gateway/edge --timeout=90s
kubectl wait -n apps --for=condition=Accepted httproute/whoami --timeout=90s
curl -fsS --resolve whoami-gw.k8s.example.test:8000:127.0.0.1 \
  http://whoami-gw.k8s.example.test:8000/

نگاشت پورت به values مربوط به chart بستگی دارد. به‌جای حدس‌زدن، Gateway.status.addresses و Service مربوط به Traefik را بررسی کنید.

پشت‌صحنه در namespace دیگر به مجوز در فضای نام خودش نیاز دارد:

apiVersion: gateway.networking.k8s.io/v1beta1
kind: ReferenceGrant
metadata: {name: allow-app-routes, namespace: backend}
spec:
  from:
    - {group: gateway.networking.k8s.io, kind: HTTPRoute, namespace: apps}
  to:
    - {group: "", kind: Service, name: api}

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

  • Accepted=False: reason و message را بخوانید؛ قواعد class، listener، نام میزبان، namespace یا ارجاع شکست خورده‌اند.
  • ResolvedRefs=False: پشت‌صحنه یا ReferenceGrant وجود ندارد یا نامعتبر است.
  • Programmed=False: کنترلر نمی‌تواند listener یا آدرس را محقق کند؛ لاگ و پورت Service را بررسی کنید.
  • پاسخ HTTP 404 با مسیر Accepted: نام میزبان، پورت یا بخش listener، قاعده و آدرس را بررسی کنید.

خودآزمایی

  1. مالک سیاست زیرساخت کیست؟ مدیران Gateway و GatewayClass؛ تیم برنامه معمولاً مالک HTTPRoute است.
  2. چه چیزی پشت‌صحنهٔ میان‌فضای‌نامی را مجاز می‌کند؟ ReferenceGrant در فضای نام مقصد.
  3. چرا از conditions استفاده می‌کنیم؟ تصمیم و دلیل کنترلر را دقیق‌تر از نشانهٔ HTTP بیان می‌کنند.
  4. اثبات کنید: برچسب namespace را حذف کنید، عدم اتصال را ببینید، برگردانید و پاسخ 200 بگیرید.