是否可以通过入口以ClusterIP类型公开服务?
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: my-service
ports:
- name: my-service-port
port: 4001
targetPort: 4001
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: app-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: my.example.com
http:
paths:
- path: /my-service
backend:
serviceName: my-service
servicePort: 4001
我知道服务可以通过NodePort的类型公开,但是如果有人告诉我什么是从云中的Internet世界中检测内部服务的最快方法,它可能会增加一个NAT连接的费用。
答案 0 :(得分:2)
否,只能从群集内部访问clusterIP。 Ingress本质上只是一组第7层转发规则,它不能满足将群集内部暴露于外界的第4层要求。至少需要1个NAT步骤。
不过,要使Ingress正常工作,您至少需要涉及一项服务才能在外部公开您的工作负载,因此必须使用nodePort或loadBalancer。入口控制器和群集的基础结构将确定您需要使用两种服务中的哪一种。
对于Nginx入口,您需要有一个LoadBalancer服务,该入口将用于将流量从群集外部桥接到群集内部。之后,您可以为每个工作负载使用clusterIP服务。
在上面的示例中,只要正确配置了nginx入口控制器(使用负载均衡器),那么您使用的配置就可以正常工作。
答案 1 :(得分:0)
简而言之:是
首先,让我们来看一下official documentation的内容:
Ingress将HTTP和HTTPS路由从群集外部公开到群集内的服务。
[...]
Ingress控制器通常通过负载均衡器负责实现Ingress。
这里令人困惑的是术语负载均衡器。在上面的定义中,我们谈论的是Web负载均衡器中的经典且广为人知的内容。
这与kubernetes无关!
所以回到定义,要使用Ingress
并使其起作用,我们需要一个名为IngressController
的kubernetes资源。而此资源恰好是负载平衡器!就是这样。
但是,您必须记住,外部负载均衡器 和类型为type:LoadBalancer
的 kubernetes服务之间存在差异。
因此,总结(为了将来自外部世界的流量重定向到您的k8s clusterIp服务):
kind:Ingress
正常工作?是的,这是kind:IngressController
kubernetes资源。type:LoadBalancer
或type:NodePort
来使kind:Ingress
正常工作?绝对不行!服务type:ClusterIP
可以正常工作!