具有 hostNetwork True 的 Kubernetes Pod 无法访问同一集群中服务的外部 IP

Kubernetes Pod with hostNetwork True cannot reach external IPs of services in the same cluster

问题

我在 minikube 的集群中有两个 pods AB 运行,它们都有外部 IP www.service-a.comwww.service-b.com .两个外部 IP 都可以从外部访问。

我需要 A 才能使用其外部 IP 而不是其集群 DNS 调用 B,也就是说 A 需要使用 www.service-b.com 而不是 b.svc.cluster.local(确实有效,但我不能使用它)。

我将 A 设置为使用 hostNetwork: truednsPolicy: ClusterFirstWithHostNet。如果我手动启动一个 NodeJS docker 容器,它确实可以连接并找到它。但是,A 仍然无法连接到 service-b.com。我使用 hostNetwork 错了吗?如何配置我的 pod 以这种方式连接到 b

A 的部署 YAML

...
spec:
  replicas: 1
  selector:
    matchLabels:
      app: a-app
  template:
    metadata:
      labels:
        app: a-app
    spec:
      hostNetwork: true
      dnsPolicy: ClusterFirstWithHostNet
      containers:
...

B 的服务 YAML

...
spec:
  externalTrafficPolicy: Cluster
  type: LoadBalancer
  ports:
  - port: ...
    targetPort: ...
    protocol: TCP
    name: http
...

背景:

我正在使用 Minio(一种类似于本地 S3 的解决方案),我需要预先签署 URLs 来获取和放置对象。 Minio 的 pods 与我的身份验证 pod 在同一集群中 运行,它将生成预签名的 urls。预先签名的 urls 将从集群外部使用。因此,我无法使用 minio.svc.cluster.local 之类的集群 dns 名称对 url 进行签名,因为无法从集群外部访问此 URL 并将主机替换为 my-minio.com 并保持签名不起作用,因为我猜 minio 签署了整个主机和路径。因此,我需要让我的身份验证 pod 连接到面向 my-minio.com 的 Minio 的 public 而这似乎不起作用。

关于hostNetwork,看来你误会了。将其设置为 true 意味着 Pod 将可以访问它所在的主机 运行。在 minikube 的情况下,它是 VM 而不是您的主机,实际容器是 运行.

此外,我不确定您如何向外部世界公开您的服务,但我建议您尝试 Ingress

正如 Grigoriy 所建议的,我使用带有 nginx.ingress.kubernetes.io/upstream-vhost 注释的入口将所有请求转发到带有 Host: service-b 的集群来解决我的问题。以前我有 nginx.ingress.kubernetes.io/rewrite-target: / 从导致严重问题的请求中删除了路径,所以我删除了它。我如何让它工作的细节在这里: