通过 Cloud Function 的 DNS 名称访问 K8s 服务



我有一个运行着K8s集群,里面有一些服务。由于K8s DNS,在集群服务中可以通过HTTP请求与每个服务进行通信,并以它们的名称作为URL(例如http://foo-bar-svc(。这很棒,因为我不需要使用 IP 地址,我假设每次重新部署 pod 时都会更改该地址。

现在,我希望云函数能够向其中一个服务发布请求。

我遵循了本指南并成功创建了 VPC 连接器。 通过我的云函数,我可以向 K8s 集群中的服务发出 HTTP 请求,但前提是我使用显式 IP 地址。

如何改用 K8s DNS 可以解析的 URL 之一?

使用传入主机请求公开 k8s 服务的最佳方法是入口。 您可以使用服务定义入口资源链接,例如:

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 -> 容器。

我希望它有所帮助。