从Kubernetes访问外部数据库

tkclm6bt  于 2023-03-29  发布在  Kubernetes
关注(0)|答案(4)|浏览(210)

我有一个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

访问Internet的网络策略(对我来说是必需的):

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

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

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。

谢谢

8fsztsew

8fsztsew1#

以下是对我起作用的方法:
定义一个服务,但设置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
mccptt67

mccptt672#

为了更好的可见性,我将问题中提到的答案放在OP中:
我找到解决办法了,问题出在数据库的入站规则上,我必须添加Kubernetes的IP

icomxhvb

icomxhvb3#

如果我理解正确的话,你的集群在Digital Ocean云上有应用程序,而你的PostgreSQL在这个集群之外。
在您的Application Deployment〈〉application service中,您已经使用了带有选择器的服务,因此您不需要手动创建Endpoints
在您的external database service中,您使用了没有选择器的服务,因此您必须手动创建Endpoint
由于数据库是external service,使用clusterIP: None是没有意义的,因为它会尝试匹配集群内的pod。我猜你在阅读本文时添加了它。
最后一件事是,在Endpoint中,你设置了ip: 206...,它与应用服务LoadBalancer ip相同?

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,而不是你的应用程序Loadbalancer的IP.
现在,根据场景,您可以连接:

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

有关上述场景的详细信息,请参阅Kubernetes best practices: mapping external services
根据您当前的配置,我假设您希望使用scenario 1
如果这个databasecluster在云中的某个地方,你可以使用internal Database IP。如果不是,你应该提供托管这个数据库的机器的IP。
您也可以阅读Kubernetes Access External Services文章。
请让我知道,如果你仍然会有问题后,知识产权的变化

mwg9r5ms

mwg9r5ms4#

应更正服务定义。默认服务类型为clusterIP,该类型不适用于外部数据库。您需要按以下方式更新服务类型
类型:外部名称
也确保服务名称和端点名称应该匹配.它在你的yaml中是不同的.请检查

相关问题