我有一个运行着一些服务的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之一?
答案 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->容器。
希望对您有帮助。