环境:我有一个kubernetes集群,其中包含“dev”,“sit”和“prod”的命名空间。在每个命名空间,我有类型的多个服务:负载平衡器指定一dockerised应用程序(我有多个应用程序),所以我可以通过只使用我想任何一个命名空间服务的暴露IP地址来访问其中的每一个具体部署。示例服务看起来很简单:
apiVersion: v1
kind: Service
metadata:
name: application1
spec:
ports:
- port: 80
targetPort: 3000
protocol: TCP
name: http
type: LoadBalancer
selector:
app: application1
问题:我现在希望能够支持所有应用程序的多个版本(ip:/ v1 / ,ip:/ v2 / 等)以允许用户在准备就绪时迁移到新版本,并且我一直在尝试在guide之后实现基于路径的路由。我已经设法重构我的架构,以便我有一个ReplicationControllers和一个入口,它查看路由规则以路由到正确的服务。
如果我只有一个公开的服务和一个命名空间,这似乎有效,因为我只有生产环境的DNS主机名,并且想要在其他环境中使用服务的单个IP地址,我无法想象如何为没有主机名的服务指定入口规则。
我可以对各种环境负载均衡器,并使用基于路径路由路由到每个不同的服务,为开发和坐这并不理想,因为访问任何服务,我们不得不现在用这样的IP /应用1和ip / application2而不是直接使用每个应用程序的服务ip地址。但我最大的问题是,当我按照指南并在我的SIT命名空间中创建了入口,replicationController和服务时,它开始影响我的其他两个环境中的loadbalancer服务(据我所知,kubernetes有时会尝试使用nginx控制器我的DEV服务上的SIT环境因此会失败,有时它会使用GCE默认配置并且可以工作)。
我尝试添加arg“ - --watch-namespace = sit”来限制入口控制器的范围仅影响坐,但它似乎不起作用。
答案 0 :(得分:2)
我现在希望能够支持所有应用程序的多个版本(ip:/ v1 /,ip:/ v2 /等)
这正是Ingress可以做的,但问题是你想使用IP地址进行路由,但Ingress正在使用DNS名称。
我认为实现此目的的最佳方法是使用将处理请求的Ingress。在GCE上Ingress使用HTTP(S)负载均衡器。是的,您需要一个DNS名称,但它可以帮助您创建所需的路由 另外,我强烈建议对连接使用TLS加密 您可以查看LetsEncrypt以获取免费的SSL证书。
所以,解决方案应该如下:
1。使用“ClusterIP”类型而不是“LoadBalancer”部署服务。您可以为应用程序提供多个Service对象,以便与当前配置并行执行 2.选择任何命名空间(甚至是特殊命名空间),例如 - “ingress-ns”。我们需要在那里创建Service对象,这些对象将指向其他命名空间中的服务。以下是服务示例(让新DNS名称为“my.shiny.new.domain”):
kind: Service
apiVersion: v1
metadata:
name: service-v1
namespace: ingress-ns
spec:
type: ExternalName
externalName: <service>.<namespace>.svc.cluster.local # here is a service name and namespace of your service with version v1.
ports:
- port: 80
3。现在,我们有一个带有多个服务的命名空间,这些服务指向不同命名空间中应用程序的不同版本。现在,我们可以创建一个Ingress对象,它将在GCE上使用基于路径的路由创建HTTP(S)负载均衡器:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: test
namespace: ingress-ns
spec:
rules:
- host: my.shiny.new.domain
http:
paths:
- path: /v1
backend:
serviceName: service-v1
servicePort: 80
- path: /v2
backend:
serviceName: service-v2
servicePort: 80
Kubernetes将使用您在Ingress对象中设置的规则创建新的HTTP(S)平衡器,并且您将拥有一个具有跨命名空间路径的路由的入口点,并且您不必使用多个IP地址为了那个原因。
实际上,您还可以通过该入口管理您的应用程序的主要版本,并使用带有“/”路径的主域来处理对生产版本的请求。