具有 hostNetwork True 的 Kubernetes Pod 无法访问同一集群中服务的外部 IP
Kubernetes Pod with hostNetwork True cannot reach external IPs of services in the same cluster
问题
我在 minikube 的集群中有两个 pods A
和 B
运行,它们都有外部 IP www.service-a.com
和 www.service-b.com
.两个外部 IP 都可以从外部访问。
我需要 A
才能使用其外部 IP 而不是其集群 DNS 调用 B
,也就是说 A
需要使用 www.service-b.com
而不是 b.svc.cluster.local
(确实有效,但我不能使用它)。
我将 A
设置为使用 hostNetwork: true
和 dnsPolicy: 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: /
从导致严重问题的请求中删除了路径,所以我删除了它。我如何让它工作的细节在这里:
问题
我在 minikube 的集群中有两个 pods A
和 B
运行,它们都有外部 IP www.service-a.com
和 www.service-b.com
.两个外部 IP 都可以从外部访问。
我需要 A
才能使用其外部 IP 而不是其集群 DNS 调用 B
,也就是说 A
需要使用 www.service-b.com
而不是 b.svc.cluster.local
(确实有效,但我不能使用它)。
我将 A
设置为使用 hostNetwork: true
和 dnsPolicy: 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: /
从导致严重问题的请求中删除了路径,所以我删除了它。我如何让它工作的细节在这里: