[英]Kubernetes Pod with hostNetwork True cannot reach external IPs of services in the same cluster
我有兩個 pod A
和B
在 minikube 的集群中運行,它們都有外部 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 的本地解決方案),我需要預先簽署 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
它從導致嚴重問題的請求中剝離了路徑,所以我刪除了它。 我如何讓它工作的細節在這里:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.