我正试图找到一种方法来改进GCP中的基础设施作为代码的情况。我希望我能
- 基于添加的目标标签创建防火墙规则白名单
- 将目标标记作为部署yaml-config的一部分
我希望通过在部署中添加标记,我可以让它将这些标记自动应用于它创建的任何计算资源或负载均衡器。通过这种方式,可以通过terraform创建适用于这些标签的防火墙规则。
我是不是走错了路,还是有办法做到这一点?这既是关于自动化防火墙规则管理,也是关于清理可能干扰操作的不必要规则。
GCP正在积极使用network tags
来标记受防火墙规则(允许、阻止)影响的资源。这些标签与计算引擎实例、托管组和其他实例相连接。
Kubernetes正在使用labels
来标记与服务一起使用的资源(公开您的应用程序)。
以上network tags
和labels
是独立的资源,它们不能在GCP/GKE
环境中一起使用
请查看有关这些资源的官方文件:
- Cloud.google.com:VPC:网络标签
- Kubernetes.io:概念:标签
在GKE
中创建类型为LoadBalancer
的服务时,会自动为其创建转发规则。此规则稍后可以修改/编辑。它可以编辑为只允许来自某些IP地址(如家庭/办公室等)的请求的状态。
可以使用GCP Dashboard -> VPC Network -> Firewall
手动修改。
我在Terraform中找到了一个解决方法,它允许修改GKE
创建的现有转发规则。
考虑到以上内容,我为具有Terraform和GKE
的LoadBalancer
创建了一个示例。步骤:
- 产生工作量
- 将工作负载暴露给外部使用
- 编辑现有转发规则以阻止来自某些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",
]
应用防火墙规则转发流量后,应进行修改