Kubernetes 是否可以从另一个名称空间中有一个到服务的入口点?

Kubernetes 是否可以从另一个名称空间中有一个到服务的入口点?,kubernetes,kubernetes-ingress,kubernetes-service,Kubernetes,Kubernetes Ingress,Kubernetes Service,我想做的是在default名称空间中有一个服务,在我的其他名称空间中有一个入口,它指向该服务。我尝试实现如下所示的服务和入口,但没有成功 kind: Service apiVersion: v1 metadata: name: serviceX namespace: default spec: type: ExternalName externalName: serviceX.default.svc.cluster.local ports: - port: 123 kind:

我想做的是在
default
名称空间中有一个服务,在我的其他名称空间中有一个入口,它指向该服务。我尝试实现如下所示的服务和入口,但没有成功

kind: Service
apiVersion: v1
metadata:
  name: serviceX
  namespace: default
spec:
  type: ExternalName
  externalName: serviceX.default.svc.cluster.local
ports:
- port: 123


kind: Ingress
apiVersion: extensions/v1beta1
metadata:
  name: web-ingress-test-vpndev
  namespace: my-namespace
spec:
  tls:
  - hosts:
    - abc.my-namespace.domain.com
    secretName: tls-secret-my-namespace
  rules:
  - http:
      paths:
      - path: "/"
        backend:
          serviceName: serviceX
          servicePort: 123
status:
  loadBalancer:
    ingress: {}

我知道我可以在每个名称空间中实现该服务,但我想知道是否可以有一个单一的服务。如果我尝试在入口的
后端->服务名
处理程序中键入服务的
外部名称
,我会收到错误消息,说服务名只能包含数字、字母和“-”。

我认为这是不可能的,也不认为这是一个好主意。入口不是群集级别的资源。每个名称空间都应该有自己的实例。

我不得不说这不是一个好方法。因为不同NS中的所有入口将转换为Nginx规则,并在入口控制器pod中生效

如果您查看一下Nginx规则(
Nginx.conf
在ingress控制器pod中),您将看到
Nginx.conf
中的
位置的每个块都有变量
set$namespace“***”表示入口已被NS隔离


另外,如果您仍然想要实现您的想法,可能需要修改入口控制器。

我使用Istio实现了这一点。这不是我们使用它的主要原因,但是流量管理功能允许这种事情

+--Namespace A-------------------------------+
|                                            |
|  +-------+   +-------+   +--------------+  |
|  |Ingress+--->Service+--->VirtualService|  |
|  +-------+   +-------+   +------+-------+  |
|                                 |          |
+--------------------------------------------+
                                  |
                  +---------------+
                  |
                  |      +--Namespace B---------+
                  |      |                      |
                  |      |  +-------+    +---+  |
                  +--------->Service+---->Pod|  |
                         |  +-------+    +---+  |
                         |                      |
                         +----------------------+
使用Istio,您可以在一个名称空间、一个没有选择器的服务(因为这里没有pod)和一个将service.namespaceA上的流量路由到service.namespaceB的虚拟服务中进行入口

我用它来实现蓝绿部署。设想与上面相同的原理,但有3个名称空间:

  • 名称空间-A(具有入口、服务和虚拟服务)
  • 命名空间-B-blue(带有蓝色服务和POD)
  • Namespace-B-green(带有绿色服务和POD)

蓝色和绿色版本之间的切换由命名空间A中的virtualService管理。优点是,您可以在向所有人发布之前使用istio的路由功能测试绿色版本(冒烟测试)。

在入口清单中提供
serviceName
时,您可以尝试提供FQDN,如果我尝试像这样配置serviceName,那将是
serviceX.default.svc.cluster.local
@viveksinghggits
serviceName:serviceX.default.svc.cluster.local
,我会得到一个错误。