1

我正在尝试找到一种方法来改善我们的基础设施作为 GCP 中的代码情况。我的希望是我可以

  1. 根据添加的目标标签创建防火墙规则白名单
  2. 使目标标签成为部署 yaml 配置的一部分。

我希望通过在部署中添加标签,我可以让它自动将这些标签应用于它创建的任何计算资源或负载均衡器。这样,可以通过 terraform 创建适用于这些标签的防火墙规则。

我是以错误的方式解决这个问题还是有办法做到这一点?这既关乎自动化防火墙规则管理,也关乎清理可能干扰操作的不必要规则。

4

1 回答 1

5

GCP 正在积极使用network tags来标记受防火墙规则(允许、阻止)影响的资源。这些标签与 Compute Engine 实例、托管组等相关联。

Kuberneteslabels用于标记与服务一起使用的资源(暴露您的应用程序)。

以上network tagslabels是单独的资源,它们不能在GCP/GKE环境中一起使用。

请查看有关这些资源的官方文档:


当您创建类型为LoadBalancerin的服务时GKE,您会自动为其创建转发规则。以后可以修改/编辑此规则。可以将其编辑为仅允许来自某些 IP 地址(如家庭/办公室等)的请求的状态。

可以使用 手动修改GCP Dashboard -> VPC Network -> Firewall

我找到了一种使用 Terraform的解决方法GKE,它允许修改由.


考虑到上述情况,我使用TerraformLoadBalancerGKE. 脚步:

  • 产生工作量。
  • 将工作负载暴露给外部使用。
  • 编辑现有转发规则以阻止来自某些 CIDR/s 的流量。

假如说:

  • Terraform已安装并可以访问GCP
  • GKE集群已配置
  • kubectl设置为连接到上面的集群

参考上述步骤:Learn.hashicorp.com: Terraform: Provision GKE cluster

至于Ingress. 管理它在很大程度上取决于使用的解决方案,例如:

  • ingress-nginx
  • ingress-gce

产生工作负载

下面的示例 nginxdeployment将用于响应请求:

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"
            }
          }
        }
      }
    }
  }
}

将工作负载暴露给外部使用

下面的定义将为LoadBalancernginx 部署创建类型的服务:

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 将不知道此转发规则,并且需要导入此转发规则才能对其进行修改。

请具体看一下部分lb_ip。这部分运行成功后Terraform会输出一个LoadBalancer的IP。此值可用于标识与服务关联的转发规则。

编辑现有转发规则以阻止来自某些 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",
   ]

应用防火墙规则转发流量后,应该修改!

于 2020-06-15T05:39:45.623 回答