我需要在Azure k8s上配置入口Nginx,我的问题是,是否可以在一个名称空间et. ingress-nginx中配置入口,而在其他名称空间中配置一些服务,例如resources?我的文件看起来像这样:
第一个
然后我在resources namespace中运行了一些应用程序,问题是我收到了以下错误
error obtaining service endpoints: error getting service resources/api-sand from the cache: service resources/api-sand was not found
如果我将api-sand部署在与ingress相同的命名空间中,那么此服务将正常工作。
6条答案
按热度按时间wsxa1bj11#
对于那些对Kubernetes及其入口选项相对陌生的人,我想进一步简化一下答案。入口要起作用,需要具备两个独立的条件:
1.入口控制器(本质上是一个单独的Pod/部署沿着一个服务,可用于利用路由和代理。例如,基于nginx容器);
1.入口规则(
kind: Ingress
的独立Kubernetes资源。仅在已部署入口控制器的情况下生效)现在,入口控制器可以部署在任何命名空间,事实上,它通常部署在独立于应用服务的命名空间中。它可以查看集群中所有命名空间中的入口规则,并将其提取出来。
但是,入口规则必须位于其配置的应用所在的命名空间中。
有一些解决方法,但这是最常用的方法。
au9on6nz2#
与其在
ingress-nginx
命名空间中创建入口app-ingress
,不如在具有服务api-sand
和pod的命名空间中创建入口app-ingress
。或者,也可以通过
externalName
在一个命名空间中实现入口,而在另一个命名空间中实现服务。下面是一个引用自here的示例。
第一个
q35jwt9p3#
实际上,您可以在名称空间A中定义入口和ExternalName类型的服务,而ExternalName指向名称空间B中服务的DNS。有关更多详细信息,请参考以下答案:https://stackoverflow.com/a/51899301/2995449
zi8p0yeb4#
外部流量通过
ingress controller service
进入,ingress controller service
负责根据定义的路由规则路由流量,或者我们在k8s世界中称为ingress rules
。换句话说,
ingress
资源只是路由规则(想想看,这类似于DNS记录),因此,当您定义ingress
资源时,您只是为ingress controller
定义了一个规则,以便根据此类定义的规则处理和路由流量。解决方法:
1.由于
Ingress
仅仅是路由规则,您可以在集群中的任何地方(在任何namespace
中)定义这样的规则,并且controller
应该在它监视这样的资源的创建时拾取它们并相应地做出React。以下是如何使用
kubectl
轻松创建入口kubectl create ingress <name> -n namespaceName --rule="host/prefix=serviceName:portNumber"
注意:添加
--dry-run=client -oyaml
以生成yaml
清单文件1.或者您可以在定义
ingress
的同一个namespace
中创建ExternalName
类型的服务。这样的外部服务可以指向任何URL(位于namespace
甚至k8s集群之外的服务)下面的示例演示了如何使用kubectl创建
ExternalName
服务:kubectl create service externalname ingress-ns -n namespaceName --external-name=serviceName.namespace.svc.cluster.local --tcp=80:80 --dry-run=client -oyaml
这将生成类似于以下内容的内容:
如上所述,创建入口如下:
kubectl create ingress <name> -n namespaceName --rule="host/prefix=serviceName:portNumber"
注意:添加
--dry-run=client -oyaml
以生成yaml
清单文件pdtvr36n5#
对我来说,有效的方法是为每个命名空间创建入口
第一个
1rhkuytd6#
每个入口资源都有一个默认的way to configure后端,尽管文档中说它通常在入口控制器级别配置。
例如:
这里,default-http-backend必须在与入口资源相同的名称空间中定义。