null

Группы безопасности для managed k8s в окружении Яндекс облака

Иногда, например при внедрении 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 ]

    ...

    }
  }
}

 

Вперед

Коротко о себе:

Работаю в компании TUNE-IT в качестве инженера и преподавателя.

В сферу профессиональных интересов входит все,  что связано с "большими" и не очень серверами и СХД от Sun Microsystems/Oracle и кластерами на их основе, но по долгу службы занимаюсь чаще всего их диагностикой и ремонтом... 

Делюсь опытом и  наработанными навыками в рамках курсов по  соответствующим направлениям.