【问题标题】:How can a Kubernetes pod connect to database which is running in the same local network (outside the cluster) as the host?Kubernetes pod 如何连接到与主机在同一本地网络(集群外)中运行的数据库?
【发布时间】:2019-09-30 03:28:27
【问题描述】:

我有一个 Kubernetes 集群 (K8s) 在物理服务器 A(内网 IP 192.168.200.10)上运行,一个 PostgreSQL 数据库在另一台物理服务器 B(内网 IP 192.168.200.20)上运行。我在 K8s 中运行的 Java 应用容器(pod)如何能够连接到服务器 B 中的 PostgreSQL 数据库?

操作系统:Ubuntu v16.04 码头工人 18.09.7 Kubernetes v1.15.4 印花布 v3.8.2 Pod 基础镜像:openjdk:8-jre-alpine

我已尝试关注this example 创建服务和端点

kind: Service
apiVersion: v1
metadata:
 name: external-postgres
spec:
 ports:
 - port: 5432
   targetPort: 5432
---
kind: Endpoints
apiVersion: v1
metadata:
 name: external-postgres
subsets:
 - addresses:
     - ip: 192.168.200.20
   ports:
     - port: 5432

我的 JDBC 连接字符串为: jdbc:postgresql://external-postgres/MY_APPDB ,但它不起作用。 pod 无法使用所述内部 IP 或 ping external-postgres 服务名称 ping 服务器 B 或 telnet 数据库。我不希望使用“hostNetwork: true”或通过公共 IP 连接服务器 B。

非常感谢任何建议。谢谢。

【问题讨论】:

    标签: postgresql docker networking kubernetes calico


    【解决方案1】:

    我刚刚发现问题是由于K8s网络与服务器本地网络(192.168.200.x)发生冲突 子网。

    K8s集群初始化期间

    kubadmin init --pod-network-cidr=192.168.0.0/16

    CIDR 192.168.0.0/16 IP 范围必须更改为其他内容,例如。 10.123.0.0/16
    并且在应用 Calico 插件之前,还必须在 calico.yaml 文件中更改此 IP 范围:

    # The default IPv4 pool to create on startup if none exists. Pod IPs will be
    # chosen from this range. Changing this value after installation will have
    # no effect. This should fall within `--cluster-cidr`.
      - name: CALICO_IPV4POOL_CIDR
        value: "10.123.0.0/16"
    

    现在可以在重置后 ping 和 telnet 服务器 B 并使用不同的 CIDR 重新初始化 K8s 集群。

    【讨论】:

      【解决方案2】:

      我想您可以通过kubeadm builder 工具替换CALICO_IPV4POOL_CIDR 而无需重新生成K8s 集群,也许它在某些情况下会很有用。

      删除当前 Calico CNI 插件安装,例如:

      $ kubectl delete -f https://docs.projectcalico.org/v3.8/manifests/calico.yaml

      安装Calico CNI 插件,为CALICO_IPV4POOL_CIDR 参数提供所需的值:

      $ curl -k https://docs.projectcalico.org/v3.8/manifests/calico.yaml --output some_file.yaml && sed -i "s~$old_ip~$new_ip~" some_file.yaml && kubectl apply -f some_file.yaml

      重新旋转CoreDNS pod:

      $ kubectl delete pod --selector=k8s-app=kube-dns -n kube-system

      等到 CoreDNS pod 从新的网络 CIDR 池中获取 IP 地址。

      【讨论】:

        猜你喜欢
        • 2022-01-11
        • 2020-06-16
        • 2020-03-16
        • 1970-01-01
        • 2017-12-28
        • 1970-01-01
        • 2017-05-02
        • 2018-09-09
        • 2020-10-15
        相关资源
        最近更新 更多