假设我在 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 地址。