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

时间:2020-11-11 19:30:06

标签: docker kubernetes minio

问题

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

我需要A才能使用其外部IP而不是其群集DNS来呼叫B,即A需要使用www.service-b.com而不是{{1 }}(确实可以,但是我不能使用)。

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

A的部署YAML

b

B的服务YAML

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

背景:

我正在使用Minio(类似于S3的本地解决方案),并且需要对URL进行预签名以获取和放置对象。 Minio的Pod与我的身份验证Pod在同一群集中运行,这会生成预签名的url。预签名的url将在集群外部使用。因此,我无法使用... spec: externalTrafficPolicy: Cluster type: LoadBalancer ports: - port: ... targetPort: ... protocol: TCP name: http ... 之类的群集dns名称对该URL进行签名,因为无法从群集外部访问此URL,而用minio.svc.cluster.local替换主机,并且保持签名不起作用是因为我猜minio对整个主机和路径进行签名。因此,我需要将身份验证Pod连接到Minio面向公众的my-minio.com上,但这似乎无效。

2 个答案:

答案 0 :(得分:1)

关于hostNetwork,似乎您误解了。将其设置为true意味着Pod将有权访问运行它的主机。如果使用minikube,则是VM,而不是运行实际容器的主机。

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

答案 1 :(得分:0)

正如Grigoriy所建议的,我使用带有nginx.ingress.kubernetes.io/upstream-vhost批注的入口将所有请求转发到带有Host: service-b的集群中,以解决我的问题。以前,我有nginx.ingress.kubernetes.io/rewrite-target: /$1可以从导致严重问题的请求中剥离路径,因此我将其删除。我的工作方式的详细信息在这里:

NGINX controller Kubernetes: need to change Host header within ingress