GCP/GKE添加网络标签



我正试图找到一种方法来改进GCP中的基础设施作为代码的情况。我希望我能

  1. 基于添加的目标标签创建防火墙规则白名单
  2. 将目标标记作为部署yaml-config的一部分

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

我是不是走错了路,还是有办法做到这一点?这既是关于自动化防火墙规则管理,也是关于清理可能干扰操作的不必要规则。

GCP正在积极使用network tags来标记受防火墙规则(允许、阻止)影响的资源。这些标签与计算引擎实例、托管组和其他实例相连接。

Kubernetes正在使用labels来标记与服务一起使用的资源(公开您的应用程序)。

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

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

  • Cloud.google.com:VPC:网络标签
  • Kubernetes.io:概念:标签

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

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

我在Terraform中找到了一个解决方法,它允许修改GKE创建的现有转发规则。


考虑到以上内容,我为具有Terraform和GKELoadBalancer创建了一个示例。步骤:

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

假设:

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

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

对于CCD_ 16。管理它将在很大程度上取决于使用的解决方案,如:

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

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

以下定义将为nginx部署创建类型为LoadBalancer的服务:

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",
]

应用防火墙规则转发流量后,应进行修改

相关内容

  • 没有找到相关文章

最新更新