我正在尝试找到一种方法来改善我们的基础设施作为 GCP 中的代码情况。我的希望是我可以
- 根据添加的目标标签创建防火墙规则白名单
- 使目标标签成为部署 yaml 配置的一部分。
我希望通过在部署中添加标签,我可以让它自动将这些标签应用于它创建的任何计算资源或负载均衡器。这样,可以通过 terraform 创建适用于这些标签的防火墙规则。
我是以错误的方式解决这个问题还是有办法做到这一点?这既关乎自动化防火墙规则管理,也关乎清理可能干扰操作的不必要规则。
我正在尝试找到一种方法来改善我们的基础设施作为 GCP 中的代码情况。我的希望是我可以
我希望通过在部署中添加标签,我可以让它自动将这些标签应用于它创建的任何计算资源或负载均衡器。这样,可以通过 terraform 创建适用于这些标签的防火墙规则。
我是以错误的方式解决这个问题还是有办法做到这一点?这既关乎自动化防火墙规则管理,也关乎清理可能干扰操作的不必要规则。
GCP 正在积极使用network tags
来标记受防火墙规则(允许、阻止)影响的资源。这些标签与 Compute Engine 实例、托管组等相关联。
Kuberneteslabels
用于标记与服务一起使用的资源(暴露您的应用程序)。
以上network tags
和labels
是单独的资源,它们不能在GCP/GKE
环境中一起使用。
请查看有关这些资源的官方文档:
当您创建类型为LoadBalancer
in的服务时GKE
,您会自动为其创建转发规则。以后可以修改/编辑此规则。可以将其编辑为仅允许来自某些 IP 地址(如家庭/办公室等)的请求的状态。
可以使用 手动修改GCP Dashboard -> VPC Network -> Firewall
。
我找到了一种使用 Terraform的解决方法GKE
,它允许修改由.
考虑到上述情况,我使用TerraformLoadBalancer
和GKE
. 脚步:
假如说:
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"
}
}
}
}
}
}
}
下面的定义将为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 将不知道此转发规则,并且需要导入此转发规则才能对其进行修改。
请具体看一下部分lb_ip
。这部分运行成功后Terraform
会输出一个LoadBalancer的IP。此值可用于标识与服务关联的转发规则。
如上所述:
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",
]
应用防火墙规则转发流量后,应该修改!