当客户端 pod 的 IP 地址未知时,如何在 kubernetes 部署中配置 pg_hba.conf?

当客户端 pod 的 IP 地址未知时,如何在 kubernetes 部署中配置 pg_hba.conf?

假设我在 pod 中部署了两个后端 be1、be2,它们在使用 pod 中的 postgres 服务器,并且我想使用它们pg_hba.conf来限制访问以获得更好的安全性,例如:

hostssl db1  db1user    be1-headless.default.svc.cluster.local  md5
hostssl db2  db2user    be2-headless.default.svc.cluster.local  md5

我为后端创建了无头服务以及 clusterIP 服务,因为无头服务具有 pod 的 IP - 连接将从该 IP 发出。Postgres 反向解析连接的 IP 地址,并与 pg_hba.conf 中的条目进行比较。不幸的是,虽然 be1-headless.default.svc.cluster.local 解析为(例如)10.0.0.3,即 be1 运行的正确 IP 地址,但 10.0.0.3 反向解析为 10-0-0-1.be1-headless.default.svc.cluster.local,这与 pg_hba.conf 不匹配。

有没有办法将 pod 的 ip 地址反向解析为可以提前知道的 DNS 名称?我们正在使用的另一项服务有类似的允许连接的方式(通过 ip 或主机名过滤器)。


我制作了一组简单的三个资源来演示这一点,sample-pod.yaml:

    apiVersion: v1
    kind: Pod
    metadata: { name: echo, labels: { unique: "xxxx" } }
    spec:
      containers:
        - name: echo
          image: alpine:3.16
          command: ["sleep", "100000"]
    ---
    apiVersion: v1
    kind: Service
    metadata: { name: echo-service }
    spec:
      selector: { unique: "xxxx" }
      ports: [{ protocol: TCP, port: 8080 }]
    ---
    apiVersion: v1
    kind: Service
    metadata: { name: echo-headless }
    spec:
      clusterIP: None
      selector: { unique: "xxxx" }
      ports: [{ protocol: TCP, port: 8080 }]
    $ kubectl create ns myns
    namespace/myns created

    $ kubectl apply -n myns -f sample-pod.yaml
    pod/echo created
    service/echo-service created
    service/echo-headless created
    $ kubectl exec -it -n myns pods/echo -- ash
    / # nslookup echo-headless.myns.svc.cluster.local | tail -3
    Name:   echo-headless.myns.svc.cluster.local
    Address: 10.1.1.240

    / # nslookup 10.1.1.240 | tail -3
    240.1.1.10.in-addr.arpa name = 10-1-1-240.echo-headless.myns.svc.cluster.local
    240.1.1.10.in-addr.arpa name = 10-1-1-240.echo-service.myns.svc.cluster.local

    / # hostname -i
    10.1.1.240

“echo-service” ClusterIP 服务的查找和反向解析可以工作,但是 IP 地址是用于连接到“echo-service”的虚拟端点,而不是连接的来源地。

我目前正在将预定义的 pg_hba.conf 安装为 ConfigMap。这是使用 Kubernetes 1.25,在此示例中使用 Mac 上的 Docker Desktop。我认为无头服务可以工作,因为文档说它直接绑定到 pod 的 IP 地址。

相关内容