Иногда, например при внедрении anti-DDoS сервисов, возникает необходимость ограничения доступа к публичному сервису в облаке, при этом сам сервис в рамках архитектуры решения находится за простейшим 5-tuple балансировщиком NLB (Network Load Balancer), где создание привычных правил, как например в ALB(Application Load Balancer (aka L7-балансировщик) в принципе невозможно. В окружении Яндекс облака конечно можно задуматься об "апгрейде" на ALB, но в условиях mk8s это влечет за собой принудительное использование "кастомного" Ingress-контроллера от облачного провайдера с необходимостью адаптации имеющейся конфигураций Ingress. В этом случае на помощь приходят относительно новый функционал Яндекс облака - группы безопасности (Security Group (SG)). Конфигурации последних можно создавать как в GUI, как при помощи CLI, API так и при помощи terraform/opentofu сценариев. Рассмотрим какие необходимы конфигурации для создания групп в terraform :
"Основная" группа - правила этой группы обеспечивают базовую работоспособность кластера. Применяется к кластеру и группам узлов.
resource "yandex_vpc_security_group" "k8s-main-sg" {
name = "k8s-main-sg"
description = "Правила группы обеспечивают базовую работоспособность кластера. Применяется к кластеру и группам узлов."
network_id = yandex_vpc_network.network.id
ingress {
protocol = "TCP"
description = "Правило разрешает проверки доступности с диапазона адресов балансировщика нагрузки. Нужно для работы отказоустойчивого кластера и сервисов балансировщика."
predefined_target = "loadbalancer_healthchecks"
from_port = 0
to_port = 65535
}
ingress {
protocol = "ANY"
description = "Правило разрешает взаимодействие мастер-узел и узел-узел внутри группы безопасности."
predefined_target = "self_security_group"
from_port = 0
to_port = 65535
}
ingress {
protocol = "ANY"
description = "Правило разрешает взаимодействие под-под и сервис-сервис. Указываются подсети кластера и сервисов. (где находятся узлы mk8s и вспомогательные ВМ)"
v4_cidr_blocks = ["10.96.0.0/16", "10.112.0.0/16", "10.100.0.0/16","10.101.0.0/16" ]
from_port = 0
to_port = 65535
}
ingress {
protocol = "ICMP"
description = "Правило разрешает отладочные ICMP-пакеты из внутренних подсетей."
v4_cidr_blocks = ["172.16.0.0/12", "10.0.0.0/8", "192.168.0.0/16"]
}
egress {
protocol = "ANY"
description = "Правило разрешает весь исходящий трафик. Узлы могут связаться с Yandex Container Registry, Object Storage, Docker Hub и т. д."
v4_cidr_blocks = ["0.0.0.0/0"]
from_port = 0
to_port = 65535
}
}
Группа, определяющая правила подключения к публичным сервисам
resource "yandex_vpc_security_group" "k8s-public-services" {
name = "k8s-public-services"
description = "Правила группы разрешают подключение к сервисам из интернета. Правила применяются только для групп узлов."
network_id = yandex_vpc_network.network.id
ingress {
protocol = "TCP"
description = "Правило разрешает входящий трафик из интернета на диапазон портов NodePort."
v4_cidr_blocks = ["1.1.1.0/24", "2.2.2.2/32"] # разрешенные для подключения IP
from_port = 30000
to_port = 32767
}
}
Далее необходимо указать используемые SG в конфигурации master узла(ов) в рамках описания ресурса yandex_kubernetes_cluster :
resource "yandex_kubernetes_cluster" "k8s_megacluster" {
...
master {
...
security_group_ids = [ yandex_vpc_security_group.k8s-main-sg.id ]
...
}
и в конфигурации network_interface необходимых групп узлов, где требуется действие правил (ресурс yandex_kubernetes_node_group)
resource "yandex_kubernetes_node_group" "k8s_node_group_highloadmegaservice" {
...
instance_template {
...
network_interface {
...
security_group_ids = [ yandex_vpc_security_group.k8s-main-sg.id, yandex_vpc_security_group.k8s-public-services.id ]
...
}
}
}