Ingress یکی از مفاهیم مهم در Kubernetes است که به کاربران خارجی اجازه می دهد با استفاده از FQDN (نام دامنه کاملاً واجد شرایط) به برنامه های کانتینر شده دسترسی پیدا کنند. Ingress به طور پیش فرض در کلاستر Kubernetes فعال و نصب نشده است. ما باید با استفاده از کنترل کننده های ورودی third party مانند Nginx ، Traefik ، HAProxy و غیره این مفهوم را فعال کنیم. در این آموزش نشان خواهیم داد که چگونه می توانیم NGINX Ingress controller را در کلاستر Kubernetes فعال و استفاده کنیم.
همانطور که در تصویر بالا میبینید ، کاربران خارجی با استفاده از NGINX Ingress Controller از طریق FQDN به برنامه ها دسترسی پیدا می کنند و ingress controller داخلی درخواست را به سرویس هدایت می کند و سپس سرویس درخواست را برای backend یا Pod ها هدایت می کند.
فعال کردن NGINX Ingress Controller در Minikube
Minikube یک کلاستر Kubernetes با یک Node است که می توانیم به راحتی با اجرای دستورات زیر nginx ingress controller را در minikube فعال کنیم.
اگر با نحوه نصب minikube آشنایی ندارید، میتوانید مطلب “نحوه نصب Kubernetes (k8s) با Minikube در CentOS 8 ” را دنبال کنید.
برای تأیید وضعیت ingress controller دستور زیر را اجرا کنید
minikube addons list
برای فعال کردن ingress controller، دستور زیر را اجرا کنید
minikube addons enable ingress
اگر دستور “minikube addons list” را دوباره اجرا کنیم ، این بار باید ببینیم که وضعیت ingress فعال است.
برای بررسی اینکه پاد ingress controller در حال اجرا است یا خیر ، دستور kubectl را اجرا کنید.
kubectl get pods --all-namespaces | grep -i nginx-controller
خروجی بالا تأیید می کند که nginx-controller فعال شده است و pod خود را با موفقیت در فضای نام kube-system اجرا کرده است.
تنظیم NGINX Ingress Controller در کلاستر Kubernetes
توجه: من فرض می کنم کلاستر Kubernetes فعال و در حال اجرا است.
همچنین میتوانید مطلب “راه اندازی کلاستر Kubernetes با استفاده از kubeadm ” را دنبال کنید.
به master node یا کنترلپنل بروید و دستور kubectl زیر را اجرا کنید
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/baremetal/deploy.yaml
ما خروجی زیر را خواهیم گرفت
برای بررسی وضعیت پادهای nginx-ingress controller دستور زیر را اجرا کنید
kubectl get pods -n ingress-nginx
خروجی فوق تأیید می کند که NGINX Ingress Controller با موفقیت استقرار یافته است.
تست Ingress Controller
برای آزمایش Ingress Controller ، ما دو برنامه کاربردی مبتنی بر کانتینر httpd و nginx ایجاد خواهیم کرد و این برنامه ها را از طریق سرویس expose خواهیم کرد و سپس ingress resource ایجاد خواهیم کرد که به کاربران خارجی امکان دسترسی به این برنامه ها را با استفاده از url مربوطه می دهد.
استقرار httpd و سرویس آن را با نوع NodePort روی درگاه 80 پیاده سازی کنید، فایل yaml زیر را که شامل بخش استقرار و سرویس است ایجاد کنید:
root@controller:~# vim httpd-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: httpd-deployment
spec:
replicas: 1
selector:
matchLabels:
run: httpd-deployment
template:
metadata:
labels:
run: httpd-deployment
spec:
containers:
- image: httpd
name: httpd-webserver
---
apiVersion: v1
kind: Service
metadata:
name: httpd-service
spec:
type: ClusterIP
selector:
run: httpd-deployment
ports:
- port: 80
فایل را ذخیره کنید ببندید.
با استفاده از دستور kubectl استقرار را انجام میدهیم:
root@controller:~# kubectl create -f httpd-deployment.yaml
استقرار nginx و سرویس آن را با نوع NodePort روی درگاه 80 پیاده سازی کنید، فایل yaml زیر را که شامل بخش استقرار و سرویس است ایجاد کنید:
root@controller:~# vim nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 1
selector:
matchLabels:
run: nginx-deployment
template:
metadata:
labels:
run: nginx-deployment
spec:
containers:
- image: nginx
name: nginx-webserver
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
type: ClusterIP
selector:
run: nginx-deployment
ports:
- port: 80
پرونده را ذخیره کرده و از آن خارج شوید
اکنون دستور kubectl را اجرا کنید:
kubectl create -f nginx-deployment.yaml
برای تأیید وضعیت هر دو deployment و سرویس آنها، دستور زیر را اجرا کنید:
kubectl get deployments.apps httpd-deployment
kubectl get deployments.apps nginx-deployment
kubectl get service nginx-service httpd-service
ساخت و استقرار Ingress Resource
فایل ingress resource زیر را ایجاد کنید که درخواست را بر اساس url یا path به سمت سرویس مربوطه هدایت می کند. در مثال، ما از url یا fqdn استفاده می کنیم.
vim myweb-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: name-based-virtualhost-ingress
spec:
rules:
host: httpd.example.com
http:
paths:
pathType: Prefix
path: "/"
backend:
service:
name: httpd-service
port:
number: 80
host: nginx.example.com
http:
paths:
pathType: Prefix
path: "/"
backend:
service:
name: nginx-service
port:
number: 80
ذخیره کنید و فایل را ببندید.
دستور kubectl زیر را برای ایجاد ingress resource بالا اجرا کنید
kubectl create -f myweb-ingress.yaml
برای بررسی وضعیت ingress resource ایجاد شده در بالا،دستور زیر را اجرا کنید
kubectl get ingress name-based-virtualhost-ingress
kubectl describe ingress name-based-virtualhost-ingress
خروجی بالا تأیید می کند که ingress resource با موفقیت ایجاد شده اند.
قبل از دسترسی به این url ها از خارج از کلاستر، لطفا مطمئن شوید که ورودی های زیر را در فایل hosts سیستم خود اضافه کردید.
192.168.1.190 httpd.example.com
192.168.1.190 nginx.example.com
اکنون سعی کنید از طریق مرورگر وب به این URL ها دسترسی پیدا کنید.
http://httpd.example.com
http://nginx.example.com
خروجی بالا تأیید می کند که ما nginx ingress controller را با موفقیت در Kubernetes راه اندازی کرده ایم.