为什么ingress servicePort设置service的"port" 和 "targetPort"都可以?

啊啊 发表于: 2022-08-04   最后更新时间: 2022-08-04 20:29:30   1,444 游览

今天我遇到了一个关于servicePort的误解。

我以为服务可以与ingress链接,只指定servicePort: 80,但是servicePort: 80servicePort: 8080 也都可以。

谁能帮助我理解为什么服务同时暴露porttargetPort,而不是只有port

Service (app)

spec:
  type: ClusterIP
  ports:
    - port: 80
      targetPort: 8080

Ingress (ingress-nginx)

spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /
        backend:
          serviceName: app
          servicePort: 8080
发表于 2022-08-04
添加评论

集群中的每个 Pod 都有一个 endpoint,即 Pod 的 IPtargetPort

service是将流量发送给endpoint。

可以通过以下命令查看:

kubectl get endpoints

ingress 将 service 的 endpoint 配置给内置的 nginx

好处:使用 Endpoints API 来绕过 kube-proxy,如会话亲和性和自定义负载平衡算法。 消除了一些不必要的开销,例如 iptables DNAT 的 conntrack 条目。

最终,porttargetPort 都会转换成容器端口,也就是targetPort,所以都可以。

你的答案

查看ingress相关的其他问题或提一个您自己的问题