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
@viveksinghggitsserviceName:serviceX.default.svc.cluster.local
,我会得到一个错误。