是否可以从另一个命名空间向服务提供入口点?



我想做的是在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: {}

我知道我可以在每个命名空间中实现该服务,但我想知道是否可以拥有单个服务。如果我尝试在入口的backend->serviceName处理程序中键入服务的externalName,则会收到错误消息,指出服务的名称只能包含数字,字母和"-"。

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

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

如果你看一下 Nginx 规则(nginx.conf入口控制器 pod(,你会看到nginx.conf中的每个location块都有可变的set $namespace "****";这意味着入口已被 NS 隔离

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

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

+--Namespace A-------------------------------+
|                                            |
|  +-------+   +-------+   +--------------+  |
|  |Ingress+--->Service+--->VirtualService|  |
|  +-------+   +-------+   +------+-------+  |
|                                 |          |
+--------------------------------------------+
|
+---------------+
|
|      +--Namespace B---------+
|      |                      |
|      |  +-------+    +---+  |
+--------->Service+---->Pod|  |
|  +-------+    +---+  |
|                      |
+----------------------+

使用 Istio,您可以将入口放在一个命名空间中,一个没有选择器的服务(因为这里没有 pod(和一个将 service.namespaceA 上的流量路由到 service.namespaceB 的虚拟服务。

我正在使用它来实现蓝绿部署。想象一下与上述相同的原理,但有 3 个命名空间:

  • 命名空间-A(包含入口、服务和虚拟服务(
  • 命名空间-B-蓝色(带有蓝色服务和 Pod(
  • 命名空间-B-绿色(具有绿色服务和 Pod(

蓝色和绿色版本之间的切换由命名空间 A 中的虚拟服务管理。优点是您可以使用 istio 的路由功能测试绿色版本(冒烟测试(,然后再将其发布给所有人。

只是要在这里发布这个,以便将来帮助其他人。这适用于 AWS,但可能不适用于其他云基础设施。如果您希望单个 ALB 连接到自身不同命名空间中的服务,请创建两个 k8 入口,但将它们组合在一起。

命名空间 A

apiVersion: v1
kind: Service
metadata:
name: service-1
namespace: A
spec:
type: NodePort
ports:
- name: http
port: 8080
protocol: TCP
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
"alb.ingress.kubernetes.io/group.name": "group"
"alb.ingress.kubernetes.io/group.order": "1"
namespace: A
spec:
rules:
- host: latest.example.com
http:
paths:
- backend:
serviceName: service-1
servicePort: 8080
path: /

命名空间 B

apiVersion: v1
kind: Service
metadata:
name: service-2
namespace: B
spec:
type: NodePort
ports:
- name: http
port: 8080
protocol: TCP
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
"alb.ingress.kubernetes.io/group.name": "group"
"alb.ingress.kubernetes.io/group.order": "2"
namespace: B
spec:
rules:
- host: other.example.com
http:
paths:
- backend:
serviceName: service-2
servicePort: 8080
path: /

为了简洁起见,我删除了许多注释,但这将创建一个 ALB,其中包含两个入口资源,使同一域能够指向跨不同命名空间的不同服务。

相关内容

  • 没有找到相关文章

最新更新