从Kubernetes访问外部数据库



我有一个Kubernetes(v1.18.6(,在一个开发中有1个服务(负载均衡器(和2个pod:

apiVersion: v1
kind: Service
metadata:
name: app-service
spec:
selector:
app: app
ports:
- protocol: "TCP"
port: 6000
targetPort: 5000
type: LoadBalancer

访问互联网的网络策略(对我来说是必要的(:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: internet-access
spec:
podSelector:
matchLabels:
networking/allow-internet-access: "true"
policyTypes:
- Ingress
- Egress
ingress:
- {}

部署配置文件

apiVersion: apps/v1
kind: Deployment
metadata:
name: app-deployment
spec:
progressDeadlineSeconds: 120
selector:
matchLabels:
app: app
replicas: 2
template:
metadata:
labels:
app: app
spec:
imagePullSecrets:
- name: myregistrykey
containers:
- name: app
image: app
imagePullPolicy: Always
ports:
- containerPort: 5000

它工作正常。但现在,我想把这个图像连接到一个外部数据库(在另一个网络中,只能通过互联网访问(。对于这个命题,我使用这个服务:

apiVersion: v1
kind: Service
metadata:
name: postgresql
spec:
clusterIP: None
ports:
- port: 25060

---
apiVersion: v1
kind: Endpoints
metadata:
name: postgresql
subsets:
- addresses:
- ip: 206............
ports:
- port: 25060
name: postgresql

这是所有的服务:

NAME                TYPE           CLUSTER-IP       EXTERNAL-IP      PORT(S)          AGE
app-service         LoadBalancer   10.245.134.137   206...........   6000:31726/TCP   2d4h
kubernetes          ClusterIP      10.245.0.1       <none>           443/TCP          3d7h
postgresql          ClusterIP      None             <none>           25060/TCP        19h

但当我尝试连接时,我收到数据库的超时错误,比如无法连接到数据库。

图片中我有网络连接。

我找到了解决方案,问题是数据库的入站规则。我必须添加Kubernetes的IP

Thx。

以下是对我有效的方法:

定义一个服务,但设置clusterIP: None,因此不会创建endpooint。

然后自己创建一个与服务名称相同的端点,并设置数据库的IP和端口。

在您的示例中,端点中有一个类型:端点的名称是postgresql,而不是postgresSql。

我的例子:

---
service.yaml
kind: Service
apiVersion: v1
metadata:
name: backend-mobile-db-service
spec:
clusterIP: None
ports:
- port: 5984
---
kind: Endpoints
apiVersion: v1
metadata:
name: backend-mobile-db-service
subsets:
- addresses:
- ip: 192.168.1.50
ports:
- port: 5984
name: backend-mobile-db-service

为了更好的可见性,我将问题中提到的答案OP放在

我找到了解决方案,问题是数据库的入站规则。我必须添加Kubernetes 的IP

如果我理解正确的话,您的集群在Digital Ocean云上有应用程序,而您的PostgreSQL在这个集群之外。

在您的Application Deployment<gt;application service您已经使用了带有选择器的服务,因此不需要手动创建Endpoints

external database service中,您使用了没有选择器的服务,因此必须手动创建Endpoint

由于数据库是external service,所以使用clusterIP: None毫无意义,因为它将尝试匹配集群内的pod。我想你是在阅读这些文档时添加的。

最后一件事是,在Endpoint中,您设置了与应用程序服务LoadBalancerip相同的ip: 206...

NAME                TYPE           CLUSTER-IP       EXTERNAL-IP      PORT(S)          AGE
app-service         LoadBalancer   10.245.134.137   206...........   6000:31726/TCP   2d4h
subsets:
- addresses:
- ip: 206............

这只是信息的一部分,所以我猜。但是,在本部分中,您应该提供所需database的IP,而不是您的应用程序LoadbalancerIP。

现在,根据您可以连接的场景:

  • 具有IP地址的群集外部数据库
  • 具有URI的远程托管数据库
  • 具有URI和端口重新映射的远程托管数据库

有关上述场景的详细信息,您可以在Kubernetes最佳实践中找到:映射外部服务

根据您当前的配置,我认为您希望使用scenario 1

如果这个databasecluster在云中的某个位置,您可以使用internal Database IP。如果没有,您应该提供托管此数据库的计算机的IP。

您也可以阅读Kubernetes Access External Services的文章。

请让我知道,如果你在IP更改后仍然有问题

应该更正服务定义。默认服务类型是clusterIP,它不适用于外部数据库。您需要更新下面给出的服务类型

类型:ExternalName

还要确保服务名称和端点名称应该匹配。你的yaml不一样。请检查

最新更新