برنامه نویسی

نحوه راه اندازی Nginx Ingress Controller در Kubernetes

Kubernetes که اغلب به اختصار K8s نامیده می‌شود، یک پلتفرم منبع باز است که برای خودکارسازی استقرار، مقیاس‌بندی و عملیات کانتینرهای برنامه طراحی شده است. این کانتینرها را که یک برنامه کاربردی را تشکیل می دهند در واحدهای منطقی برای مدیریت و کشف آسان گروه بندی می کند.

فهرست مطالب

درک Kubernetes و Ingress Controllers

مبانی Kubernetes

Kubernetes حول یک معماری خوشه ای ساخته شده است که از یک گره اصلی و گره کارگر تشکیل شده است. هر گره پادها را اجرا می کند، کوچکترین واحدهای قابل استقرار در Kubernetes، که می توانند شامل یک یا چند کانتینر باشند.
برای مدیریت این کانتینرها، Kubernetes چندین انتزاع مانند Pods، Deployments و Services ارائه می دهد که به استقرار و مدیریت یکپارچه برنامه ها کمک می کند.
یکی از ویژگی های کلیدی Kubernetes توانایی آن در مدیریت خودکار مقیاس گذاری و failover برنامه بر اساس پیکربندی است.
Kubernetes همچنین از طیف وسیعی از Backend های ذخیره سازی پشتیبانی می کند و به برنامه ها اجازه می دهد تا سیستم های ذخیره سازی را به دلخواه خود نصب کنند.
شبکه‌سازی یکی دیگر از جنبه‌های حیاتی است که Kubernetes سیستم DNS خود را برای کشف سرویس و متعادل‌سازی بار ارائه می‌کند.
ویژگی های امنیتی در Kubernetes شامل Secrets و Network Policies است که به ترتیب به مدیریت اطلاعات حساس و کنترل جریان ترافیک کمک می کند.
به طور کلی، Kubernetes مدیریت کانتینر را ساده می کند و یک پلت فرم قوی برای استقرار برنامه های کاربردی ابری فراهم می کند.

مقدمه ای بر Ingress Controllers

در Kubernetes، یک Ingress Controller مسئول مدیریت دسترسی به خدمات در یک خوشه از دنیای خارج است. این به عنوان یک پروکسی معکوس عمل می کند و تعادل بار، خاتمه SSL و میزبانی مجازی مبتنی بر نام را فراهم می کند.
منبع Ingress تعریف می کند که چگونه ترافیک HTTP و HTTPS خارجی باید پردازش شود و به سرویس های درون خوشه هدایت شود.
چندین کنترلر ورودی موجود است، اما NGINX به دلیل انعطاف پذیری، عملکرد و پذیرش گسترده یکی از محبوب ترین هاست.
یک Ingress Controller API Kubernetes را برای به روز رسانی منابع Ingress تماشا می کند و به صورت پویا پیکربندی آن را برای رسیدن به وضعیت مورد نظر به روز می کند.
این ماهیت پویا نیاز به مداخله دستی را هنگام استقرار یا مقیاس‌بندی برنامه‌ها از بین می‌برد و آن را برای محیط‌های خودکار ایده‌آل می‌کند.
برای استقرار یک Ingress Controller، معمولاً باید یک Kubernetes Deployment و یک سرویس برای افشای آن ایجاد کنید.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-ingress-controller
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx-ingress
  template:
    metadata:
      labels:
        app: nginx-ingress
    spec:
      containers:
      - name: nginx-ingress-controller
        image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.26.1
        ports:
        - name: http
          containerPort: 80
        - name: https
          containerPort: 443
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این قطعه کد نحوه استقرار یک کنترلر ورودی NGINX را با استفاده از استقرار Kubernetes نشان می دهد.
استقرار یک کنترل کننده ورودی مانند NGINX می تواند به طور قابل توجهی روند قرار گرفتن برنامه های شما را در اینترنت یا شبکه های داخلی ساده کند.

چرا کنترل کننده ورودی NGINX را انتخاب کنید؟

NGINX به دلیل عملکرد بالا، پایداری، مجموعه ویژگی های غنی و پیکربندی ساده خود مشهور است.
به عنوان یک کنترل کننده ورودی، NGINX تعادل بار کارآمد، خاتمه SSL و پشتیبانی از WebSocket را فراهم می کند، که برای برنامه های کاربردی وب مدرن ضروری هستند.
توانایی NGINX برای مدیریت تعداد زیادی از اتصالات با حداقل منابع، آن را به یک انتخاب عالی برای محیط های پر ترافیک تبدیل می کند.
همچنین گزارش های دسترسی دقیق و قابلیت های نظارت را ارائه می دهد که برای عیب یابی و تنظیم عملکرد بسیار مهم هستند.
NGINX Ingress Controller به طور فعال توسط یک جامعه پر جنب و جوش نگهداری و پشتیبانی می شود و تضمین می کند که با آخرین ویژگی ها و وصله های امنیتی به روز می ماند.
می توان آن را به راحتی با تنظیمات سفارشی گسترش داد و به توسعه دهندگان این امکان را می دهد تا رفتار آن را مطابق با نیازهای خاص خود تنظیم کنند.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: example-service
            port:
              number: 80
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این مثال یک منبع Ingress را تعریف می کند که ترافیک را برای آن مسیریابی می کند example.com به example-service خدمات
انتخاب NGINX به‌عنوان Ingress Controller می‌تواند کارایی، امنیت و سهولت مدیریت خوشه Kubernetes را به‌طور چشمگیری بهبود بخشد.

راه اندازی کنترل کننده ورودی NGINX

آماده کردن خوشه Kubernetes

قبل از نصب NGINX Ingress Controller، مطمئن شوید که خوشه Kubernetes شما راه اندازی و اجرا می شود. می‌توانید از هر ارائه‌دهنده ابری مانند Google Cloud Platform، AWS یا Azure یا حتی راه‌اندازی محلی مانند Minikube استفاده کنید.
مطمئن شوید که دارید kubectl برای برقراری ارتباط با خوشه شما نصب و پیکربندی شده است. این ابزار برای مدیریت منابع Kubernetes ضروری است.
همچنین تمرین خوبی است که خوشه Kubernetes خود را به آخرین نسخه پایدار به روز کنید تا از مشکلات سازگاری جلوگیری کنید.
همچنین باید سیاست های شبکه و تنظیمات امنیتی خوشه خود را در نظر بگیرید تا مطمئن شوید که کنترل کننده ورودی می تواند بدون محدودیت کار کند.
درک مفاهیم اساسی شبکه Kubernetes، مانند Services و Pods، قبل از ادامه راه اندازی NGINX Ingress Controller بسیار مهم است.
بررسی اسناد رسمی Kubernetes در Ingress و Ingress Controller، پایه ای محکم برای درک نحوه عملکرد مسیریابی ترافیک فراهم می کند.

kubectl cluster-info
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اجرای این دستور اطلاعاتی در مورد خوشه Kubernetes به شما می دهد و این امر را تأیید می کند kubectl به درستی پیکربندی شده است.
آماده‌سازی کلید استقرار موفق کنترل‌کننده ورودی NGINX است و از یکپارچگی روان با خوشه Kubernetes شما اطمینان می‌دهد.

نصب کنترلر ورودی NGINX

نصب NGINX Ingress Controller شامل استقرار آن در خوشه Kubernetes است. بسته به ترجیح خود می توانید این کار را با استفاده از Kubectl یا Helm انجام دهید.
برای نصب اولیه با استفاده از kubectl، می‌توانید فایل رسمی YAML استقرار کنترلر ورودی NGINX را مستقیماً از مخزن GitHub پروژه اعمال کنید.

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.3.0/deploy/static/provider/cloud/deploy.yaml
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این دستور کنترل کننده ورودی NGINX را در ingress-nginx فضای نام، در صورت عدم وجود آن را ایجاد کنید.
از طرف دیگر، اگر ترجیح می دهید از Helm، مدیر بسته Kubernetes استفاده کنید، می توانید NGINX Ingress Controller را با دستور زیر نصب کنید:

helm upgrade --install ingress-nginx ingress-nginx --repo https://kubernetes.github.io/ingress-nginx --namespace ingress-nginx --create-namespace
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این دستور Helm همچنین کنترل کننده ورودی را در قسمت نصب می کند ingress-nginx فضای نام و یک روش ترجیحی برای کسانی است که با Helm آشنا هستند.
پس از نصب، مهم است که بررسی کنید که غلاف های کنترل ورودی NGINX به درستی کار می کنند. می توانید این کار را با فهرست کردن غلاف ها در قسمت انجام دهید ingress-nginx فضای نام

kubectl get pods --namespace ingress-nginx
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مشاهده غلاف های NGINX Ingress Controller در a Running state نصب موفقیت آمیز را تأیید می کند.
فرآیند نصب ساده است، اما بسیار مهم است که مستندات رسمی را دنبال کنید و مطمئن شوید که خوشه شما تمام پیش نیازها را برآورده می کند.

تأیید تنظیم کنترلر ورودی NGINX

پس از نصب کنترلر ورودی NGINX، بررسی درستی تنظیم و عملکرد آن ضروری است. این شامل بررسی وضعیت غلاف کنترلر، آدرس IP اختصاص داده شده آن و آزمایش با یک برنامه آزمایشی است.
ابتدا، با اجرای غلاف کنترل ورودی NGINX بدون مشکل در حال اجرا هستند kubectl get pods فرمان در داخل ingress-nginx فضای نام

kubectl get pods --namespace=ingress-nginx
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

دیدن غلاف ها در الف Running وضعیت نشانه خوبی است که کنترل کننده عملیاتی است.
سپس، بررسی کنید که آیا به کنترلر ورودی NGINX یک آدرس IP عمومی اختصاص داده شده است یا خیر. این برای دسترسی ترافیک خارجی به خدمات شما بسیار مهم است.

kubectl get svc --namespace=ingress-nginx
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این دستور خدمات موجود در ingress-nginx فضای نام، نشانی‌های IP خارجی تخصیص یافته به کنترلر ورودی NGINX را به شما نشان می‌دهد.
برای یک آزمایش عملی، یک برنامه وب ساده را مستقر کنید و یک منبع Ingress تعریف کنید تا ترافیک خارجی را از طریق کنترل کننده ورودی NGINX به آن هدایت کند.
آزمایش با یک برنامه واقعی به شما امکان می دهد کل مسیر را از یک درخواست خارجی به یک سرویس داخلی اعتبار سنجی کنید، و اطمینان حاصل کنید که Ingress Controller به درستی ترافیک را مسیریابی می کند.
مستندسازی هر مرحله از فرآیند تأیید و هرگونه مشکلی که با آن مواجه می‌شوید برای عیب‌یابی و مراجعات بعدی مفید است.

پیکربندی پیشرفته و عیب یابی

سفارشی کردن رفتار ورودی NGINX

کنترلر ورودی NGINX بسیار قابل تنظیم است و به شما امکان می دهد رفتار آن را متناسب با نیازهای خاص خود تنظیم کنید. این شامل قوانین مسیریابی سفارشی، تنظیمات SSL و تنظیم عملکرد است.
برای سفارشی کردن قوانین مسیریابی، می توانید از حاشیه نویسی در منابع Ingress خود استفاده کنید. حاشیه نویسی به شما این امکان را می دهد که تنظیمات اضافی مانند بازنویسی قوانین، وقفه های زمانی و پیکربندی های SSL مخصوص NGINX را مشخص کنید.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: custom-routing
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /something(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: example-service
            port:
              number: 80
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این مثال نشان می دهد که چگونه از حاشیه نویسی برای بازنویسی URL ها استفاده کنید و ترافیک را به مسیرهای مختلف در برنامه خود هدایت کنید.
پیکربندی SSL/TLS حوزه دیگری است که اغلب به شخصی سازی نیاز است. NGINX Ingress Controller از مدیریت خودکار گواهینامه SSL با استفاده از Kubernetes Secrets پشتیبانی می کند و ایمن سازی برنامه های شما را آسان تر می کند.
تنظیم عملکرد را می توان با تنظیم پارامترهای خاص NGINX مانند فرآیندهای کارگر، اتصالات کارگر و اندازه بافر به دست آورد. این تنظیمات را می توان به صورت سراسری یا به ازای هر منبع ورودی پیکربندی کرد.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: performance-tuning
  annotations:
    nginx.ingress.kubernetes.io/proxy-buffer-size: "8k"
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: example-service
            port:
              number: 80
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این مثال نشان می‌دهد که چگونه می‌توان اندازه بافر پروکسی را برای مدیریت بهتر سرصفحه‌های درخواست بزرگ افزایش داد و عملکرد کلی را بهبود بخشید.
سفارشی کردن کنترلر ورودی NGINX به درک عمیق هر دو NGINX و Kubernetes نیاز دارد. توصیه می شود قبل از اعمال تغییرات در یک محیط صحنه سازی، آنها را به طور کامل آزمایش کنید.
انعطاف پذیری NGINX Ingress Controller آن را به ابزاری قدرتمند برای مدیریت ترافیک ورودی تبدیل می کند، اما به این معنی است که برنامه ریزی و پیکربندی دقیق برای عملکرد و امنیت بهینه ضروری است.

اشکال زدایی مسائل رایج

هنگام کار با NGINX Ingress Controller، ممکن است با مسائل مختلفی مرتبط با خطاهای پیکربندی، تنگناهای عملکرد یا رفتار غیرمنتظره مواجه شوید.
مشکلات رایج پیکربندی عبارتند از قوانین ورودی نادرست، حاشیه نویسی های از دست رفته و گواهی های SSL پیکربندی نادرست. اینها معمولاً با مرور تعاریف منابع ورودی و اطمینان از مطابقت آنها با پیکربندی مورد نظر قابل حل است.
مشکلات عملکرد ممکن است ناشی از تخصیص ناکافی منابع، تنظیمات متعادل کننده بار نامناسب، یا پارامترهای نامناسب NGINX باشد. نظارت بر معیارهای عملکرد NGINX Ingress Controller می تواند به شناسایی تنگناها کمک کند.
رفتار غیرمنتظره، مانند مسیریابی نادرست یا بررسی های سلامت ناموفق، اغلب ناشی از پیکربندی اشتباه یا تضاد بین منابع ورودی است. بررسی دقیق لاگ های NGINX می تواند بینش هایی را در مورد علت اصلی ارائه دهد.

kubectl logs  --namespace=ingress-nginx
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این دستور به شما امکان می‌دهد گزارش‌های NGINX Ingress Controller pod را مشاهده کنید که برای عیب‌یابی مشکلات بسیار ارزشمند است.
هنگام اشکال زدایی، جداسازی مشکل با ساده کردن موقت پیکربندی یا حذف تنظیمات بالقوه متناقض مفید است.
تعامل با جامعه از طریق انجمن‌ها یا مشکلات GitHub همچنین می‌تواند بینش و راه‌حل‌های بیشتری را از دیگر کاربرانی که ممکن است با چالش‌های مشابهی مواجه شده‌اند، ارائه دهد.
در نهایت، صبر و یک رویکرد سیستماتیک برای عیب یابی منجر به شناسایی و حل مشکلات با کنترل کننده ورودی NGINX می شود.

بهترین روش ها برای کنترل کننده ورودی NGINX

ملاحظات امنیتی

ایمن کردن کنترلر ورودی NGINX برای محافظت از برنامه های شما در برابر تهدیدات خارجی بسیار مهم است. این شامل پیکربندی SSL/TLS، تنظیم خط مشی های شبکه و به روز رسانی منظم به آخرین نسخه است.
استفاده از SSL/TLS برای ترافیک رمزگذاری شده یک عمل امنیتی اساسی است. NGINX Ingress Controller این کار را با خودکارسازی مدیریت گواهی و تمدید با ابزارهایی مانند Let's Encrypt ساده می کند.
خط‌مشی‌های شبکه در Kubernetes می‌توانند محدود کنند که کدام پادها می‌توانند با یکدیگر ارتباط برقرار کنند و یک لایه امنیتی اضافی را فراهم کنند. توصیه می‌شود سیاست‌های سخت‌گیرانه‌ای تعریف کنید که فقط به ترافیک ضروری اجازه می‌دهد.
به روز رسانی منظم NGINX Ingress Controller تضمین می کند که آخرین وصله ها و ویژگی های امنیتی را دارید. این را می توان با ابزارهای استقرار مداوم برای به حداقل رساندن مداخله دستی خودکار کرد.

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: ingress-nginx
spec:
  podSelector:
    matchLabels:
      app: nginx-ingress
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - ipBlock:
        cidr: 10.0.0.0/8
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این مثال نشان می دهد که چگونه می توان یک خط مشی شبکه ایجاد کرد که ترافیک را به غلاف های کنترل کننده ورودی NGINX محدود می کند و امنیت را افزایش می دهد.
اجرای محدودیت نرخ می تواند با محدود کردن تعداد درخواست هایی که مشتری می تواند در یک بازه زمانی معین انجام دهد، در برابر حملات انکار سرویس محافظت می کند.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: rate-limiting
  annotations:
    nginx.ingress.kubernetes.io/limit-rps: "5"
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: example-service
            port:
              number: 80
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این قطعه کد نحوه اعمال محدودیت نرخ را برای یک منبع Ingress نشان می دهد که یک لایه حفاظتی ساده و در عین حال موثر ارائه می دهد.
رعایت این بهترین شیوه‌های امنیتی به شما کمک می‌کند تا کنترل کننده ورودی NGINX شما را تضمین کند و در نتیجه، برنامه‌های شما در برابر تهدیدات بالقوه ایمن بمانند.

بهینه سازی عملکرد

بهینه سازی عملکرد NGINX Ingress Controller شامل تنظیم پارامترها و منابع مختلف برای اطمینان از مدیریت کارآمد ترافیک است.
تنظیم تعداد فرآیندهای کارگر و اتصالات می تواند به طور قابل توجهی بر توان عملیاتی و تأخیر کنترل کننده ورودی NGINX تأثیر بگذارد.
ذخیره محتوا در سطح ورودی می‌تواند بار سرویس‌های پشتیبان را کاهش دهد و زمان پاسخ‌دهی به منابعی که اغلب به آنها دسترسی دارند را بهبود بخشد.
الگوریتم‌های متعادل کننده بار را می‌توان برای توزیع موثرتر ترافیک در سرویس‌های باطن، بسته به ظرفیت و زمان پاسخ، سفارشی کرد.
ابزارهای نظارتی مانند Prometheus و Grafana می‌توانند بینشی در مورد عملکرد NGINX Ingress Controller ارائه دهند و به شناسایی مناطق برای بهبود کمک کنند.
مقیاس پذیری یکی دیگر از جنبه های حیاتی است، با مقیاس خودکار غلاف افقی که کنترل کننده ورودی NGINX را قادر می سازد تا با تغییر الگوهای ترافیک به صورت پویا سازگار شود.

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: nginx-ingress-controller
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx-ingress-controller
  minReplicas: 2
  maxReplicas: 10
  targetCPUUtilizationPercentage: 50
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این مثال مقیاس خودکار غلاف افقی را برای کنترل کننده ورودی NGINX پیکربندی می‌کند و اطمینان می‌دهد که می‌تواند سطوح مختلف ترافیک را به طور موثر مدیریت کند.
بهینه‌سازی عملکرد نه تنها تجربه کاربر را بهبود می‌بخشد، بلکه پایداری و قابلیت اطمینان برنامه‌های شما را تحت بار سنگین تضمین می‌کند.

نتیجه گیری

راه اندازی و پیکربندی NGINX Ingress Controller در Kubernetes یک گام مهم در ایجاد یک زیرساخت قوی و مقیاس پذیر بومی ابری است. با درک اصول اولیه Kubernetes، نقش کنترل کننده های ورودی، و مزایای خاص NGINX، می توانید دسترسی خارجی به خدمات خود را به طور موثر مدیریت کنید. از طریق نصب دقیق، سفارشی‌سازی، و مدیریت مداوم، از جمله امنیت و بهینه‌سازی عملکرد، می‌توانید مطمئن شوید که برنامه‌هایتان ایمن، کارآمد و در دسترس هستند.

به یاد داشته باشید که NGINX Ingress Controller یک ابزار قدرتمند است، اما برای درک کامل مزایای آن به پیکربندی و نگهداری مناسب نیاز دارد. مرتباً تنظیمات خود را مرور کنید، با جدیدترین ویژگی‌ها و وصله‌های امنیتی به‌روز بمانید، و برای به اشتراک گذاشتن دانش و یادگیری از تجربیات دیگران با جامعه درگیر شوید.

گزینه های توضیحات متا

  • با نحوه راه اندازی و پیکربندی NGINX Ingress Controller در Kubernetes از جمله مراحل نصب، بهترین شیوه های امنیتی و نکات بهینه سازی عملکرد آشنا شوید.
  • راهنمای گام به گام برای استقرار NGINX Ingress Controller در یک خوشه Kubernetes، با بینش هایی در مورد سفارشی سازی، عیب یابی و افزایش امنیت.
  • برای مدیریت ترافیک کارآمد، بهبود امنیت و عملکرد بهینه برنامه‌های ابری خود، بر راه‌اندازی NGINX Ingress Controller در Kubernetes مسلط شوید.
[1] https://spacelift.io/blog/kubernetes-ingress “Ingress Kubernetes with NGINX Ingress Controller Example”

[3] https://docs.nginx.com/nginx-ingress-controller/installation/installing-nic/installation-with-manifests/ “نصب با مانیفست ها”

[4] https://kubernetes.io/docs/tasks/access-application-cluster/ingress-minikube/ “Setup Ingress on Minikube with the NGINX Ingress Controller”

[6] https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/ “Ingress Controllers”

[7] https://github.com/kubernetes/ingress-nginx “GitHub – kubernetes/ingress-nginx: Ingress NGINX Controller for Kubernetes”

[8] https://kubernetes.io/docs/concepts/services-networking/ingress/ “Ingress”

[9] https://medium.com/@dikkumburage/how-to-install-nginx-ingress-controller-93a375e8edde “نحوه راه اندازی Nginx Ingress Controller در Kubernetes”

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا