google-cloud-platform - 在同一项目中使用 Cloud Composer 和 Cloud Functions 时,如何使用 VPC Service Controls 在 GCP 上配置防火墙规则和 DNS 设置?
问题描述
我们在为单个项目配置 VPC Service Controls 下的两个 GCP 组件(GCP Cloud Composer、GCP Functions)时遇到问题。我们可以使用 VPC Service Controls 单独配置它们,但是一旦添加第二个组件,我们就会遇到麻烦。
一旦我们为 Cloud Function 配置了防火墙规则和 DNS 设置,Composer 就会开始失败。Composer 监控工具(用于 webserver、SQL server 等)显示 composer 不健康。
我们做错了什么?
我们使用的文档:
https ://cloud.google.com/functions/docs/securing/using-vpc-service-controls
https://cloud.google.com/composer/docs/configuring-vpc-sc
对于 Composer,我们使用以下设置:
- 3个节点
- 标准机器类型
- 镜像版本:composer-1.16.3-airflow-1.10.15
- 蟒蛇:v3
- 私有 IP 作曲家
我们为 VPC Service Controls 启用的 API:
- 谷歌云数据处理 API
- 云函数 API
- 谷歌云发布/订阅 API
- 云 SQL API
- 谷歌云存储 API
- 谷歌计算引擎 API
- 谷歌 Kubernetes 引擎 API
- 谷歌容器注册 API
- 云端监控 API
- Cloud Composer API
- 工件注册表 API
防火墙设置(基于文档):
姓名 | 类型 | 目标 | 过滤器 | 协议/端口 | 行动 | 优先 |
---|---|---|---|---|---|---|
作曲家-出口-gke-集群-所有端口 | 出口 | 全部应用 | IP 范围:10.10.0.0/16 | tcp、udp | 允许 | 1000 |
作曲家出口健康检查 | 出口 | 全部应用 | IP 范围:130.211.0.0/22、35.191.0.0/16 | tcp:80,443 | 允许 | 1000 |
作曲家出口端口53 | 出口 | 全部应用 | IP 范围:0.0.0.0/0 | tcp:53, UDP:53 | 允许 | 1000 |
作曲家出口网络服务器 | 出口 | 全部应用 | IP 范围:172.31.251.0/24 | tcp:3306,3307 | 允许 | 1000 |
受限制的谷歌 API | 出口 | 全部应用 | IP 范围:199.36.153.4/30 | tcp:443 | 允许 | 1000 |
作曲家拒绝所有 | 出口 | 全部应用 | IP 范围:0.0.0.0/0 | 全部 | 否定 | 2000 |
作曲家-入口-helthcheck | 入口 | 全部应用 | IP 范围:130.211.0.0/22、35.191.0.0/16 | tcp:80,443 | 允许 | 1000 |
入口-iap | 入口 | 全部应用 | IP 范围:35.235.240.0/20 | tcp | 允许 | 1000 |
gke-europe-west1-composer-dns-xxx-xxx-all | 入口 | gke-europe-west1-composer-dns-xxx-xxx-node | IP 范围:10.124.0.0/14 | tcp;udp;esp;ah;sctp;icmp | 允许 | 1000 |
gke-europe-west1-composer-dns-xxx-xxx-master | 入口 | gke-europe-west1-composer-dns-xxx-xxx-node | IP 范围:172.16.8.0/28 | tcp:10250,443 | 允许 | 1000 |
gke-europe-west1-composer-dns-xxx-xxx-vms | 入口 | gke-europe-west1-composer-dns-xxx-xxx-node | IP 范围:10.10.0.0/16 | tcp:1-65535;udp:1-65535;icmp | 允许 | 1000 |
DNS 设置(基于文档):
DNS 名称:googleapis.com。类型:私人
DNS 名称 | 类型 | TTl(秒) | 数据 |
---|---|---|---|
*.googleapis.com。 | CNAME | 300 | 受限制的.googleapis.com。 |
googleapis.com。 | SOA | 21600 | ns-gcp-private.googledomains.com。cloud-dns-hostmaster.google.com。1 21600 3600 259200 300 |
googleapis.com。 | NS | 21600 | ns-gcp-private.googledomains.com。 |
DNS 名称:cloudfunctions.net。类型:私人
DNS 名称 | 类型 | TTl(秒) | 数据 |
---|---|---|---|
*.cloudfunctions.net。 | 一个 | 300 | 199.36.153.4,199.36.153.5,199.36.153.6,199.36.153.7 |
云功能网 | NS | 21600 | ns-gcp-private.googledomains.com。cloud-dns-hostmaster.google.com。1 21600 3600 259200 300 |
cloudfunctions.net。 | SOA | 21600 | ns-gcp-private.googledomains.com。 |
DNS 名称:pkg.dev。类型:私人
DNS 名称 | 类型 | TTl(秒) | 数据 |
---|---|---|---|
*.pkg.dev。 | CNAME | 300 | pkg.dev。 |
pkg.dev。 | SOA | 21600 | ns-gcp-private.googledomains.com。cloud-dns-hostmaster.google.com。1 21600 3600 259200 300 |
pkg.dev。 | NS | 21600 | ns-gcp-private.googledomains.com。 |
pkg.dev。 | 一个 | 300 | 199.36.153.4,199.36.153.5,199.36.153.6,199.36.153.7 |
DNS 名称:gcr.io。类型:私人
DNS 名称 | 类型 | TTl(秒) | 数据 |
---|---|---|---|
*.gcr.io。 | CNAME | 300 | gcr.io。 |
gcr.io。 | SOA | 21600 | ns-gcp-private.googledomains.com。cloud-dns-hostmaster.google.com。1 21600 3600 259200 300 |
gcr.io。 | NS | 21600 | ns-gcp-private.googledomains.com。 |
gcr.io。 | 一个 | 300 | 199.36.153.4,199.36.153.5,199.36.153.6,199.36.153.7 |
感谢您的任何想法或帮助,您可以提供什么。
解决方案
同时我们也发现了问题:
- 最成问题的是
A
缺少googleapis.com.
包含 IP 地址的类型 DNS 记录。 - 第二个问题是来自 Cloud Function 的 VPC SC 设置文档的防火墙规则阻止了以下之间的通信:
- 子网上 Composer 的节点
- 在工作节点和主节点(为作曲家创建的 Kubernetes 集群)之间,主节点在不同的项目中自动创建,并通过网络对等连接到作曲家工作人员的子网
当这些服务中的两个应该一起使用时,这两个文档显然没有涵盖这种特殊情况。解决上述问题后,它已开始工作。
我们仍然遇到的问题:
- 此类问题很难调试,因为 composer 的监控 UI 显示信息的方式似乎不一致
- 在子网上启用 StackDriver 日志后,很难使用它进行调试,因为它的信息太多,而且它们记录在“信息”级别,而不是“警告”或“错误”级别
推荐阅读
- powershell - 断开 OpenFiles
- java - 在运行时创建多个调度程序
- c# - 如何使用 EF Core(存储库模式)建立一对多关系
- python - 为什么我的文本文件在 python 中导入时返回为空,即使文件中有值?
- shiny - Shinyjs:如何检测用户是否单击了选项卡?
- php - Woocommerce 从最低订单要求中排除特定购物车类别
- python - 想要使用 bash 或 python 创建 n-1 级别的目录列表(不包含任何子文件夹的文件夹)
- javascript - Transform 属性在 Firefox 中不起作用,但在 Chrome 和 Safari 中起作用。该怎么办?
- angular - Angular - 使用 ngOnInit 加载组件
- c# - C#通过按下按钮在后台执行