اگر خوشه K8s شما درخواستهای خارجی انجام میدهد — به API شرکا، به بازارها، به پلتفرمهای تبلیغاتی — دیر یا زود با مسدودسازیهای IP مواجه خواهید شد. Ingress Controller به خودی خود ترافیک ورودی را مدیریت میکند، اما برای درخواستهای خروجی از طریق پادها به یک طرح جداگانه با پروکسی نیاز است. در این مقاله بررسی میکنیم که چگونه این را به درستی تنظیم کنیم: از انتخاب نوع پروکسی تا پیکربندیهای خاص YAML برای NGINX Ingress و Traefik.
چرا پروکسی در Kubernetes: سناریوهای واقعی
Kubernetes یک ارکستراتور است و بیشتر مقالات درباره آن به ترافیک ورودی میپردازند: چگونه Ingress را تنظیم کنیم، چگونه گواهی TLS صادر کنیم، چگونه درخواستها را به سرویسها مسیریابی کنیم. اما یک طرف دیگر وجود دارد: ترافیک خروجی از پادها. در اینجا مشکلاتی با مسدودسازی، محدودیتهای جغرافیایی و محدودیتهای IP به وجود میآید.
بیایید به وظایف خاصی بپردازیم که در آن پروکسی در خوشه K8s ضروری میشود:
- جمعآوری و نظارت بر قیمتها. خوشه شما هر 15 دقیقه یک CronJob را اجرا میکند و دادهها را از Wildberries، Ozon، Amazon جمعآوری میکند. بدون چرخش IP، پس از 2–3 ساعت، شما با مسدودیت در کل دامنه IP ارائهدهنده ابری خود مواجه خواهید شد.
- کار با API های تبلیغاتی. Facebook Marketing API، TikTok Ads API، Google Ads API — همه آنها منبع درخواستها را ردیابی میکنند. اگر دهها پاد از یک IP مرکز داده درخواست ارسال کنند، این یک محرک برای مسدودسازی خودکار است.
- آزمایش جغرافیایی. سرویس شما باید محتوای متفاوتی را برای کاربران از کشورهای مختلف نمایش دهد. از طریق پروکسی، پادها میتوانند درخواستها را از مناطق مورد نظر برای تستهای خودکار شبیهسازی کنند.
- دور زدن محدودیتهای شرکتی. در برخی زیرساختها، تمام ترافیک خروجی باید از طریق پروکسی شرکتی عبور کند — این یک الزام compliance است.
- کار با API های شرکتی با لیست سفید IP. زمانی که شریک فقط درخواستها را از IP های خاص مجاز میکند و خوشه شما مقیاسپذیر است و آدرسها را تغییر میدهد — پروکسی با IP های ثابت این مشکل را حل میکند.
مهم است که تفکیک معماری را درک کنیم: Ingress Controller ترافیک ورودی را مدیریت میکند (از کاربران به سرویسهای شما)، و پروکسی برای درخواستهای خروجی — یک وظیفه جداگانه است. با این حال، آنها به هم مرتبط هستند: پیکربندی پروکسی اغلب در سطح همان Ingress Controller یا از طریق یادداشتهایی که میخواند، تعیین میشود.
💡 تفکیک کلیدی
در این مقاله دو سناریو را بررسی میکنیم: (1) تنظیم Ingress Controller به عنوان یک پروکسی معکوس برای سرورهای upstream خارجی، و (2) مسیریابی ترافیک خروجی از پادها از طریق یک سرور پروکسی خارجی. هر دو سناریو در تولید مشاهده میشوند.
کدام نوع پروکسی را برای خوشه K8s انتخاب کنیم
انتخاب نوع پروکسی به طور مستقیم بر مدت زمانی که خوشه شما میتواند بدون مسدودسازی کار کند تأثیر میگذارد. IP های مرکز داده — ارزانترین هستند، اما شناسایی و مسدود کردن آنها آسان است. IP های مقیم و موبایل — گرانتر هستند، اما برای وظایفی که شبیهسازی کاربر واقعی مهم است، به مراتب قابل اعتمادترند.
| نوع پروکسی | سرعت | ریسک مسدودسازی | بهترین سناریو در K8s |
|---|---|---|---|
| مرکز داده | بالا | بالا | API های داخلی، compliance شرکتی، ادغامهای شرکتی با لیست سفید IP |
| مقیم | متوسط | پایین | جمعآوری دادههای بازار، کار با API های تبلیغاتی، آزمایش جغرافیایی |
| موبایل | متوسط | حداقل | Facebook Ads API، TikTok API، وظایف با بار بالا با ریسک مسدودسازی |
برای اکثر وظایف در خوشه K8s که با جمعآوری دادهها یا کار با پلتفرمهای تبلیغاتی مرتبط هستند، انتخاب بهینه — پروکسیهای مقیم با چرخش است. آنها IP های واقعی کاربران خانگی را ارائه میدهند و الگوریتمهای محافظت از وبسایتها چنین درخواستهایی را به عنوان ترافیک عادی مرورگر درک میکنند.
از نظر پروتکل، برای K8s، پروکسی HTTP/HTTPS بیشترین قابلیت را دارد — همه مشتریان HTTP محبوب در هر زبان برنامهنویسی از طریق متغیرهای محیطی استاندارد HTTP_PROXY و HTTPS_PROXY از آن پشتیبانی میکنند. SOCKS5 فقط برای پروتکلهای غیر استاندارد یا زمانی که نیاز به پروکسی کردن نه تنها HTTP باشد، ضروری است.
تنظیم پروکسی از طریق NGINX Ingress Controller
NGINX Ingress Controller — رایجترین گزینه در K8s است. بیایید دو سناریو را بررسی کنیم: تنظیم NGINX به عنوان یک پروکسی معکوس به upstream خارجی از طریق سرور پروکسی، و تنظیم جهانی پروکسی خروجی برای خود کنترلکننده.
یادداشتها برای پروکسی کردن درخواستها به upstream
NGINX Ingress از یادداشتها برای مدیریت رفتار پروکسی پشتیبانی میکند. اگر نیاز دارید که Ingress درخواستها را به یک سرویس خارجی از طریق پروکسی میانی ارسال کند، از ConfigMap با پیکربندی سفارشی استفاده کنید:
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-ingress-controller
namespace: ingress-nginx
data:
# پروکسی HTTP جهانی برای درخواستهای خروجی NGINX
http-snippet: |
proxy_connect_timeout 10s;
proxy_read_timeout 30s;
proxy_send_timeout 30s;
# تنظیم upstream از طریق پروکسی
use-proxy-protocol: "false"
proxy-real-ip-cidr: "0.0.0.0/0"
منبع Ingress با یادداشتها برای پروکسی
برای یک منبع Ingress جداگانه میتوانید پارامترهای پروکسی را از طریق یادداشتها تعیین کنید. این مفید است زمانی که سرویسهای مختلف نیاز به زمانهای مختلف و تنظیمات دارند:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-service-ingress
namespace: production
annotations:
kubernetes.io/ingress.class: "nginx"
# زمانهای پروکسی
nginx.ingress.kubernetes.io/proxy-connect-timeout: "10"
nginx.ingress.kubernetes.io/proxy-read-timeout: "60"
nginx.ingress.kubernetes.io/proxy-send-timeout: "60"
# اندازه بافر
nginx.ingress.kubernetes.io/proxy-buffer-size: "16k"
nginx.ingress.kubernetes.io/proxy-buffers-number: "8"
# انتقال IP واقعی مشتری
nginx.ingress.kubernetes.io/use-forwarded-headers: "true"
nginx.ingress.kubernetes.io/forwarded-for-header: "X-Forwarded-For"
spec:
rules:
- host: myapp.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-service
port:
number: 80
تنظیم پروکسی خارجی برای درخواستهای خروجی NGINX پاد
اگر خود NGINX Ingress Controller باید درخواستهای خروجی را از طریق پروکسی خارجی انجام دهد (به عنوان مثال، برای health-check نقاط پایانی خارجی)، باید متغیرهای محیطی را در Deployment کنترلکننده تعیین کنید:
apiVersion: apps/v1
kind: Deployment
metadata:
name: ingress-nginx-controller
namespace: ingress-nginx
spec:
template:
spec:
containers:
- name: controller
image: registry.k8s.io/ingress-nginx/controller:v1.9.4
env:
- name: HTTP_PROXY
valueFrom:
secretKeyRef:
name: proxy-credentials
key: http-proxy-url
- name: HTTPS_PROXY
valueFrom:
secretKeyRef:
name: proxy-credentials
key: https-proxy-url
- name: NO_PROXY
value: "localhost,127.0.0.1,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,.cluster.local"
به متغیر NO_PROXY توجه کنید — این بسیار مهم است. بدون آن، تمام ترافیک درونخوشهای نیز از طریق پروکسی خارجی خواهد رفت، که تعامل بین سرویسها را مختل میکند. در NO_PROXY همیشه دامنههای RFC-1918 و پسوند .cluster.local را شامل کنید.
تنظیم پروکسی در Traefik Ingress Controller
Traefik — یک جایگزین محبوب برای NGINX Ingress، به ویژه در ترکیب با Helm و در خوشههای مدیریتشده (k3s، Docker Swarm، Nomad). Traefik دارای سیستم پیکربندی خود از طریق CRD (تعاریف منبع سفارشی) و پیکربندیهای ایستا/پویا است.
پیکربندی ایستای Traefik با پروکسی
apiVersion: v1
kind: ConfigMap
metadata:
name: traefik-config
namespace: traefik
data:
traefik.yaml: |
# پیکربندی ایستای Traefik
entryPoints:
web:
address: ":80"
websecure:
address: ":443"
# تنظیمات برای کار از طریق پروکسی
serversTransport:
insecureSkipVerify: false
maxIdleConnsPerHost: 200
dialTimeout: 10s
responseHeaderTimeout: 30s
# لاگبرداری برای تشخیص پروکسی
log:
level: INFO
accessLog:
fields:
headers:
defaultMode: keep
names:
X-Forwarded-For: keep
X-Real-IP: keep
Middleware برای افزودن هدرهای پروکسی
در Traefik میتوان یک Middleware ایجاد کرد که هنگام ارسال درخواستها، هدرها را اضافه یا تغییر دهد. این برای انتقال صحیح IP واقعی مشتری از طریق زنجیره پروکسی مفید است:
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
name: proxy-headers
namespace: production
spec:
headers:
customRequestHeaders:
X-Forwarded-Proto: "https"
# هدرهایی که ممکن است زیرساخت را افشا کنند حذف میشوند
customResponseHeaders:
X-Powered-By: ""
Server: ""
---
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: my-app-route
namespace: production
spec:
entryPoints:
- websecure
routes:
- match: Host(`myapp.example.com`)
kind: Rule
middlewares:
- name: proxy-headers
services:
- name: my-service
port: 80
متغیرهای محیطی برای Deployment Traefik
مشابه NGINX، برای Traefik متغیرهای محیطی را از طریق مقادیر Helm یا به طور مستقیم در Deployment تعیین میکنیم. هنگام استفاده از چارت Helm، این کار از طریق values.yaml انجام میشود:
# values.yaml برای چارت Helm Traefik
deployment:
enabled: true
kind: Deployment
env:
- name: HTTP_PROXY
valueFrom:
secretKeyRef:
name: proxy-credentials
key: http-proxy-url
- name: HTTPS_PROXY
valueFrom:
secretKeyRef:
name: proxy-credentials
key: https-proxy-url
- name: NO_PROXY
value: "localhost,127.0.0.1,10.96.0.0/12,10.244.0.0/16,.cluster.local,.svc"
پروکسی از طریق متغیرهای محیطی در پادها
سادهترین روش برای تنظیم پروکسی خروجی برای هر پاد — از طریق متغیرهای محیطی استاندارد است. این روش به طور مستقل از زبان برنامهنویسی و فریمورک کار میکند: Python requests، Go net/http، Node.js axios، Java HttpClient — همه آنها به طور خودکار HTTP_PROXY و HTTPS_PROXY را میخوانند.
گزینه 1: به طور مستقیم در مشخصات پاد
apiVersion: v1
kind: Pod
metadata:
name: scraper-pod
namespace: production
spec:
containers:
- name: scraper
image: mycompany/scraper:latest
env:
- name: HTTP_PROXY
value: "http://username:[email protected]:8080"
- name: HTTPS_PROXY
value: "http://username:[email protected]:8080"
- name: NO_PROXY
value: "localhost,127.0.0.1,10.0.0.0/8,.cluster.local"
resources:
requests:
memory: "128Mi"
cpu: "100m"
limits:
memory: "256Mi"
cpu: "500m"
⚠️ اعتبارنامهها را به صورت واضح ذخیره نکنید!
مثال بالا برای وضوح نشان داده شده است. در تولید، اعتبارنامههای پروکسی همیشه باید در Kubernetes Secret ذخیره شوند و از طریق secretKeyRef منتقل شوند. جزئیات بیشتر در بخش مربوط به Secrets در زیر.
گزینه 2: از طریق ConfigMap برای چندین پاد
اگر پروکسیها از چندین Deployment استفاده کنند، مناسب است که تنظیمات را به ConfigMap منتقل کنید و آن را از طریق envFrom متصل کنید:
apiVersion: v1
kind: ConfigMap
metadata:
name: proxy-config
namespace: production
data:
NO_PROXY: "localhost,127.0.0.1,10.0.0.0/8,172.16.0.0/12,.cluster.local,.svc.cluster.local"
PROXY_TIMEOUT: "30"
PROXY_MAX_RETRIES: "3"
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: price-monitor
namespace: production
spec:
replicas: 5
selector:
matchLabels:
app: price-monitor
template:
metadata:
labels:
app: price-monitor
spec:
containers:
- name: monitor
image: mycompany/price-monitor:v2.1
envFrom:
- configMapRef:
name: proxy-config
- secretRef:
name: proxy-credentials
ports:
- containerPort: 8080
گزینه 3: WebhookAdmissionController تغییر دهنده
برای خوشههای شرکتی که در آن همه پادها ملزم به استفاده از پروکسی هستند، میتوان یک webhook تغییر دهنده تنظیم کرد که به طور خودکار متغیرهای محیطی پروکسی را به همه پادهای ایجاد شده اضافه کند. این راهحل در زیرساختهای شرکتی استفاده میشود که compliance نیاز دارد تا تمام ترافیک خروجی از طریق پروکسی شرکتی عبور کند. پیادهسازی چنین webhook فراتر از این مقاله است، اما باید از وجود آن آگاه باشید.
چرخش IP و مدیریت استخر پروکسی در K8s
پروکسی ثابت — برای compliance شرکتی خوب است، اما برای وظایفی که نیاز به جلوگیری از مسدودسازی دارند بد است. اگر 50 پاد شما از یک IP یکسان درخواست ارسال کنند، آن IP خیلی سریع مسدود خواهد شد. راهحل — چرخش پروکسی.
طرح با Proxy Sidecar
یکی از الگوها — اجرای پروکسی به عنوان یک کانتینر sidecar در کنار برنامه اصلی است. Sidecar درخواستها را در localhost:8080 دریافت کرده و آنها را از طریق استخر چرخشی پروکسیهای خارجی ارسال میکند:
apiVersion: apps/v1
kind: Deployment
metadata:
name: scraper-with-proxy-sidecar
namespace: production
spec:
replicas: 10
selector:
matchLabels:
app: scraper
template:
metadata:
labels:
app: scraper
spec:
containers:
# برنامه اصلی
- name: scraper
image: mycompany/scraper:latest
env:
- name: HTTP_PROXY
value: "http://localhost:8080"
- name: HTTPS_PROXY
value: "http://localhost:8080"
- name: NO_PROXY
value: "localhost,127.0.0.1,.cluster.local"
# Sidecar: پروکسی محلی با چرخش
- name: proxy-rotator
image: mycompany/proxy-rotator:latest
ports:
- containerPort: 8080
env:
- name: PROXY_LIST_URL
valueFrom:
secretKeyRef:
name: proxy-credentials
key: api-endpoint
- name: ROTATION_INTERVAL
value: "60" # چرخش هر 60 ثانیه
resources:
requests:
memory: "64Mi"
cpu: "50m"
limits:
memory: "128Mi"
cpu: "200m"
طرح با Proxy Service مرکزی
رویکرد جایگزین — یک Proxy Service واحد درون خوشه است که همه پادها به آن مراجعه میکنند. این مدیریت را سادهتر میکند: کافی است یک Secret با اعتبارنامههای پروکسی را بهروزرسانی کنید و همه پادها به طور خودکار از دادههای جدید استفاده خواهند کرد.
apiVersion: v1
kind: Service
metadata:
name: proxy-gateway
namespace: proxy-system
spec:
selector:
app: proxy-gateway
ports:
- name: http
port: 8080
targetPort: 8080
- name: socks5
port: 1080
targetPort: 1080
type: ClusterIP
---
# پادها از طریق DNS داخلی از پروکسی استفاده میکنند
# HTTP_PROXY=http://proxy-gateway.proxy-system.svc.cluster.local:8080
برای وظایفی که ناشناسی و حداقل ریسک مسدودسازی (به عنوان مثال، جمعآوری دادههای بازار یا کار با API های تبلیغاتی) حیاتی است، توصیه میکنیم از پروکسیهای مقیم با چرخش استفاده کنید — آنها IP های واقعی کاربران خانگی را ارائه میدهند که ترافیک از خوشه شما را غیرقابل تشخیص از ترافیک عادی مرورگر میکند.
ذخیرهسازی اعتبارنامههای پروکسی در Kubernetes Secrets
ذخیرهسازی امن اعتبارنامهها یک الزام برای هر خوشه تولید است. هرگز نام کاربری/گذرواژه پروکسی را به طور مستقیم در مانیفستهای YAML که در مخزن Git ذخیره میشوند، وارد نکنید.
ایجاد Secret برای پروکسی
# ایجاد از طریق kubectl (مقادیر به طور خودکار در base64 کدگذاری میشوند)
kubectl create secret generic proxy-credentials \
--namespace=production \
--from-literal=http-proxy-url='http://user:[email protected]:8080' \
--from-literal=https-proxy-url='http://user:[email protected]:8080' \
--from-literal=socks5-proxy-url='socks5://user:[email protected]:1080'
# بررسی Secret ایجاد شده
kubectl get secret proxy-credentials -n production -o yaml
مانیفست YAML Secret
apiVersion: v1
kind: Secret
metadata:
name: proxy-credentials
namespace: production
labels:
app: proxy-config
managed-by: ops-team
type: Opaque
# مقادیر در base64 کدگذاری شدهاند
# echo -n 'http://user:pass@proxy:8080' | base64
stringData:
# stringData اجازه میدهد مقادیر به صورت واضح مشخص شوند
# Kubernetes به طور خودکار آنها را در base64 کدگذاری میکند
http-proxy-url: "http://user:[email protected]:8080"
https-proxy-url: "http://user:[email protected]:8080"
proxy-host: "gate.proxycove.com"
proxy-port: "8080"
proxy-username: "user"
proxy-password: "password"
استفاده از Secret در Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: api-worker
namespace: production
spec:
replicas: 3
selector:
matchLabels:
app: api-worker
template:
metadata:
labels:
app: api-worker
spec:
containers:
- name: worker
image: mycompany/api-worker:latest
env:
- name: HTTP_PROXY
valueFrom:
secretKeyRef:
name: proxy-credentials
key: http-proxy-url
- name: HTTPS_PROXY
valueFrom:
secretKeyRef:
name: proxy-credentials
key: https-proxy-url
- name: NO_PROXY
value: "localhost,127.0.0.1,10.0.0.0/8,.cluster.local"
# برای برنامههایی که به طور جداگانه میزبان/پورت را میخوانند
- name: PROXY_HOST
valueFrom:
secretKeyRef:
name: proxy-credentials
key: proxy-host
- name: PROXY_PORT
valueFrom:
secretKeyRef:
name: proxy-credentials
key: proxy-port
ادغام با ذخیرهسازهای خارجی Secrets
در محیطهای شرکتی، توصیه میشود از External Secrets Operator برای همگامسازی Secrets از HashiCorp Vault، AWS Secrets Manager یا Azure Key Vault استفاده کنید. این امکان را فراهم میکند که اعتبارنامههای پروکسی به طور خودکار بدون دخالت دستی و راهاندازی مجدد پادها بهروزرسانی شوند:
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: proxy-credentials-ext
namespace: production
spec:
refreshInterval: 1h
secretStoreRef:
name: vault-backend
kind: ClusterSecretStore
target:
name: proxy-credentials
creationPolicy: Owner
data:
- secretKey: http-proxy-url
remoteRef:
key: secret/proxy/proxycove
property: http_proxy_url
- secretKey: https-proxy-url
remoteRef:
key: secret/proxy/proxycove
property: https_proxy_url
تشخیص و خطاهای متداول در تنظیم پروکسی در K8s
حتی با پیکربندی صحیح، ممکن است مشکلاتی به وجود آید. بیایید به شایعترین آنها و روشهای تشخیص بپردازیم.
مشکل 1: ترافیک درونخوشهای از طریق پروکسی میرود
علامت: پادها دیگر یکدیگر را نمیبینند، حل DNS درون خوشه خراب میشود، سرویسها پاسخ نمیدهند. دلیل — متغیر NO_PROXY تنظیم نشده است.
حداقل مقدار لازم NO_PROXY برای خوشه K8s استاندارد:
NO_PROXY=localhost,127.0.0.1,::1,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,.cluster.local,.svc,.svc.cluster.local,kubernetes.default.svc
مشکل 2: پروکسی به یک پاد خاص اعمال نمیشود
تشخیص: به پاد بروید و متغیرهای محیطی را بررسی کنید:
# بررسی متغیرهای محیطی در پاد
kubectl exec -it <pod-name> -n production -- env | grep -i proxy
# تست اتصال از طریق پروکسی از پاد
kubectl exec -it <pod-name> -n production -- curl -v --proxy http://proxy:8080 https://httpbin.org/ip
# بررسی اینکه Secret به درستی متصل شده است
kubectl exec -it <pod-name> -n production -- env | grep PROXY
مشکل 3: خطاهای TLS هنگام استفاده از پروکسی HTTPS
اگر پروکسی از گواهی خود امضا شده یا CA شرکتی استفاده کند، برنامهها خطاهای تأیید TLS دریافت خواهند کرد. راهحل — افزودن گواهی CA پروکسی به لیست معتبر:
# ایجاد ConfigMap با گواهی CA
kubectl create configmap proxy-ca-cert \
--from-file=proxy-ca.crt=./proxy-ca.crt \
-n production
# اتصال به پاد
spec:
containers:
- name: app
volumeMounts:
- name: proxy-ca
mountPath: /etc/ssl/certs/proxy-ca.crt
subPath: proxy-ca.crt
volumes:
- name: proxy-ca
configMap:
name: proxy-ca-cert
مشکل 4: درخواستهای کند از طریق پروکسی
اگر درخواستها از طریق پروکسی به طور قابل توجهی کندتر از درخواستهای مستقیم هستند — بررسی کنید:
- حل DNS: اطمینان حاصل کنید که درخواستهای DNS از طریق پروکسی نمیروند (آن را به
NO_PROXYاضافه کنید) - اتصالات Keep-alive: استخر اتصالات به سرور پروکسی را تنظیم کنید
- موقعیت جغرافیایی: سرور پروکسی باید به طور فیزیکی نزدیک به منبع هدف باشد
- نوع پروکسی: برای وظایف با سرعت بالا، پروکسیهای مرکز داده را در نظر بگیرید — آنها حداقل تأخیر را فراهم میکنند
دستورات مفید برای تشخیص
# بررسی لاگهای Ingress Controller
kubectl logs -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx --tail=100
# بررسی رویدادهای پاد
kubectl describe pod <pod-name> -n production
# تست اتصال پروکسی از پاد
kubectl run test-proxy --image=curlimages/curl --rm -it --restart=Never -- \
curl -x http://user:pass@proxy:8080 -v https://httpbin.org/ip
# بررسی اینکه Secret وجود دارد و شامل کلیدهای مورد نیاز است
kubectl get secret proxy-credentials -n production -o jsonpath='{.data}' | python3 -c "
import sys, json, base64
data = json.load(sys.stdin)
for k, v in data.items():
print(f'{k}: {base64.b64decode(v).decode()[:20]}...')
"
نتیجهگیری و توصیهها
تنظیم پروکسی در Kubernetes یک وظیفه یکباره نیست، بلکه بخشی از معماری امنیت شبکه خوشه است. بیایید جمعبندی کنیم:
- برای NGINX Ingress Controller — از یادداشتها برای تنظیم پارامترهای پروکسی در سطح منابع Ingress جداگانه استفاده کنید و از متغیرهای محیطی در Deployment برای تنظیمات جهانی ترافیک خروجی.
- برای Traefik — پیکربندی ایستا را از طریق ConfigMap با Middleware برای مدیریت هدرها ترکیب کنید.
- برای پادها — متغیرهای استاندارد
HTTP_PROXY/HTTPS_PROXYاز طریق Secrets — بهترین و ایمنترین رویکرد است. - همیشه NO_PROXY را تنظیم کنید — در غیر این صورت ترافیک درونخوشهای مختل خواهد شد.
- هرگز اعتبارنامههای پروکسی را به صورت واضح در مانیفستها یا در Git ذخیره نکنید.
- برای تولید — از External Secrets Operator برای چرخش خودکار اعتبارنامهها استفاده کنید.
اگر خوشه K8s شما وظایفی را انجام میدهد که در آن ثبات IP و حداقل ریسک مسدودسازی حیاتی است — جمعآوری دادهها، کار با API های تبلیغاتی، آزمایش جغرافیایی — توصیه میکنیم از پروکسیهای مقیم استفاده کنید. آنها IP های واقعی کاربران خانگی را ارائه میدهند که الگوریتمهای محافظت به عنوان ترافیک قانونی درک میکنند. برای وظایف با نیازهای بالا به سرعت و حداقل ریسکهای مسدودسازی از طرف پلتفرمهای موبایل، پروکسیهای موبایل گزینههای عالی هستند — آنها از طریق شبکههای واقعی 4G/5G اپراتورها کار میکنند.
```