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

时间:2019-11-28 15:30:03

标签: google-cloud-functions google-kubernetes-engine

我有一个运行着一些服务的K8s集群。由于K8的DNS,群集服务中的服务可以通过HTTP请求以其名称作为URL(例如public class stgAppBar extends AppBarLayout { public stgAppBar(Context context) { super(context); setupLayout(context); } public stgAppBar(Context context, AttributeSet attrs) { super(context, attrs); setupLayout(context); } private void setupLayout(Context context){ AppBarLayout.LayoutParams params = new AppBarLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, setDP(context, 150) ); setLayoutParams(params); setElevation(0); setFitsSystemWindows(true); setBackgroundColor(context.getResources().getColor(R.color.stgWhite, null)); setId(View.generateViewId()); }} )与每个服务进行通信。之所以如此,是因为我不需要使用IP地址,我认为IP地址在每次重新部署Pod时都会更改。

现在,我希望Cloud Function能够将请求发布到这些服务之一。

我已遵循this指南并成功创建了VPC连接器。 通过我的Cloud Function,我可以向K8s集群中的服务发出HTTP请求,但前提是我使用一个明确的IP地址。

我该如何使用K8s DNS可以解析的URL之一?

1 个答案:

答案 0 :(得分:1)

使用传入的主机请求公开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->容器。

希望对您有帮助。