Print this page

Contour Ingress Controller

21 August 2024

Разбираем, как работает Ingress и Ingress Controller в Kubernetes. Поясним разницу между правилами маршрутизации, доменами и путями, покажем, как разворачивать Contour и настраивать доступ к сервисам.


Ingress и Ingress Controller

  • Ingress — объект кластера, где задаются правила маршрутизации.
  • Ingress Controller — реально обрабатывает входящий трафик, смотрит на все Ingress объекты и делает прокси/балансировку.

 

Ingress по хостам

Маршрутизация трафика по доменам:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress-hosts
spec:
  rules:
  - host: www.devopz.tech.net
    http:
      paths:
      - backend:
          serviceName: main
          servicePort: 80
  - host: web1.devopz.tech.net
    http:
      paths:
      - backend:
          serviceName: web1
          servicePort: 80
  - host: web2.devopz.tech.net
    http:
      paths:
      - backend:
          serviceName: web2
          servicePort: 80
  - host: cat.devopz.tech.net
    http:
      paths:
      - backend:
          serviceName: tomcat
          servicePort: 8080

Ingress по путям

Маршрутизация трафика по URL-путям:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress-paths
spec:
  rules:
  - host: www.devopz.tech.net
    http:
      paths:
      - path: "/page1"
        backend:
          serviceName: webx
          servicePort: 80
      - path: "/page2"
        backend:
          serviceName: webx
          servicePort: 80
      - path: "/page3"
        backend:
          serviceName: webx
          servicePort: 80

Установка Contour Ingress Controller

# Устанавливаем Contour
kubectl apply -f https://projectcontour.io/quickstart/contour.yaml

# Проверяем Service envoy, получаем IP или DNS для домена
kubectl get services -n projectcontour envoy -o wide

Создание Deployments

# Разворачиваем веб-приложения
kubectl create deployment main   --image=nginx:latest
kubectl create deployment web1   --image=nginx:version1
kubectl create deployment web2   --image=nginx:version2
kubectl create deployment webx   --image=nginx:versionx
kubectl create deployment tomcat --image=tomcat:8.5.38

Масштабирование Deployments

# Увеличиваем количество реплик
kubectl scale deployment main  --replicas 2
kubectl scale deployment web1  --replicas 2
kubectl scale deployment web2  --replicas 2
kubectl scale deployment webx  --replicas 2

Создание Services

# Создаем ClusterIP Services для каждого Deployment
kubectl expose deployment main   --port 80
kubectl expose deployment web1   --port 80
kubectl expose deployment web2   --port 80
kubectl expose deployment webx   --port 80
kubectl expose deployment tomcat --port 8080

# Проверяем созданные сервисы
kubectl get services -o wide

Применение Ingress

# Применяем файлы Ingress
kubectl apply -f ingress-hosts.yaml
kubectl apply -f ingress-paths.yaml

# Смотрим, какие Ingress объекты есть
kubectl get ingress
kubectl describe ingress

Удаление Contour

# Полностью удаляем Contour
kubectl delete ns projectcontour

Команды Ingress и Ingress Controller

Команда Что делает
kubectl get ingress Показать все Ingress объекты в текущем namespace
kubectl describe ingress <имя> Показать детали Ingress: хосты, пути, сервисы
kubectl apply -f ingress-hosts.yaml Применить правила Ingress по хостам
kubectl apply -f ingress-paths.yaml Применить правила Ingress по путям
kubectl delete ingress <имя> Удалить Ingress объект
kubectl get services -n projectcontour Проверить Service Envoy у Contour, чтобы узнать IP или DNS
kubectl get pods -n projectcontour Проверить статус Pod’ов Contour
kubectl delete ns projectcontour Удалить Contour Ingress Controller полностью
kubectl logs <pod> -n projectcontour Посмотреть логи Ingress Controller
kubectl exec -it <pod> -n projectcontour -- bash Зайти внутрь Pod’а Contour интерактивно

Вывод

Ingress + Ingress Controller — точка входа для всего внешнего трафика в Kubernetes. Ingress описывает правила маршрутизации, а Controller их исполняет. С помощью Contour можно легко управлять доступом к сервисам, SSL и балансировкой, не прописывая всё руками на уровне Node/Pod.