Развертывание приложения в кластере Kubernetes
В этой статье рассказывается о том, как развернуть приложение в кластере и опубликовать в интернет. Приведенные в статье примеры работают с версиями Kubernetes 1.19 и старше.
Перед тем как начать
Для того, чтобы получить доступ к web-приложению, при настройке кластера нужно включить Плагин NGINX Ingress Controller. При создании в кластер будет установлен контроллер Nginx, а также будет создан LoadBalancer и назначен публичный IP-адрес.
Совет
Если вы хотите развернуть приложение и организовать к нему публичный доступ через Интернет без использования Ingress Controller, рекомендуем изучить данную статью.
Создайте приложение
Сохраните следующую спецификацию для создания приложения в YAML-файл с именем
hello.yaml.Deployment — объект API Kubernetes, который управляет реплицированным приложением.
yamlapiVersion: 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Выполните команду:
shkubectl apply -f hello.yamlРезультат выполнения команды:
shdeployment.apps/hello-deployment created
Создайте сервис
Сохраните следующую спецификацию для создания сервиса в YAML-файл с именем
hello-service.yaml.Service — объект API Kubernetes, который описывает совокупность подов и методов доступов к ним.
yamlkind: Service apiVersion: v1 metadata: name: hello-service spec: selector: app: hello ports: - port: 5000Здесь:
selector— метки селектора, использованные в шаблоне подов при создании объектаDeployment.port— порт контейнера, на котором доступно приложение.
Выполните команду:
shkubectl apply -f hello-service.yamlРезультат выполнения команды:
shservice/hello-service created
Создайте Ingress
Сохраните следующую спецификацию для создания Ingress в YAML-файл с именем
hello-ingress.yaml.Ingress — объект API Kubernetes, который позволяет создавать правила маршрутизации трафика от внешнего источника к конечным точкам различных сервисов, расположенных внутри кластера.
yamlapiVersion: 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).
Выполните команду:
shkubectl apply -f hello-ingress.yamlРезультат выполнения команды:
shingress.networking.k8s.io/hello-ingress createdПроверьте доступность приложения, перейдя по ссылке вида
https://<Ваш_публичный_IP>/hello.
Удаление приложения
Чтобы удалить тестовое приложение, выполните команды:
kubectl delete -f hello-ingress.yaml
kubectl delete -f hello-service.yaml
kubectl delete -f hello.yaml