【问题标题】:Access external database from Kubernetes从 Kubernetes 访问外部数据库
【发布时间】:2020-11-30 08:05:00
【问题描述】:

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

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

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。

谢谢。

【问题讨论】:

  • 您能否分享更多详细信息和您的配置 YAML 以用于复制目的?您的部署是否也有选择器app: app?那里可能有错字。你用的是什么K8s版本?您有 2 个独立的集群(1 个使用 kubernetes,1 个使用 PosgreSQL)?是否可以提供日志?
  • @PjoterS 嗨,是的,我更新了这个问题。
  • 您有什么理由想使用Service,而不是直接从您的应用程序/pod 中使用PostgreSQL 数据库服务器IP (206....) 和端口(25060)?此外,作为最佳实践,您可能需要考虑配置 SSL 以加密 kubernetes 集群和外部数据库服务器之间的流量 - 请参阅 postgresql.org/docs/12/ssl-tcp.html
  • @BogdanL 但是我觉得如果直接用IP也会有同样的问题。
  • @FranciscoGonzalez 您从哪里获得了正确的 IP 地址以添加到您的入站规则中?

标签: postgresql kubernetes digital-ocean


【解决方案1】:

这对我有用:

定义一个服务,但设置clusterIP: None,所以没有创建端点。

然后使用 SAME NAME 作为您的服务自己创建一个端点,并设置您的数据库的 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

【讨论】:

  • 你能发布你更新的配置吗?另外,当你运行“kubectl get services”时,一切运行顺利吗?
  • 是否可以在我们部署在kubernetes集群上的应用程序的.env文件中使用这个endpoint?像这样:DB_ADDRESS=backend-mobile-db-service
【解决方案2】:

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

类型:外部名称

还要确保服务名称和端点名称应该匹配。在您的 yaml 中有所不同。请检查

【讨论】:

    【解决方案3】:

    如果我理解正确,您的集群和应用程序位于 Digital Ocean 云上,而您的 PostgreSQL 在此集群之外。

    在您的Application Deployment application service 中您使用了services with selectors,因此您无需手动创建Endpoints

    在您的external database service 中,您使用了services without selectors,因此您必须手动创建Endpoint

    由于数据库是external service,使用clusterIP: None 是没有意义的,因为它会尝试匹配集群内的pod。我猜你在this docs 中阅读时添加了它。

    最后一件事是在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 和端口重映射的远程托管数据库

    以上场景的详细信息你可以在Kubernetes best practices: mapping external services找到

    根据您当前的配置,我假设您想使用scenario 1

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

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

    如果IP更改后仍有问题,请告诉我

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-01-12
        • 1970-01-01
        • 2014-04-05
        • 1970-01-01
        • 1970-01-01
        • 2020-01-09
        • 2021-05-16
        相关资源
        最近更新 更多