如何将 Kind 中的 Pod 连接到本地数据库
回答问题
我正在尝试将在 Kind 中运行的 pod 与在 Docker 容器中运行的本地 Postgres 数据库连接。我尝试添加以下服务,但使用 DNS 名称postgres.dev.svc时 pod 仍然无法连接。
kind: Service
apiVersion: v1
metadata:
name: postgres
namespace: dev
spec:
type: ExternalName
externalName: 10.0.2.2
还有其他方法可以连接这两个组件吗?
Answers
首先这不是ExternalName服务类型的正确用法。尽管在externalName字段中输入 IP 地址是完全可行的,即资源将被创建并且您不会从 kubernetes API 服务器收到任何投诉。 ❗但此值被视为域名,由数字组成,而不是 IP 地址。您可以在官方 kubernetes 文档中阅读它:
注意: ExternalName 接受 IPv4 地址字符串,但作为由数字组成的 DNS 名称,而不是作为 IP 地址。类似于 IPv4 地址的 ExternalNames 不会由 CoreDNS 或 ingress-nginx 解析,因为 ExternalName 旨在指定规范的 DNS 名称。要对 IP 地址进行硬编码,请考虑使用无头服务。
所以你真正需要的是没有选择器的服务:
服务最常抽象出对 Kubernetes Pod 的访问,但它们也可以抽象出其他类型的后端。例如:
- 您希望在生产中拥有一个外部数据库集群,但在您的测试环境中您使用自己的数据库。
- 您希望将您的服务指向不同命名空间或另一个集群上的服务。
- 您正在将工作负载迁移到 Kubernetes。在评估该方法时,您只在 Kubernetes 中运行一部分后端。
在任何这些场景中,您都可以定义一个不带 Pod 选择器的服务。例如:
api版本:v1
种类:服务
元数据:
名称:我的服务
规格:
端口:
- 协议:TCP
端口:80
目标端口:9376
因为这个Service没有选择器,所以不会自动创建对应的Endpoints对象。您可以通过手动添加 Endpoints 对象,手动将服务映射到其运行的网络地址和端口:
api版本:v1
种类:端点
元数据:
名称:我的服务
子集:
- 地址:
- ip: 192.0.2.42
端口:
- 端口:9376
在您的特定情况下,您的Service定义可能如下所示:
apiVersion: v1
kind: Service
metadata:
name: postgres
spec:
ports:
- protocol: TCP
port: 5432
targetPort: 5432
对应的Endpoints对象可能如下所示:
apiVersion: v1
kind: Endpoints
metadata:
name: postgres
subsets:
- addresses:
- ip: 10.0.2.2
ports:
- port: 5432
当然,IP 地址10.0.2.2必须可以从您的 kubernetes 集群中访问。
更多推荐
所有评论(0)