我想做的是在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,其中包含两个入口资源,使同一域能够指向跨不同命名空间的不同服务。