Развертывание приложения в кластере 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