使用 pod 的名称而不是主机和端口调用 pods

Calling the pods using pod's name instead of host and port

我是 运行 本地 minikube 集群(使用 helm 图表)内的一组微服务,它们相互通信。每个服务的主机和端口都通过 value-dev.yaml 传递给其他服务,并且通信正常。现在我需要更进一步,将连接调用从 http://helm-chart-name:PORT/ 更改为 http://helm-chart-name/http://service-pod-name/。我试图这样做,但没有成功。有办法实现吗?

如果需要用pod访问,DNS解析如下: pod-ip-address.deployment-name.my-namespace.svc.cluster-domain.example。鉴于 pods 的短暂性质和 运行 多个同种 pod 的可能性,我建议使用服务抽象来进行集群内通信,就像您所需要的那样。服务解析为这种格式的 DNS my-svc.my-namespace.svc.cluster-domain.example。您还可以拥有无​​头服务并解析为具有特定(主机)名称的 Pod。参考DNS Reolution details here

在您的服务中(特别是)将 port: 数字设置为 80。这是 HTTP 的默认 TCP 端口号,因此如果没有 ...:12345,将使用该端口号URL 中的端口号。 targetPort: 需要匹配 pod 监听的任何端口;它不需要匹配 port:.

apiVersion: v1
kind: Service
metadata:
  name: {{ include "chart.fullname" . }}
spec:
  selector:
    {{- include "chart.selectorLabels" . | nindent 4 }}
  ports:
    - name: http
      protocol: TCP
      port: 80          # default HTTP port
      targetPort: 3000  # port number the matching Pod uses

现在其他服务可以调用 http://helm-chart-name/ 而无需显式提供端口号。

(您几乎总是需要使用服务来接受到 pod 的连接;您通常不会直接与 pod 通信,除了某些特殊情况外,这样做很棘手。)