در معماریهای مبتنی بر Kubernetes، کنترلرهای Ingress نقش کلیدی در مدیریت ترافیک ورودی به سرویسها ایفا میکنند. یکی از گزینههای قدرتمند و محبوب در این حوزه، HAProxy Ingress Controller است که با قابلیتهای بالا در مدیریت ترافیک و پشتیبانی از ویژگیهای پیشرفته، انتخاب مناسبی برای سناریوهای عملیاتی و پروژه های بزرگ محسوب میشود.
برای اطمینان از عملکرد بهینه و شناسایی مشکلات احتمالی، مانیتورینگ دقیق و دائمی این کنترلر ضروری است. خوشبختانه HAProxy Ingress امکان ارائهی متریکهای استاندارد را فراهم کرده است که میتوان با ابزارهای مانیتورینگ مانند سامانه جامع مانیتورینگ معین و یا ابزار های دیگری مانند پرومتئوس و گرافانا نیز آنها را جمعآوری، ذخیره و مصورسازی کرد.
در این مقاله، به صورت گامبهگام نحوهی فعالسازی، پیکربندی و دسترسی به Stats جهت مانیتورینگ HAProxy Ingress Controller را در حالتی که از پیش روی سرور نصب شده باشد و همچنین در هنگام نصب بررسی خواهیم کرد.
پیش نیازها
نکته :سعی کنید از نسخه های جدید Kubernetes و helm استفاده کنید.
نکته مهم :به دلیل تغییرات بسیار زیاد در نسخه های مختلف سعی کنید از نسخه های جدیدتر haproxy استفاده کنید.
برای نصب HAProxy Ingress Controller از دو روش رایج استفاده می شود:
در روش اول یعنی نصب با استفاده از Helm به صورت زیر عمل می کنیم:
ابتدا haproxy-ingress را به ریپازیتوری helm اضافه و آپدیت می کنیم.
helm repo add haproxy-ingress https://haproxy-ingress.github.io/charts
helm repo update
خروجی به شکل زیر می باشد
در ادامه haproxy-ingress را با رعایت نکات و سوییچ های زیر نصب می کنیم تا stats نیز فعال و پورت آن به درستی expose شود.
این فرآیند نصب برای سرویس های از نوع LoadBalancer برنامه ریزی شده است.
helm install haproxy-ingress haproxy-ingress/haproxy-ingress \
--create-namespace --namespace ingress \
--set controller.service.type=LoadBalancer \
--set controller.stats.enabled=true \
--set controller.stats.service.type=LoadBalancer
نکته:دقت نمایید که دستور بالا برای خوانایی بهتر در چندین خط نوشته شده است و باید به صورت یکجا اجرا شود.
در صورت نیاز به فعال سازی بر روی نوع سرویس NodePort باید فرآیند نصب را به صورت زیر اجرا کرد
helm install haproxy-ingress haproxy-ingress/haproxy-ingress \
--create-namespace --namespace ingress \
--set controller.service.type=NodePort \
--set controller.service.nodePorts.http=30080
--set controller.service.nodePorts.https=30443 \
--set controller.stats.enabled=true \
--set controller.stats.service.type=LoadBalancer
برای بررسی و اطمینان از صحت نصب میتوان از دستور زیر استفاده کرد.
kubectl get svc -n ingress
طبق تصویر stats به صورت یک svc مجزا و از طریق پورت 1936 فعال و قابل دسترس است.
در روش دوم یعنی نصب با استفاده از فایل yaml manifest به صورت زیر عمل می کنیم:
ابتدا با دستور زیر اقدام به دریافت فایلyaml manifest از سایت رسمی می کنیم:
git clone https://github.com/haproxytech/kubernetes-ingress.git
سپس به مسیر زیر رفته و فایل haproxy-ingress.yaml را ویرایش می کنیم
cd kubernetes-ingress/deploy
vim haproxy-ingress.yaml
در این مرحله به بخش deploy از فایل haproxy-ingress.yaml مراجعه کرده و argu را از بخش containers پیدا می کنیم سپس مقادیر زیر را به آن اضافه میکنیم تا از فعال سازی Stats اطمینان حاصل کنیم
- --stats
به صورت پیشفرض نصب با نوع سرویس NodePort انجام می شود برای تغییر به نوع سرویس LoadBalancer نیاز است که نوع سرویس را در فایل haproxy-ingress.yaml و از قسمتService به شکل زیر تغییر دهیم :
type: LoadBalancer
شکل پیشفرض service به صورت زیر میباشد که سرویس را از نوع NodePort راه اندازی می کند.
type: NodePort
در انتها با دستور زیر فایل haproxy-ingress.yaml را اجرا می کنیم.
Kubectl apply -f haproxy-ingress.yaml
برای بررسی و اطمینان از صحت نصب میتوان از دستور زیر استفاده کرد
kubectl get svc -A | grep haproxy
توجه شود که در haproxy ingress با نسخه های قبل از سال 2022 احتمال وجود تغییرات وجود دارد و برای فعال سازی Stats نیاز باشد پورتی به غیر از 1024 استفاده کرد.
اگر HAProxy ingress قبلا بر روی سرور نصب شده بود و قصد بررسی فعال بودن Stats را داریم با اجرای دستور زیر میتوان Service های HAProxy و پورت های expose شده را در صورت وجود شناسایی کرد
kubectl get svc -A | grep -i haproxy
خروجی به شکل زیر می باشد
در این قسمت با بررسی پورت های expose شده در صورت وجود پورت 1024 می توان از وجود Stats مطلع شد که مطابق شکل فوق Stats فعال نیست و فقط پورت 443 و 80 expose شده است
نکته:در صورت تمایل به بررسی دقیق تر و یا اطلاع از پورت های custom میتوان svc مورد نظر را با دستور describe بررسی کرد.
درصورت نیاز به فعال سازی Stats و expose کردن پورت مورد نیاز در haproxy ingress نصب شده دو حالت وجود دارد:
1- حالت haproxy ingress نصب شده توسط helm
2- حالت haproxy ingress نصب شده توسط yaml manifest
در حالت اول یعنی نصب شده توسط Helm لازم است با دستور upgrade اقدام به فعال سازی Stats کنیم به این منظور ابتدا نام heml نصب شده را شناسایی می کنیم
helm list -A | grep -i haproxy
سپس با دستور زیر helm نصب شده را upgrade و Stats را بر روی آن فعال می کنیم
helm upgrade haproxy-ingress haproxy-ingress/haproxy-ingress \
--namespace ingress-controller \
--set controller.stats.enabled=true \
--set controller.stats.service.type=LoadBalancer
با اعمال این upgrade یک سرویس جدید با پورت 1936 ایجاد می شود که نوع سرویس نیز LoadBalancer می باشد.
برای مشاهده نتیجه میتوان از دستور زیر استفاده کرد:
kubectl get svc -A | grep -i haproxy
در انتها با دستور زیر میتوان از کارکرد صحیح Stats اطمینان حاصل کرد.
curl <svc-ip>:1936/stats
در حالت دوم یعنی نصب توسط yaml manifest نیاز است که دو بخش مهم یعنی deployment و service را که مربوط به HAProxy ingress است ویرایش کنیم
پس به صورت زیر عمل کرده و deployment مربوط به haproxy ingress را شناسایی کرده و قسمت های args و ports را تغییر می دهیم.
kubectl get deployment -A | grep ingress
سپس با دستور زیر اقدام به ویرایش deployment مورد نظر می کنیم.
kubectl edit <deployment> -n <namespace>
طبق تصویر بالا مقادیر مورد نظر که در ادامه ذکر می شوند را به قسمت args از containers اضافه می کنیم.
- --stats
- --stats-port=1024
و در بخش پایین تر در قسمت ports باید پورت 1024 را با مقادیر زیر طبق تصویر اضافه کنیم.
- containerPort: 1024
name:stats
protocol: TCP
سپس فایل را ذخیره و deployment را با دستور زیر ریستارت می کنیم.
kubectl rollout restart deployment <deploymeny> -n <namespace>
در مرحله بعد فایل Service مربوط به haproxy ingress را شناسایی و ویرایش می کنیم.
Kubectl get svc -A | grep haproxy
سپس با دستور زیر اقدام به ویرایش می کنیم.
kubectl edit svc <svc> -n <namespace>
و مقادیر زیر را طبق تصویر اضافه می کنیم.
- name: stats
port: 1024
protocol: TCP
targetPort: 1024
جهت تست عملکرد پس از ایجاد تغییرات ابتدا Service مورد نظر را بررسی میکنیم و از expose شدن پورت 1024 اطمینان حاصل می کنیم.
kubectl get svc -A | grep haproxy
سپس با دستور زیر میتوانیم صحت عملکرد سرویس را بررسی کنیم.
Curl <haproxy svc ip>:1024/metrics