我创建了有状态服务,该服务由使用k8s的postgres部署支持。
设置为3个公共子网| AZ和3个私有子网| AZ。已进行postgres部署以使用clusterIP: none
但是现在每次我删除服务并再次创建时,IP都在变化,我正在阅读有关DNS解析的信息。我想从Java客户端访问数据库,以在n / w上部署另一个pod;在这里,我无法获得静态IP。
我可以使用clusterIP: #some_IP_from_one_of_the_subnet_range#
创建服务吗?如果服务中断并重新生成k8s会发生什么?它将在相同的可用区和子网中启动吗?如果AZ下降怎么办?
答案 0 :(得分: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访问。
希望这会有所帮助。