小编Dav*_*ley的帖子

kubernetes:服务位于另一个名称空间中

我一直在尝试找到一种方法来在一个命名空间中定义一个服务,该命名空间链接到另一个命名空间中运行的Pod.我知道在"namespaceA"中运行的Pod中的容器可以通过在集群DNS中将其引用为"serviceX.namespaceB.svc.cluster.local"来访问"namespaceB"中定义的"serviceX",但我宁愿没有代码容器内部需要知道"serviceX"的位置.也就是说,我希望代码只是查找"serviceX"然后才能访问它.

Kubernetes文档表明这是可能的.它表示您在没有选择器的情况下定义服务的原因之一是" 您希望将服务指向另一个名称空间或另一个集群中的服务".

这告诉我,我应该:

  1. 在"namespaceA"中定义"serviceX"服务,没有选择器(因为我想要选择的POD不在"namespaceA"中).
  2. 在"namespaceB"中定义一个服务(我也称之为"serviceX"),然后
  3. 在"namespaceA"中定义一个Endpoints对象,指向"namespaceB"中的"serviceX".

这是我无法完成的第三步.

首先,我尝试以这种方式定义Endpoints对象:

kind: Endpoints
apiVersion: v1
metadata:
  name: serviceX
  namespace: namespaceA
subsets:
  - addresses:
      - targetRef:
          kind: Service
          namespace: namespaceB
          name: serviceX
          apiVersion: v1
    ports:
      - name: http
        port: 3000
Run Code Online (Sandbox Code Playgroud)

这似乎是合乎逻辑的方法,"显然"是"targetRef"的用途.但是,这导致了一个错误,即"地址"数组中的"ip"字段是强制性的.因此,我的下一个尝试是将"固定的ClusterIP地址"分配给"namespaceB"中的"serviceX",并将其放在IP字段中(请注意,service_cluster_ip_range配置为192.168.0.0/16,并且192.168.1.1被指定为ClusterIP用于"namespaceB"中的"serviceX";"namespaceA"中的"serviceX"在192.168.0.0/16子网上自动分配了不同的ClusterIP:

kind: Endpoints
apiVersion: v1
metadata:
  name: serviceX
  namespace: namespaceA
subsets:
  - addresses:
        - ip: 192.168.1.1
          targetRef:
            kind: Service
            namespace: namespaceB
            name: serviceX
            apiVersion: v1
    ports:
      - name: http
        port: 3000
Run Code Online (Sandbox Code Playgroud)

这已被接受,但是对"namespaceA"中的"serviceX"的访问没有被转发到"namespaceB"中的Pod - 它们超时了.看看iptables设置,看起来它必须做两次NAT预路由才能完成.

我找到的唯一有用 - 但不是一个令人满意的解决方案 - 是查找在"namespaceB"中提供"serviceX"的Pod的实际IP地址,并将该地址放在"namespaceA"中的Endpoints对象中.当然,这并不令人满意,因为Pod IP地址可能会随着时间而改变.这就是服务IP需要解决的问题. …

kubernetes

75
推荐指数
3
解决办法
5万
查看次数

标签 统计

kubernetes ×1