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
будет в разделе описание правила брандмауэра.
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 необходимо изменить!