GCP / GKE Добавить сетевые теги - PullRequest
0 голосов
/ 07 мая 2020

Я пытаюсь найти способ улучшить нашу инфраструктуру в виде кода в GCP. Я надеялся, что смогу

  1. создать белый список правил брандмауэра на основе целевых тегов, добавленных
  2. Сделать целевые теги частью конфигурации yaml развертывания.

Я надеялся, что, добавив теги в развертывание, я смогу автоматически применить эти теги к любым вычислительным ресурсам или балансировщику нагрузки, которые он создает. Таким образом, с помощью terraform можно создать правило брандмауэра, которое применяется к этим тегам.

Я делаю это неправильно или есть способ сделать это? Речь идет как об автоматизации управления правилами брандмауэра, так и об удалении ненужных правил, которые могут мешать работе.

1 Ответ

0 голосов
/ 15 июня 2020

GCP активно использует network tags для пометки ресурсов, на которые действуют правила брандмауэра (разрешить, заблокировать). Эти теги связаны с экземплярами Compute Engine, управляемыми группами и другими.

Kubernetes использует labels для тегирования ресурсов, используемых службой (раскрывая ваше приложение).

Выше network tags и labels - это отдельные ресурсы, и они не могут использоваться вместе в среде GCP/GKE.

Пожалуйста, ознакомьтесь с официальной документацией по ним ресурсы:


Когда вы создаете службу типа LoadBalancer в GKE, вы автоматически создаете для нее правило пересылки. Это правило может быть позже изменено / отредактировано. Его можно отредактировать так, чтобы он разрешал запросы только с определенных IP-адресов, таких как домашний / офис и т. Д. c.

Его можно изменить вручную с помощью GCP Dashboard -> VPC Network -> Firewall.

Я нашел обходной путь с Terraform, который позволяет изменять существующее правило переадресации, созданное GKE.


Имея в виду вышеизложенное, я создал пример для LoadBalancer с Terraform и GKE. Шаги:

  • Создание рабочей нагрузки.
  • Предоставление рабочей нагрузки внешнему использованию.
  • Редактирование существующего правила пересылки для блокировки трафика c от определенных CIDR / s.

Предполагается, что:

  • Terraform установлен и имеет доступ к GCP
  • GKE кластер уже подготовлен
  • kubectl настроен для подключения к вышеуказанному кластеру

Для ссылки на шаги, указанные выше: Learn.hashicorp.com: Terraform: Provision GKE cluster

Что касается Ingress. Управление им во многом будет зависеть от используемого решения, например:

  • ingress-nginx
  • ingress-gce

Создание рабочей нагрузки

Пример ниже nginx deployment будет использоваться для ответа на запрос:

resource "kubernetes_deployment" "nginx" {
  metadata {
    name = "scalable-nginx-example"
    labels = {
      App = "ScalableNginxExample"
    }
  }

  spec {
    replicas = 2
    selector {
      match_labels = {
        App = "ScalableNginxExample"
      }
    }
    template {
      metadata {
        labels = {
          App = "ScalableNginxExample"
        }
      }
      spec {
        container {
          image = "nginx:1.7.8"
          name  = "example"

          port {
            container_port = 80
          }

          resources {
            limits {
              cpu    = "0.5"
              memory = "512Mi"
            }
            requests {
              cpu    = "50m"
              memory = "50Mi"
            }
          }
        }
      }
    }
  }
}

Предоставление рабочей нагрузки внешнему использованию

В приведенном ниже определении будет создана служба типа LoadBalancer для nginx развертывание:

resource "kubernetes_service" "nginx" {
  metadata {
    name = "nginx-example"
  }
  spec {
    selector = {
      App = kubernetes_deployment.nginx.spec.0.template.0.metadata[0].labels.App
    }
    port {
      port        = 80
      target_port = 80
    }

    type = "LoadBalancer"
  }
}

output "lb_ip" {

value = kubernetes_service.nginx.load_balancer_ingress[0].ip

}

GKE автоматически создаст правило пересылки и назначит IP-адрес для балансировщика нагрузки. Terraform не будет знать об этом правиле переадресации, и это правило переадресации необходимо будет импортировать, чтобы иметь возможность изменять его.

Пожалуйста, обратите внимание на c детали lb_ip . После успешного запуска Terraform эта часть выведет IP-адрес LoadBalancer. Это значение можно использовать для идентификации правила пересылки, связанного с услугой.

Редактирование существующего правила переадресации для блокировки трафика c от определенных CIDR / s

Как сказано выше:

Terraform не будет знать об этом Правило переадресации и это правило переадресации необходимо будет импортировать, чтобы его можно было изменить.

Проблема здесь в том, что для полной автоматизации этого обходного пути необходим некоторый самостоятельный сценарий.

Имя правила пересылки необходимо для возможности его изменения.

Один из способов извлечь имя правила пересылки из инфраструктуры GCP:

  • Получите LoadBalancer IP от:
    • $ kubectl get svc nginx-example
  • Получите forwarding rule имя от:
    • $ gcloud compute firewall-rules list --format=json

Отказ от ответственности: приведенная выше команда выведет все правила брандмауэра с такими деталями, как целевые теги, приоритет и описание в формате json. LoadBalancer IP будет в разделе описание правила брандмауэра.

  • Извлеченное имя правила переадресации должно выглядеть примерно так:
    • k8s-fw-aefb2110aad9e11ea971d42010a9c00a
  • Используйте указанное выше имя для создания ресурса в Terraform:

    • Создайте нужное определение forwarding rule в файле. Взгляните на пример правила ниже и измените его в соответствии с вашим вариантом использования. Этот ресурс можно использовать как шаблон для других новых ресурсов. Убедитесь, что target_tags совпадают с неизмененной версией.

      Пример определения правила пересылки:

resource "google_compute_firewall" "YOUR-NAME-OF-FORWARDING" {
  project = "PROJECT-NAME"
  provider = google-beta
  name = "k8s-fw-aefb2110aad9e11ea971d42010a9c00a"
  network = "PROJECT-NETWORK"
  source_ranges = ["1.2.3.4/32"]
  priority = "1000"
  allow {
    protocol = "tcp"
    ports = ["80"]
    }
  target_tags = ["gke-PROJECT-NAME-gke-c6d3956c-node"] # 
  direction = "INGRESS"
  }
  • Импортировать ресурс с:
$ terraform import google_compute_firewall.YOUR-NAME-OF-FORWARDING projects/PROJECT-NAME/global/firewalls/k8s-fw-aefb2110aad9e11ea971d42010a9c00a`

При выдаче $ terraform apply вы должны увидеть желаемые изменения в forwarding rule, как показано ниже (часть):

 ~ source_ranges           = [
     - "0.0.0.0/0",
     + "1.2.3.4/32",
   ]

После применения правила брандмауэра для пересылки трафика c необходимо изменить!

...