google-cloud-functions - 通过 Cloud Function 中的 DNS 名称访问 K8s 服务
问题描述
我有一个运行着一些服务的 K8s 集群。由于 K8s DNS,集群内的服务可以通过 HTTP 请求以它们的名称作为 URL(例如http://foo-bar-svc
)与每个服务进行通信。这很好,因为我不需要使用 IP 地址,我假设每次重新部署 pod 时都会更改。
现在我希望云功能能够向其中一项服务发布请求。
我已遵循本指南并成功创建了 VPC 连接器。通过我的 Cloud Function,我可以向我的 K8s 集群中的服务发出 HTTP 请求,但前提是我使用显式 IP 地址。
如何改用 K8s DNS 可以解析的 URL 之一?
解决方案
使用传入主机请求公开 k8s 服务的最佳方式是入口。您可以使用您的服务定义一个 Ingress 资源链接,例如:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: simple-fanout-example
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: foo.bar.com
http:
paths:
- path: /foo
backend:
serviceName: service1
servicePort: 4200
- path: /bar
backend:
serviceName: service2
servicePort: 8080
在这个例子中,我们定义了一个主机 foo.bar.com 来解析和依赖路径 /foo 或 /bar 我们重新路由到后面的服务。当然,您可以将其替换为前缀“/*”,以便将所有内容重新路由到一个特定的服务路径。
请参考文档:https ://kubernetes.io/docs/concepts/services-networking/ingress/
但是使用此配置,您需要在前面有一个负载均衡器和一个 DNS 条目的别名: https ://cloud.google.com/kubernetes-engine/docs/concepts/ingress?hl=en
为了更具弹性,您可以添加一个入口控制器(nginx、traefik ....):https ://kubernetes.io/docs/concepts/services-networking/ingress-controllers/
因此,架构将是:
DNS 服务器 <-> 客户端解析 DNS -> LB -> 入口控制器 -> 服务 -> Pod -> 容器。
我希望它有所帮助。
推荐阅读
- python - 通过更改参数值进行初始化时的 Python 底图错误
- rstudio - 如何在由 slurm 管理的自动缩放集群上设置 Rstudio、sparklyR?
- javascript - 如何让 VS2019 尊重绝对路径?
- django - 无法从应用程序中导入视图 Django 3.1 中项目的 URL
- python - Randint 没有被识别为函数?我想不通
- python - 是否有一个 numpy 函数或某种改进下一个嵌套 for 循环的方法?
- javascript - Reactjs - 当我单击特定页面上的按钮时创建动态子菜单项
- azerothcore - 为什么我在使用自定义模块进行编译时会出现错误?
- arrays - 在 C 中使用 UDP 从客户端传输布尔数组
- css - 在 React 中包含 SVG 资源作为组件