访问k8s集群中的内部服务,并通过入口将其暴露在外部



我配置了两个服务,都是NodePort

服务1

kind: Service
apiVersion: v1
metadata:
name: bitcoinrpc-dev-service
namespace: dev
spec:
selector:
app: bitcoin-node
ports:
- name: bitcoin-mainnet
protocol: TCP
port: 80
targetPort: 8332
- name: bitcoin-testnet
protocol: TCP
port: 8080
targetPort: 18332  
type: NodePort

服务2

kind: Service
apiVersion: v1
metadata:
name: counterpartyrpc-dev-service
namespace: dev
spec:
selector:
app: counterparty-node
ports:
- name: mainnet
protocol: TCP
port: 80
targetPort: 4000
- name: testnet
protocol: TCP
port: 8080
targetPort: 14000  
type: NodePort

我可以通过入口在集群外访问这两个服务。但是,当我尝试从service2(counterparty)连接到service1(bitcoin时,它总是失去连接。我将该服务称为bitcoinrpc-dev-service.dev.svc.cluster.local:80

但是,如果我将此服务称为ingress中配置的主机名,则连接会更加稳定。例如,当我用bitcoin.mydomain.com:80引用service1

由于这意味着当需要相互通信的两个服务都在同一个集群中时,将流量路由到集群之外,因此这似乎有点低效。

我尝试将servicetype更改为clusterIP,但是无法通过ingress访问它们。

什么应该是正确的配置?

这背后的原因是只有带有kube-dns插件的k8s集群才能将域名bitcoinrpc-dev-service.dev.svc.cluster.local:80转换为相应的IP地址。

看看这个伟大的答案,它显示了围绕这个问题的解决方案:

如何使用服务名称访问kubernetes集群中的服务。

最新更新