我有两个Pod A
和B
在minikube上的集群中运行,都具有外部IP www.service-a.com
和www.service-b.com
。可以从外部访问两个外部IP。
我需要A
才能使用其外部IP而不是其群集DNS来呼叫B
,即A
需要使用www.service-b.com
而不是{{1 }}(确实可以,但是我不能使用)。
我将b.svc.cluster.local
设置为使用A
和hostNetwork: 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
上,但这似乎无效。
答案 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