【问题标题】:k8s - IP and DNS for postgres with servicek8s - 带有服务的 postgres 的 IP 和 DNS
【发布时间】:2019-03-06 00:52:40
【问题描述】:

我创建了有状态的服务,该服务由带有 k8s 的 postgres 部署支持。

设置为 3 个公共子网|AZ 和 3 个私有子网|AZ。 postgres 部署已到位,可以使用clusterIP: none 创建 1 个副本和服务

但是现在每次我删除服务并再次创建 IP 时,都会发生变化,我正在阅读有关 DNS 解析的内容。我想从 java 客户端访问数据库以在 n/w 上部署另一个 pod;在这里我无法获得静态 IP。

我可以使用clusterIP: #some_IP_from_one_of_the_subnet_range# 创建服务吗?如果服务宕机而 k8s 重生,会发生什么?它会在同一个 AZ 和子网中启动吗?如果 AZ 宕机了怎么办?

【问题讨论】:

  • 只要你的服务改变了相关的端点IP地址,总是可以通过DNS服务A记录来访问服务的,你可能有兴趣详细了解here
  • 嗨 mk_sta。谢谢你的链接。我可以通过 dns 名称访问该服务,但是当重新启动 pod 时,dns 会解析为新 ip 对吗?
  • 我担心 dns 分辨率和 dns ttl。一些像 java 客户端这样的客户端不尊重 dns ttl。

标签: kubernetes amazon-eks


【解决方案1】:

我已经复制了您报告的问题。我已经创建了一个 postgres 集群,并且还为该集群创建了一个 K8S 服务。

集群看起来像

root@k8-master:~# kubectl get pods
NAME                        READY   STATUS    RESTARTS   AGE
kibana                      1/1     Running   0          9s
postgres-59bcb7c9d4-lvg8v   1/1     Running   0          56m
postgres-59bcb7c9d4-rfppm   1/1     Running   0          56m
postgres-59bcb7c9d4-s9zc4   1/1     Running   0          56m

创建集群和服务后

该服务提供了一个服务名称,该名称还可以在 k8s DNS 解析的帮助下转换为 IP 地址。

所以我们不需要为 postgres 集群使用静态 IP 地址,因为 postgres k8s 服务将帮助您连接到集群容器。 为了证明我使用服务名而不是IP地址发送了一个curl请求。

root@k8-master:~# kubectl exec -it kibana /bin/bash
bash-4.2$ curl http://postgres:5432
curl: (52) Empty reply from server
bash-4.2$ exit

当您为 postgres 创建集群时,请确保端点连接到您的集群容器之一。它应该是这样的,

root@k8-master:~# kubectl describe services postgres
Name:                     postgres
Namespace:                default
Labels:                   app=postgres
Annotations:              kubectl.kubernetes.io/last-applied-configuration:
                            {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"app":"postgres"},"name":"postgres","namespace":"default"},"spe...
Selector:                 app=postgres
Type:                     NodePort
IP:                       10.97.201.134
Port:                     <unset>  5432/TCP
TargetPort:               5432/TCP
NodePort:                 <unset>  30362/TCP
Endpoints:                10.244.1.12:5432,10.244.1.13:5432,10.244.2.242:5432
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

在上面的示例中,端点被分配给 10.244.1.12 和其他。如果该字段为空,则访问 postgres 服务将不会产生任何结果。

另一种说法是,服务只是将请求重定向到集群。如果集群无法识别服务,那么来自 Java 的访问将无法正常工作。

希望这会有所帮助。

【讨论】:

  • 嗨,keerthi,您是如何启动 Postgres 集群的?就我而言,我有一个用于 Postgres 的 pod。
  • 嗨,Pat,我们已经将 postgres 容器复制到 1 个以上。我想您要问的是 postgres 集群服务。您可以在 k8s 文档中找到创建服务的示例。如果您需要具体信息,请告诉我。
猜你喜欢
  • 2018-02-24
  • 1970-01-01
  • 2011-05-25
  • 2021-10-30
  • 2016-09-11
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多