Ingress使用类型为clusterIP的服务进行暴露

4

使用ClusterIP类型的Ingress暴露服务是否可行?

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类型暴露,但这可能会增加一个NAT连接。如果有人能向我展示如何在云中从互联网快速检测内部服务,那就太好了。


你能告诉我你是怎么解决的吗?我也需要同样的帮助。我有一个用于 SNMP 流量的 ClusterIP,还有一个用于来自外部的 HTTP 流量的 Ingress 和 Service,但不知何故,Postman 报错“503 服务暂时不可用”。 - user1731045
可能发生这种情况的一个原因是Service和Ingress的规则不同,请参见https://dev59.com/u7zpa4cB1Zd3GeqPPat7#63355114获取详细信息。 - ccd
2个回答

5
不,clusterIP只能在集群内部访问。Ingress本质上只是一组第7层转发规则,它不处理将您的集群内部暴露给外部世界的第4层要求。至少需要1个NAT步骤。
但是,为了使Ingress正常工作,您需要至少涉及一个服务来将您的工作负载公开,例如nodePort或loadBalancer。您的Ingress控制器和集群基础架构将确定您需要使用哪种服务中的哪一个。
在Nginx Ingress的情况下,您需要一个单独的LoadBalancer服务,Ingress将使用它来将流量从集群外部桥接到集群内部。之后,您可以为每个工作负载使用clusterIP服务。
在您上面的示例中,只要nginx ingress控制器正确配置(带有负载均衡器),那么您使用的配置就应该没有问题。

2
简而言之:是的

现在来详细回答...

首先,让我们看看官方文档上说了什么:

Ingress将集群内服务的HTTP和HTTPS路由暴露给集群外部。
[...]
Ingress控制器负责满足Ingress请求,通常使用负载均衡器...

这里令人困惑的是“负载均衡器”这个术语。在上面的定义中,我们谈论的是经典和众所周知的Web负载均衡器。
这与kubernetes没有任何关系!

因此,回到定义,要使用Ingress并使其工作,我们需要一个名为IngressController的kubernetes资源。而这个资源碰巧是一个负载均衡器!就是这样。

然而,您必须记住,在外部世界中负载均衡器和type:LoadBalancer类型的kubernetes服务之间有区别

总之,(为了将外部世界的流量重定向到您的k8s集群IP服务)

  • 您需要一个负载均衡器来使您的kind:Ingress工作吗?是的,这就是kind:IngressController kubernetes资源。
  • 您需要一个kubernetes服务type:LoadBalancertype:NodePort来使您的kind:Ingress工作吗?绝对不需要!一个type:ClusterIP服务完全可以胜任!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接