Для Pods и Services в Kubernetes создаются DNS записи следующего вида:
- my-svc.my-namespace.svc.cluster-domain.example
- pod-ipv4-address.my-namespace.pod.cluster-domain.example
ClusterIP открывает доступ к сервису по внутреннему IP-адресу в кластере и делает его доступным только внутри кластера.
NodePort открывает сервис на том же порту каждого выбранного узла в кластере с помощью NAT и делает его доступным вне кластера через <NodeIP>:<NodePort>. Диапазон портов 30000-32767
LoadBalancer создает внешний балансировщик нагрузки и назначает фиксированный внешний IP-адрес для сервиса.
Ingress — это объект, обеспечивающий внешний доступ к сервисам на 7 уровне модели OSI, то есть http или https. Благодаря тому, что он объединяет все правила маршрутизации мы можем использовать один IP адрес для нескольких сервисов
Ingress Controller отвечает за обработку трафика. Его задача — отправить запрос на сервис.
Рассмотрим пример того, как с помощью Kubernetes можно открыть доступ к приложениям извне.
Для начала создадим Deployment нашего frontend приложения с 3 репликами nginx внутри
nano deployment-1.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-frontend
labels:
app: deployment-frontend
spec:
replicas: 3
selector:
matchLabels:
app: deployment-frontend
template:
metadata:
labels:
app: deployment-frontend
spec:
containers:
- name: nginx
image: nginx
Запустим и проверим
kubectl create -f deployment-1.yaml
kubectl get pods
kubectl get deployments.apps
Далее создадим Deployment для Backend
nano deployment-2.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-backend
labels:
app: deployment-backend
spec:
replicas: 1
selector:
matchLabels:
app: deployment-backend
template:
metadata:
labels:
app: deployment-backend
spec:
containers:
- name: multitool
image: wbitt/network-multitool
env:
- name: HTTP_PORT
value: "1180"
- name: HTTPS_PORT
value: "11443"
Запустим и проверим
kubectl create -f deployment-2.yaml
kubectl get pods
kubectl get deployments.apps
Для обеспечения доступа к приложениям внутри кластера создадим Service для Frontend и Backend
nano service-frontend.yaml
---
apiVersion: v1
kind: Service
metadata:
name: service-frontend
spec:
selector:
app: deployment-frontend
ports:
- name: nginx-http
port: 9001
targetPort: 80
nano service-backend.yaml
---
apiVersion: v1
kind: Service
metadata:
name: service-backend
spec:
selector:
app: deployment-backend
ports:
- name: multitool-http
port: 9002
targetPort: 1180
Запустим и проверим
kubectl create -f service-frontend.yaml
kubectl create -f service-backend.yaml
kubectl get svc
Для тестового стенда мы используем MicroK8S поэтому включим Ingress Controller следующим образом
microk8s enable ingress
Теперь создадим Ingress, который обеспечит нам доступ извне
nano ingress-1.yaml
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-1
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: service-frontend
port:
number: 9001
- path: /api
pathType: Prefix
backend:
service:
name: service-backend
port:
number: 9002
Запустим и проверим
kubectl create -f ingress-1.yaml
kubectl get ingress
kubectl describe ingress
Теперь проверим доступ

Удалим запущенные ресурсы
kubectl delete -f ingress-1.yaml
kubectl delete -f service-backend.yaml
kubectl delete -f service-frontend.yaml
kubectl delete -f deployment-2.yaml
kubectl delete -f deployment-1.yaml
kubectl get all