簡體   English   中英

Kubernetes Pod with hostNetwork True 無法訪問同一集群中服務的外部 IP

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

問題

我有兩個 pod AB在 minikube 的集群中運行,它們都有外部 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 的本地解決方案),我需要預先簽署 URL 以獲取和放置對象。 Minio 的 pod 與我的身份驗證 pod 運行在同一個集群中,這將生成預簽名的 url。 預簽名的 url 將在集群外部使用。 因此,我無法使用集群 dns 名稱(如minio.svc.cluster.local對 url 進行簽名,因為無法從集群外部訪問此 URL,並且將主機替換為my-minio.com並保持簽名不起作用,因為我猜 minio 簽署了整個主機和路徑。 因此,我需要將我的身份驗證 pod 連接到my-minio.com面向公眾的my-minio.com而這似乎不起作用。

關於hostNetwork ,您似乎誤解了它。 將它設置為 true 意味着 Pod 將可以訪問它正在運行的主機。 在 minikube 的情況下,它是虛擬機,而不是運行實際容器的主機。

另外,我不確定您如何向外部世界公開您的服務,但我建議您為此嘗試Ingress

正如 Grigoriy 建議的那樣,我使用帶有nginx.ingress.kubernetes.io/upstream-vhost注釋的入口將所有請求轉發到帶有Host: service-b的集群來解決我的問題。 以前我有nginx.ingress.kubernetes.io/rewrite-target: /$1它從導致嚴重問題的請求中剝離了路徑,所以我刪除了它。 我如何讓它工作的細節在這里:

NGINX 控制器 Kubernetes:需要更改入口內的 Host 標頭

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM