Обеспечение доступа к приложению, запущенному в кластере Kubernetes
Для предоставления доступа к приложению, запущенному в кластере Kubernetes, вы можете использовать публичные и внутренние сервисы различных типов.
Чтобы предоставить публичный доступ к приложению, воспользуйтесь сервисом типа LoadBalancer
с публичным IP-адресом.
Доступ к приложению может быть предоставлен из внутренних сетей, но не из кластера Kubernetes: из подсетей Yandex Virtual Private Cloud или внутренних подсетей организации, подключенных к Yandex.Cloud с помощью сервиса Yandex Cloud Interconnect или через VPN. Для этого используйте сервис типа LoadBalancer
на основе внутреннего сетевого балансировщика нагрузки.
Примечание
В отличие от IP-адреса пода или узла, который может меняться в случае обновления ресурсов группы узлов, IP-адрес сервиса типа LoadBalancer
не изменяется.
Подготовьте и запустите в кластере Kubernetes приложение, к которому необходимо предоставить доступ с помощью сервиса типа LoadBalancer
. В качестве примера используйте простое приложение, которое отвечает на HTTP-запросы на порт 8080.
- Создайте простое приложение
- Создайте сервис типа LoadBalancer с публичным IP-адресом
- Создайте сервис типа LoadBalancer с внутренним IP-адресом
- Дополнительные настройки для сервиса типа LoadBalancer
Создайте простое приложение
-
Сохраните следующую спецификацию для создания приложения в YAML-файл с именем
hello.yaml
:Deployment — объект API Kubernetes, который управляет реплицированным приложением.
apiVersion: apps/v1 kind: Deployment metadata: name: hello spec: replicas: 2 selector: matchLabels: app: hello template: metadata: labels: app: hello spec: containers: - name: hello-app image: cr.yandex/crpjd37scfv653nl11i9/hello:1.1
-
Создайте приложение:
CLIЕсли у вас еще нет интерфейса командной строки Yandex.Cloud, установите и инициализируйте его.
По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра
--folder-name
или--folder-id
.kubectl apply -f hello.yaml
Результат выполнения команды:
deployment.apps/hello created
-
Посмотрите информацию о созданном приложении:
CLIkubectl describe deployment hello
Результат выполнения команды:
Name: hello Namespace: default CreationTimestamp: Wed, 28 Oct 2020 23:15:25 +0300 Labels: <none> Annotations: deployment.kubernetes.io/revision: 1 Selector: app=hello Replicas: 2 desired | 2 updated | 2 total | 1 available | 1 unavailable StrategyType: RollingUpdate MinReadySeconds: 0 RollingUpdateStrategy: 25% max unavailable, 25% max surge Pod Template: Labels: app=hello Containers: hello-app: Image: cr.yandex/crpab12cdef353nl11i9/hello:1.1 Port: <none> Host Port: <none> Environment: <none> Mounts: <none> Volumes: <none> Conditions: Type Status Reason ---- ------ ------ Available False MinimumReplicasUnavailable Progressing True ReplicaSetUpdated OldReplicaSets: <none> NewReplicaSet: hello-74c9c1b238 (2/2 replicas created) Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal ScalingReplicaSet 10s deployment-controller Scaled up replica set hello-74c9c1b238 to 2
Создайте сервис типа LoadBalancer с публичным IP-адресом
Когда вы создаете сервис типа LoadBalancer
, контроллер Yandex.Cloud создает и настраивает для вас сетевой балансировщик нагрузки в вашем каталоге с публичным IP-адресом.
Важно
- Созданный сетевой балансировщик тарифицируется согласно установленным правилам тарификации.
- Не изменяйте и не удаляйте сетевой балансировщик нагрузки и целевые группы, которые будут автоматически созданы в вашем каталоге после создания сервиса с типом
LoadBalancer
.
-
Сохраните следующую спецификацию для создания сервиса типа
LoadBalancer
в YAML-файл с именемload-balancer.yaml
:apiVersion: v1 kind: Service metadata: name: hello spec: ports: - port: 80 name: plaintext targetPort: 8080 selector: app: hello type: LoadBalancer
Где:
port
— порт сетевого балансировщика, на котором будут обслуживаться пользовательские запросы.targetPort
— порт контейнера, на котором доступно приложение.selector
— метки селектора, использованные в шаблоне подов при создании объектаDeployment
.
-
Создайте сетевой балансировщик нагрузки:
CLIkubectl apply -f load-balancer.yaml
Результат выполнения команды:
service/hello created
-
Посмотрите информацию о созданном сетевом балансировщике нагрузки:
Консоль управленияCLI- В консоли управления выберите ваш каталог по умолчанию.
- Выберите сервис Network Load Balancer.
- На вкладке Балансировщики отображен сетевой балансировщик нагрузки с префиксом
k8s
в имени и уникальным идентификатором вашего кластера Kubernetes в описании.
kubectl describe service hello
Результат выполнения команды:
Name: hello Namespace: default Labels: <none> Annotations: Selector: app=hello Type: LoadBalancer IP: 172.20.169.7 LoadBalancer Ingress: 130.193.50.111 Port: plaintext 80/TCP TargetPort: 8080/TCP NodePort: plaintext 32302/TCP Endpoints: 10.1.130.4:8080 Session Affinity: None External Traffic Policy: Cluster Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal EnsuringLoadBalancer 2m43s service-controller Ensuring load balancer Normal EnsuredLoadBalancer 2m17s service-controller Ensured load balancer
-
Убедитесь, что приложение доступно из интернета:
CLIcurl http://130.193.50.111
Где:
130.193.50.111
— публичный IP-адрес из поляLoadBalancer Ingress
.
Результат выполнения команды:
Hello, world! Running in 'hello-74c9c1b238-c1rpa'
Создайте сервис типа LoadBalancer с внутренним IP-адресом
Чтобы создать сетевой балансировщик нагрузки с внутренним IP-адресом, укажите в YAML-спецификации сервиса в секции annotations
парамеры yandex.cloud/load-balancer-type
и yandex.cloud/subnet-id
:
apiVersion: v1
kind: Service
metadata:
name: hello
annotations:
yandex.cloud/load-balancer-type: internal
yandex.cloud/subnet-id: e1b23q26ab1c0dce8te9
spec:
ports:
- port: 80
name: plaintext
targetPort: 8080
selector:
app: hello
type: LoadBalancer
Где:
yandex.cloud/subnet-id
— идентификатор подсети, в которой необходимо выделить IP-адрес для сетевого балансировщика нагрузки.port
— порт сетевого балансировщика, на котором будут обслуживаться пользовательские запросы.targetPort
— порт контейнера, на котором доступно приложение.selector
— метки селектора, использованные в шаблоне подов при создании объектаDeployment
.
Дополнительные настройки для сервиса типа LoadBalancer
В Managed Service for Kubernetes для сервиса типа LoadBalancer
доступны следующие дополнительные настройки:
- Назначение заранее зарезервированного публичного IP-адреса с помощью параметра
loadBalancerIP
. - Управление трафиком с помощью параметра externalTrafficPolicy:
Cluster
— трафик попадает на любой из узлов кластера Kubernetes. При этом:- В случае отсутствия нужных подов на узле, трафик перенаправляется с помощью kube-proxy на другой узел.
Local
— трафик напрямую попадает на узлы, где запущены контейнеры приложений. При этом:- Сохраняется IP-адрес запроса пользователя.
- Используется меньше горизонтального трафика между виртуальными машинами.
Параметры loadBalancerIP
и externalTrafficPolicy
не обязательные. Если их не указывать, балансировщик будет создан с динамическим IP-адресом и параметром externalTrafficPolicy: Cluster
.
Пример YAML-спецификации сервиса типа LoadBalancer
с этими параметрами:
apiVersion: v1
kind: Service
metadata:
name: hello
spec:
ports:
- port: 80
name: plaintext
targetPort: 8080
selector:
app: hello
loadBalancerIP: <заранее зарезервированный IP-адрес>
type: LoadBalancer
externalTrafficPolicy: <Local или Cluster>