当前位置: 首页 > 知识库问答 >
问题:

位于另一命名空间的服务

翁和正
2023-03-14

我一直试图找到一种方法来定义一个命名空间中的服务,该服务链接到另一个命名空间中运行的Pod。我知道在namespacea中运行的Pod中的容器可以访问namespaceb中定义的servicex,方法是在集群DNS中将其引用为servicex.namespaceb.svc.cluster.local,但我不希望容器中的代码需要知道servicex的位置。也就是说,我希望代码只查找ServiceX,然后能够访问它。

Kubernetes文档表明这是可能的。它指出,定义不使用选择器的服务的原因之一是,您希望将服务指向另一个命名空间或另一个集群上的服务。

这告诉我,我应该:

  1. namespacea中定义servicex服务,不使用选择器(因为我要选择的POD不在namespacea中)。
  2. namespaceb中定义一个服务(我也称之为ServiceX),然后
  3. namespacea中定义一个endpoint对象,以指向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

这似乎是一种合乎逻辑的方法,显然targetref是用来做这个的。但是,这导致了一个错误,说明addresses数组中的IP字段是必需的。因此,我的下一个尝试是为namespaceB中的serviceX分配一个固定的ClusterIP地址,并将其放在IP字段中(注意,service_cluster_ip_range配置为192.168.0.0/16,并且192.168.0.0/16中的192.168.1.1被分配为namespaceB的ClusterIP;namespace中的

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

这是接受的,但是对namespacea中的servicex的访问没有转发到namespaceb中的Pod--它们超时了。查看iptables设置,它似乎必须执行两次NAT预路由才能完成。

我发现唯一有效的方法(但不是令人满意的解决方案)是在namespaceB中查找提供serviceX的Pod的实际IP地址,并将该地址放在namespaceA中的Endpoints对象中。当然,这并不令人满意,因为Pod IP地址可能会随着时间的推移而改变。这就是服务IP要解决的问题。

那么,是否有一种方法可以满足文档中的promise,即我可以将一个命名空间中的服务指向运行在不同命名空间中的服务?

一个评论者质疑你为什么要这么做--这里有一个用例,至少对我来说是有意义的:

假设您有一个多租户系统,它还包括一个可以在租户之间共享的公共数据访问功能。现在想象一下,这个数据访问函数有不同的类型,有共同的API,但有不同的性能特征。一些租户可以访问其中一个,其他租户可以访问另一个。

每个租户的pod都在自己的名称空间中运行,但是每个都需要访问这些公共数据访问服务中的一个,这些服务必须在另一个名称空间中(因为它是由多个租户访问的)。但是,如果租户的订阅更改以访问性能更高的服务,您不希望租户必须更改代码。

一个潜在的解决方案(我所能想到的最干净的解决方案,如果它有效的话)是在每个租户的数据访问服务名称空间中包含一个服务定义,每个定义都为适当的endpoint配置。该服务定义将被配置为指向每个租户有权使用的适当的数据访问服务。

共有1个答案

柳涵映
2023-03-14

我偶然发现了同样的问题,并找到了一个不错的解决方案,它不需要任何静态ip配置

您可以通过服务的DNS名称(正如您所提到的)访问服务:serviceName.namespace.svc.cluster.local

您可以使用该DNS名称通过本地服务在另一个命名空间中引用它:

kind: Service
apiVersion: v1
metadata:
  name: service-y
  namespace: namespace-a
spec:
  type: ExternalName
  externalName: service-y.namespace-b.svc.cluster.local
  ports:
  - port: 80
 类似资料:
  • 问题内容: AngularJS如何处理服务名称之间的冲突?例如,如果我声明了两个模块,每个模块包含一个名为“ foo”的服务。如果我想创建一个可重用的模块或要避免与其他第三方模块发生冲突,哪种是“​​命名空间”服务的好方法? 问题答案: 到目前为止,AngularJS不会处理服务的名称空间冲突, 因此,如果您使用相同的方式将两个不同的模块命名为服务,并且在应用程序中包含了两个模块,则只有一个服务可

  • 以上描述的作为基于装饰器的活动处理函数的替代,属于命名空间的活动处理函数可以被创造成一个类的方法。Flask_socketio.Namespace提供了一个基于类的方法来创造命名空间。 from flask_socketio import Namespace, emit class MyCustomNamespace(Namespace): def on_conect(): pas

  • 本文向大家介绍关于JavaScript命名空间的一些心得,包括了关于JavaScript命名空间的一些心得的使用技巧和注意事项,需要的朋友参考一下 最近重构东西,碰到命名空间的设定,搜了一些知识,请教了一些高手,把自己的心得写下来 相信大家都知道,window是顶级的,这里就不写window了,先忽略 1:关于顶级 可以看到,其实就是如果发现没有这个对象,就自动创建new Object();如果有

  • 我在默认命名空间中创建了一个serviceaccount(dm sa),并在clusterRole(绑定到PodSecurityPolicy)和clusterRoleBinding中使用了这个serviceaccount。接下来,在部署yaml(将在名称空间“dm”中运行)中,我在模板:spec下指定了serviceAccount:dm和serviceAccountName:default。这样,

  • 为什么using指令在包含在匿名命名空间中时表现得好像出现在全局范围?

  • 关于术语的一点说明: 请务必注意一点,TypeScript 1.5里术语名已经发生了变化。 “内部模块”现在称做“命名空间”。 “外部模块”现在则简称为“模块”,这是为了与ECMAScript 2015里的术语保持一致,(也就是说 module X { 相当于现在推荐的写法 namespace X {)。 这篇文章描述了如何在TypeScript里使用命名空间(之前叫做“内部模块”)来组织你的代码