Перейти к содержимому

Развертывание приложения в кластере Kubernetes

В этой статье рассказывается о том, как развернуть приложение в кластере и опубликовать в интернет. Приведенные в статье примеры работают с версиями Kubernetes 1.19 и старше.

Для того, чтобы получить доступ к web-приложению, при настройке кластера нужно включить Плагин NGINX Ingress Controller. При создании в кластер будет установлен контроллер Nginx, а также будет создан LoadBalancer и назначен публичный IP-адрес.

Совет

Если вы хотите развернуть приложение и организовать к нему публичный доступ через Интернет без использования Ingress Controller, рекомендуем изучить данную статью.

  1. Сохраните следующую спецификацию для создания приложения в YAML-файл с именем hello.yaml.

    Deployment — объект API Kubernetes, который управляет реплицированным приложением.

    yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: hello-deployment
    spec:
    selector:
    matchLabels:
    app: hello
    replicas: 2
    template:
    metadata:
    labels:
    app: hello
    spec:
    containers:
    - name: hello
    image: prakhar1989/catnip
    ports:
    - containerPort: 5000
  2. Выполните команду:

    shell
    kubectl apply -f hello.yaml

    Результат выполнения команды:

    shell
    deployment.apps/hello-deployment created
  1. Сохраните следующую спецификацию для создания сервиса в YAML-файл с именем hello-service.yaml.

    Service — объект API Kubernetes, который описывает совокупность подов и методов доступов к ним.

    yaml
    kind: Service
    apiVersion: v1
    metadata:
    name: hello-service
    spec:
    selector:
    app: hello
    ports:
    - port: 5000

    Здесь:

    • selector — метки селектора, использованные в шаблоне подов при создании объекта Deployment.

    • port — порт контейнера, на котором доступно приложение.

  2. Выполните команду:

    shell
    kubectl apply -f hello-service.yaml

    Результат выполнения команды:

    shell
    service/hello-service created
  1. Сохраните следующую спецификацию для создания Ingress в YAML-файл с именем hello-ingress.yaml.

    Ingress — объект API Kubernetes, который позволяет создавать правила маршрутизации трафика от внешнего источника к конечным точкам различных сервисов, расположенных внутри кластера.

    yaml
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
    name: hello-ingress
    annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/rewrite-target: /$2
    spec:
    rules:
    - http:
    paths:
    - path: /hello(/|$)(.*)
    pathType: ImplementationSpecific
    backend:
    service:
    name: hello-service
    port:
    number: 5000

    В Nginx настроено автоматическое обнаружение всех ingress с помощью аннотации kubernets.io/ingress.class: “nginx”. Об аннотациях ingress-controller для nginx можно подробнее почитать здесь.

    Раздел rules описывает правила маршрутизации траффика. Каждое правило содержит следующую информацию:

    • Хост (host) - опционально. В данном примере хост не определен, поэтому правило применяется ко всему трафику, поступающему на публичный IP адрес. Если хост указан (например, hello.com), то правила правила применяются к этому хосту.

    • Список путей (paths) - например, /hello. Каждый путь связан с бэкендом (backend), который определен с помощью service.name и service.port.name (или service.port.number). Входящий запрос должен содержать корректный хост (host) и путь (path), чтобы балансировщик нагрузки направил трафик на указанный сервис (service).

  2. Выполните команду:

    shell
    kubectl apply -f hello-ingress.yaml

    Результат выполнения команды:

    shell
    ingress.networking.k8s.io/hello-ingress created
  3. Проверьте доступность приложения, перейдя по ссылке вида https://<Ваш_публичный_IP>/hello.

Чтобы удалить тестовое приложение, выполните команды:

shell
kubectl delete -f hello-ingress.yaml
kubectl delete -f hello-service.yaml
kubectl delete -f hello.yaml