Настройка групп безопасности для инструментов Application Load Balancer для Managed Service for Kubernetes
Для корректной работы Ingress-контроллера или Gateway API нужно настроить группы безопасности кластера и групп узлов Yandex Managed Service for Kubernetes и балансировщика нагрузки Application Load Balancer.
Для кластера, групп узлов и балансировщика можно использовать разные группы безопасности (рекомендуется) или одну и ту же группу.
В группах безопасности должны быть настроены:
- Все стандартные правила, описанные в соответствующих разделах документации:
- Для кластера и групп узлов — в разделе Настройка групп безопасности документации Managed Service for Kubernetes.
- Для балансировщика — в разделе Группы безопасности. Последнее правило, для исходящего трафика на виртуальные машины бэкендов, должно разрешать соединения в подсети групп узлов кластера или его группу безопасности.
- Правила для проверок состояния бэкендов, разрешающие:
- Балансировщику — отправлять трафик узлам кластера по протоколу TCP на порт 10501 (назначение трафика — подсети или группы безопасности групп узлов кластера).
- Группам узлов — принимать этот трафик (источник трафика — подсети балансировщика или его группа безопасности).
Группы безопасности кластера и групп узлов указываются в их настройках. Подробнее см. инструкции:
Идентификаторы групп безопасности балансировщика указываются:
- В ресурсе
Ingress
— в аннотацииingress.alb.yc.io/security-groups
. Если балансировщик создается по несколькимIngress
, ему назначаются все указанные в этихIngress
группы безопасности. - В ресурсе
Gateway
— в аннотацииgateway.alb.yc.io/security-groups
.
Пример настройки
Пусть необходимо создать правила для следующих условий:
- Требуется развернуть балансировщик с публичным IP-адресом, принимающий HTTPS-трафик, в трех подсетях, имеющих CIDR
10.128.0.0/24
,10.129.0.0/24
и10.130.0.0/24
, — далее они помечаются [Б]. - При создании кластера были указаны CIDR кластера
10.96.0.0/16
[К] и CIDR сервисов10.112.0.0/16
[С]. - Группа узлов в кластере расположена в подсети, имеющей CIDR
10.140.0.0/24
[Узл]. - Подключаться к узлам по SSH и управлять кластером через API,
kubectl
и другие утилиты можно только из CIDR203.0.113.0/24
[Упр].
Консоль управления
Создайте следующие группы безопасности и правила:
-
Группа безопасности балансировщика:
Исходящий трафикВходящий трафикДиапазон портов Протокол Назначение CIDR блоки Описание 0-65535
TCP
CIDR
10.140.0.0/24
[Узл]Для отправки трафика, в том числе для проверок состояния, на узлы Диапазон портов Протокол Источник CIDR блоки Описание 80
TCP
CIDR
0.0.0.0/0
Для получения входящего HTTP-трафика 443
TCP
CIDR
0.0.0.0/0
Для получения входящего HTTPS-трафика 30080
TCP
Проверки состояния балансировщика
— Для проверок состояния узлов балансировщика -
Группа безопасности группы узлов для проверок состояния бэкендов:
-
Группа безопасности кластера и группы узлов для служебного трафика:
Исходящий трафикВходящий трафикДиапазон портов Протокол Назначение CIDR блоки Описание 0-65535
Любой
(Any
)Группа безопасности
Текущая
(Self
)Для трафика между мастером и узлами Диапазон портов Протокол Источник CIDR блоки Описание 0-65535
TCP
Проверки состояния балансировщика
— Для сетевого балансировщика нагрузки 0-65535
Любой
(Any
)Группа безопасности
Текущая
(Self
)Для трафика между мастером и узлами 0-65535
ICMPv6
CIDR
10.0.0.0/8
192.168.0.0/16
172.16.0.0/12
Для проверки работоспособности узлов из подсетей внутри Yandex Cloud -
Группа безопасности группы узлов для служебного трафика:
Исходящий трафикВходящий трафикДиапазон портов Протокол Назначение CIDR блоки Описание 0-65535
Любой
(Any
)CIDR
0.0.0.0/0
Для доступа к внешним ресурсам -
Группа безопасности кластера для служебного трафика:
-
Группа безопасности группы узлов для подключения к сервисам из интернета:
Входящий трафикДиапазон портов Протокол Источник CIDR блоки Описание 30000-32767
TCP
CIDR
0.0.0.0/0
Для доступа к сервисам из интернета и подсетей Yandex Cloud -
Группа безопасности группы узлов для подключения к узлам по SSH:
Входящий трафикДиапазон портов Протокол Источник CIDR блоки Описание 22
TCP
CIDR
203.0.113.0/24
[Упр]Для подключения к узлам по SSH
Подробнее о группах безопасности для кластера и групп узлов см. в разделе Настройка групп безопасности документации Managed Service for Kubernetes.
Terraform
Создайте следующие группы безопасности и правила:
locals {
network-id = "<идентификатор_облачной_сети>"
}
resource "yandex_vpc_security_group" "alb" {
description = "Группа безопасности балансировщика"
name = "alb"
network_id = local.network-id
ingress {
description = "Правило для получения входящего HTTP-трафика"
port = 80
protocol = "TCP"
v4_cidr_blocks = ["0.0.0.0/0"]
}
ingress {
description = "Правило для получения входящего HTTPS-трафика"
port = 443
protocol = "TCP"
v4_cidr_blocks = ["0.0.0.0/0"]
}
ingress {
description = "Правило для проверок состояния узлов балансировщика"
port = 30080
protocol = "TCP"
predefined_target = "loadbalancer_healthchecks"
}
egress {
description = "Правило для отправки трафика на узлы, в том числе для проверок состояния"
from_port = 0
to_port = 65535
protocol = "TCP"
v4_cidr_blocks = ["10.140.0.0/24"]
}
}
resource "yandex_vpc_security_group" "nodegroup-backend" {
description = "Группа безопасности группы узлов для проверок состояния бэкендов"
name = "nodegroup-backend"
network_id = local.network-id
ingress {
description = "Правило для проверок состояния бэкендов"
port = 10501
protocol = "TCP"
v4_cidr_blocks = ["10.128.0.0/24", "10.129.0.0/24", "10.130.0.0/24"]
}
}
resource "yandex_vpc_security_group" "k8s-cluster-nodegroup-traffic" {
description = "Группа безопасности кластера и группы узлов для служебного трафика"
name = "k8s-cluster-nodegroup-traffic"
network_id = local.network-id
ingress {
description = "Правило для сетевого балансировщика нагрузки"
from_port = 0
to_port = 65535
protocol = "TCP"
predefined_target = "loadbalancer_healthchecks"
}
ingress {
description = "Правило для трафика между мастером и узлами"
from_port = 0
to_port = 65535
protocol = "ANY"
predefined_target = "self_security_group"
}
ingress {
description = "Правило для проверки работоспособности узлов из подсетей внутри Yandex Cloud"
from_port = 0
to_port = 65535
protocol = "IPV6_ICMP"
v4_cidr_blocks = ["10.0.0.0/8", "192.168.0.0/16", "172.16.0.0/12"]
}
egress {
description = "Правило для трафика между мастером и узлами"
from_port = 0
to_port = 65535
protocol = "ANY"
predefined_target = "self_security_group"
}
}
resource "yandex_vpc_security_group" "nodegroup-traffic" {
description = "Группа безопасности группы узлов для служебного трафика"
name = "nodegroup-traffic"
network_id = local.network-id
ingress {
description = "Правило для трафика между подами и сервисами"
from_port = 0
to_port = 65535
protocol = "ANY"
v4_cidr_blocks = ["10.96.0.0/16", "10.112.0.0/16"]
}
egress {
description = "Правило для доступа к внешним ресурсам"
from_port = 0
to_port = 65535
protocol = "ANY"
v4_cidr_blocks = ["0.0.0.0/0"]
}
}
resource "yandex_vpc_security_group" "k8s-cluster-traffic" {
description = "Группа безопасности кластера для служебного трафика"
name = "k8s-cluster-traffic"
network_id = local.network-id
ingress {
description = "Правило для доступа к API Kubernetes"
port = 443
protocol = "TCP"
v4_cidr_blocks = ["203.0.113.0/24"]
}
ingress {
description = "Правило для доступа к API Kubernetes"
port = 6443
protocol = "TCP"
v4_cidr_blocks = ["203.0.113.0/24"]
}
egress {
description = "Правило для трафика между мастером и подами metric-server"
port = 4443
protocol = "TCP"
v4_cidr_blocks = ["10.96.0.0/16"]
}
}
resource "yandex_vpc_security_group" "nodegroup-services-access" {
description = "Группа безопасности группы узлов для подключения к сервисам из интернета"
name = "nodegroup-services-access"
network_id = local.network-id
ingress {
description = "Правило для доступа к сервисам из интернета и подсетей Yandex Cloud"
from_port = 30000
to_port = 32767
protocol = "TCP"
v4_cidr_blocks = ["0.0.0.0/0"]
}
}
resource "yandex_vpc_security_group" "nodegroup-ssh" {
description = "Группа безопасности группы узлов для подключения к узлам по SSH"
name = "nodegroup-ssh"
network_id = local.network-id
ingress {
description = "Правило для подключения к узлам по SSH"
port = 22
protocol = "TCP"
v4_cidr_blocks = ["203.0.113.0/24"]
}
}