این راهنما گامبهگام به شما نشان میدهد چگونه یک محیط آزمایشی محلی با Gateway API راهاندازی کنید تا مفاهیم را بدون پیچیدگیهای production تجربه کنید. 🧪 توجه داشته باشید که این تنظیمات صرفاً برای یادگیری و تست مناسباند و نباید در محیط تولید استفاده شوند.
هدف کلی: با استفاده از kind یک خوشه محلی Kubernetes راهاندازی کنید، با اجرای یک کانتینر cloud-provider-kind قابلیتهای LoadBalancer و Gateway API را شبیهسازی کنید، یک Gateway و یک HTTPRoute ایجاد کنید و در نهایت ترافیک را به یک اپلیکیشن ساده echo هدایت و آزمایش کنید. ✅
پیشنیازها — قبل از شروع مطمئن شوید روی ماشین محلی نصب شدهاند: Docker (برای اجرا کردن kind و cloud-provider-kind)، kubectl، kind، و curl. 🛠️
راهاندازی یک خوشه kind تکنودی (Kubernetes در Docker):
kind create cluster
نصب و اجرای cloud-provider-kind — این کامپوننت دو نقش اصلی دارد: یک کنترلکننده LoadBalancer که آدرس IP به سرویسهای نوع LoadBalancer اختصاص میدهد و یک کنترلکننده Gateway که مشخصههای Gateway API را پیادهسازی میکند. همچنین CRD های Gateway API را در خوشه نصب میکند. برای اجرا:
VERSION="$(basename $(curl -s -L -o /dev/null -w '%{url_effective}' https://github.com/kubernetes-sigs/cloud-provider-kind/releases/latest))"
docker run -d --name cloud-provider-kind --rm --network host -v /var/run/docker.sock:/var/run/docker.sock registry.k8s.io/cloud-provider-kind/cloud-controller-manager:${VERSION}
نکته: در برخی سیستمها ممکن است برای دسترسی به ساکت Docker نیاز به مجوزهای بیشتر باشد. برای اطمینان کانتینر را بررسی کنید:
docker ps --filter name=cloud-provider-kind docker logs cloud-provider-kind
ایجاد یک GatewayClass/Gateway — cloud-provider-kind بهطور خودکار یک GatewayClass با نام cloud-provider-kind فراهم میکند. مثال مانیفست برای ایجاد یک namespace و یک Gateway که روی پورت 80 گوش میدهد و host pattern را “*.exampledomain.example” میپذیرد:
---
apiVersion: v1
kind: Namespace
metadata:
name: gateway-infra
---
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: gateway
namespace: gateway-infra
spec:
gatewayClassName: cloud-provider-kind
listeners:
- name: default
hostname: "*.exampledomain.example"
port: 80
protocol: HTTP
allowedRoutes:
namespaces:
from: All
پس از اعمال مانیفست، بررسی کنید که Gateway برنامهریزی شده و آدرس به آن تخصیص یافته باشد:
kubectl get gateway -n gateway-infra gateway
ستون PROGRAMMED باید True و فیلد ADDRESS حاوی یک آدرس IP باشد؛ این آدرس آدرس ورودی شما برای تستها خواهد بود. 🔎
راهاندازی اپلیکیشن آزمایشی echo — یک اپ ساده که روی پورت 3000 گوش میدهد و جزئیات درخواست را بازتاب میدهد. آن را در namespace ای به نام demo مستقر میکنیم:
apiVersion: v1
kind: Namespace
metadata:
name: demo
---
apiVersion: v1
kind: Service
metadata:
labels:
app.kubernetes.io/name: echo
name: echo
namespace: demo
spec:
ports:
- name: http
port: 3000
protocol: TCP
targetPort: 3000
selector:
app.kubernetes.io/name: echo
type: ClusterIP
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app.kubernetes.io/name: echo
name: echo
namespace: demo
spec:
selector:
matchLabels:
app.kubernetes.io/name: echo
template:
metadata:
labels:
app.kubernetes.io/name: echo
spec:
containers:
- env:
- name: POD_NAME
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.name
- name: NAMESPACE
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
image: registry.k8s.io/gateway-api/echo-basic:v20251204-v1.4.1
name: echo-basic
تعریف یک HTTPRoute که درخواستهای host = some.exampledomain.example را به سرویس echo هدایت کند و به Gateway در namespace gateway-infra متصل شود:
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: echo
namespace: demo
spec:
parentRefs:
- name: gateway
namespace: gateway-infra
hostnames: ["some.exampledomain.example"]
rules:
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- name: echo
port: 3000
تست مسیر با curl — ابتدا آدرس IP اختصاصیافته به Gateway را پیدا کرده و سپس با host header مناسب درخواست بفرستید:
GW_ADDR=$(kubectl get gateway -n gateway-infra gateway -o jsonpath='{.status.addresses[0].value}')
curl --resolve some.exampledomain.example:80:${GW_ADDR} http://some.exampledomain.example
اگر همهچیز درست باشد، باید یک پاسخ JSON دریافت کنید که مسیر، host، method، headers و اطلاعات پاد/namespace را نشان میدهد؛ مشابه این خروجی:
{
"path": "/",
"host": "some.exampledomain.example",
"method": "GET",
"proto": "HTTP/1.1",
"headers": {
"accept": ["*/*"],
"user-agent": ["curl/8.15.0"]
},
"Namespace": "demo",
"pod": "echo-..."
}
اگر این پاسخ را دریافت کردید، تبریک 🎉 راهاندازی Gateway API محلی شما عملکرد صحیح دارد.
عیبیابی — مراحل و معیارهایی که معمولاً کمک میکنند:
1) وضعیت Gateway را بررسی کنید:
kubectl get gateway -n gateway-infra gateway -o yaml
در بخش status باید ببینید که Gateway Accepted: True و Programmed: True و آدرس در .status.addresses پر شده است.
2) وضعیت HTTPRoute را بررسی کنید:
kubectl get httproute -n demo echo -o yaml
در بخش status.parents شرایط را ببینید. موارد رایج:
– اگر ResolvedRefs با دلیل BackendNotFound روی False است، یعنی سرویس یا نام backend اشتباه است.
– اگر Accepted روی False است، مسیر نتوانسته به Gateway متصل شود — مجوزهای namespace یا تطابق host را بررسی کنید.
مثال خطا وقتی Backend پیدا نشد (نمونه در بخش status):
status:
parents:
- conditions:
- lastTransitionTime: "2026-01-19T17:13:35Z"
message: backend not found
observedGeneration: 2
reason: BackendNotFound
status: "False"
type: ResolvedRefs
controllerName: kind.sigs.k8s.io/gateway-controller
3) لاگهای کنترلر cloud-provider-kind را بررسی کنید تا خطاها یا جزئیات بیشتر را ببینید:
docker logs -f cloud-provider-kind
پاکسازی منابع پس از آزمایش:
kubectl delete namespace gateway-infra kubectl delete namespace demo docker stop cloud-provider-kind kind delete cluster
گامهای بعدی و نکات حرفهای برای SRE/DevOps:
– برای استقرار production، کنترلرهای Gateway API مختلف را مرور کنید و یکی را انتخاب کنید که نیازهای شما (TLS، scalability، observability، integration با cloud provider واقعی) را برآورده کند. 🔍
– مستندات Gateway API را برای قابلیتهای پیشرفته مثل TLS termination، traffic splitting، header manipulation و مسیریابی پیچیده بررسی کنید.
– در محیطهای واقعی از محدودیت attach به namespace (Same یا Selector) برای allowedRoutes استفاده کنید تا امنیت و جداسازی را تضمین کنید؛ اجازه All صرفاً برای آزمایش مناسب است.
یادآوری نهایی: این تنظیمات شبیهسازی محیط ابری برای توسعه و یادگیری است — برای بارهای واقعی از راهکارهای آزموده و مناسب production استفاده کنید. ⚠️
اگر خواستید، میتوانم کمک کنم همین مانیفستها را برای یک پیادهسازی production-ready یا برای اضافه کردن TLS و observability (metrics/logs) بهبود بدهم. 🙂