2

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

操作系统:Ubuntu v16.04 Docker 18.09.7 Kubernetes v1.15.4 Calico v3.8.2 Pod 基础镜像:openjdk:8-jre-alpine

我已尝试按照此示例创建服务和端点

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。

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

4

2 回答 2

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
并且这个IP范围也必须在calico.yaml文件中更改,然后再应用Calico插件:

# 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 集群。

于 2019-10-01T05:33:07.783 回答
0

我想您可以CALICO_IPV4POOL_CIDR通过构建器工具在不重新生成 K8s 集群的情况下进行替换kubeadm,也许它在某些情况下会很有用。

删除当前 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 地址。

于 2019-10-02T08:25:02.417 回答