回答问题

我正在尝试将在 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 集群中访问。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐