kubernetes 不同命名空间中的k8的入口配置

nvbavucw  于 2022-11-02  发布在  Kubernetes
关注(0)|答案(6)|浏览(929)

我需要在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相同的命名空间中,那么此服务将正常工作。

wsxa1bj1

wsxa1bj11#

对于那些对Kubernetes及其入口选项相对陌生的人,我想进一步简化一下答案。入口要起作用,需要具备两个独立的条件:
1.入口控制器(本质上是一个单独的Pod/部署沿着一个服务,可用于利用路由和代理。例如,基于nginx容器);
1.入口规则kind: Ingress的独立Kubernetes资源。仅在已部署入口控制器的情况下生效)
现在,入口控制器可以部署在任何命名空间,事实上,它通常部署在独立于应用服务的命名空间中。它可以查看集群中所有命名空间中的入口规则,并将其提取出来。

但是,入口规则必须位于其配置的应用所在的命名空间中。

有一些解决方法,但这是最常用的方法。

au9on6nz

au9on6nz2#

与其在ingress-nginx命名空间中创建入口app-ingress,不如在具有服务api-sand和pod的命名空间中创建入口app-ingress
或者,也可以通过externalName在一个命名空间中实现入口,而在另一个命名空间中实现服务。
下面是一个引用自here的示例。
第一个

q35jwt9p

q35jwt9p3#

实际上,您可以在名称空间A中定义入口和ExternalName类型的服务,而ExternalName指向名称空间B中服务的DNS。有关更多详细信息,请参考以下答案:https://stackoverflow.com/a/51899301/2995449

zi8p0yeb

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
这将生成类似于以下内容的内容:

kind: Service
apiVersion: v1
metadata:
  name: nginx
  namespace: ingress-ns
spec:
  type: ExternalName
  externalName: serviceName.namespace.svc.cluster.local #or any external svc
  ports:
  - port: 80 #specify the port of service you want to expose 
    targetPort: 80 #port of external service

如上所述,创建入口如下:kubectl create ingress <name> -n namespaceName --rule="host/prefix=serviceName:portNumber"

注意:添加--dry-run=client -oyaml以生成yaml清单文件

pdtvr36n

pdtvr36n5#

对我来说,有效的方法是为每个命名空间创建入口
第一个

1rhkuytd

1rhkuytd6#

每个入口资源都有一个默认的way to configure后端,尽管文档中说它通常在入口控制器级别配置。
例如:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: myingress
  namespace: myns
spec: 
  defaultBackend:
    service:
      name: default-http-backend
      port: 
        number: 80
...

这里,default-http-backend必须在与入口资源相同的名称空间中定义。

相关问题