具有多个入口资源对象的 Kubernetes nginx 入口控制器

Posted

技术标签:

【中文标题】具有多个入口资源对象的 Kubernetes nginx 入口控制器【英文标题】:Kubernetes nginx ingress controller with multiple ingress resource objects 【发布时间】:2021-11-20 11:27:40 【问题描述】:

Kubernetes 入口允许我们使用入口资源对象定义规则。我们部署了一个 nginx 入口控制器。但是对于 Ingress,我们有以下需求。

Ingress 使用“auth-url”处理外部身份验证 Ingress 中的 TLS 终止。 多个后端服务的路由规则。

是否可以为所有路由定义一个只有 external-auth 定义的 Ingress。 没有指定“规则”子句,因为我们计划维护专用的 Ingress 资源 yaml 文件以进行路由。

例如:Ingress1.yaml:通用 SSL 终止入口

resource "kubernetes_ingress" "ssl_terminate_ingress" 
  metadata 
    name = "ssl-termination-ingress"
    namespace = "kube-system"
  
  spec 
    tls 
      hosts = ["example.com"]
      secret_name = "tls_secret"
    
  

  //PLEASE SEE NO RULES AS WE WANT TO DEFINE FOR EVERY APPLICATION IN A SEPARATE FILE

Ingress2.yaml:所有路由的通用 JWT 入口

resource "kubernetes_ingress" "jwt_auth_ingress" 
  metadata 
    name = "jwt-auth-ingress" 
    namespace = "kube-system",
    annotations = 
      "nginx.ingress.kubernetes.io/auth-url" = "http://my-auth-service"
    
  


Ingress 3.yaml - 应用入口

resource "kubernetes_ingress" "app_ingress" 
  metadata 
    name = "app-ingress"
    namespace = "app-ns"
  
  rule 
      host = "example.com"
      http 
        path 
          path = "/my-app"
          backend 
            service_name = "app-service"
            service_port = 80
          
        
      

所以我们希望 Ingress3.yaml 是应用程序入口,并且应该在此之前应用前两个入口文件。

我们能做到这一点吗?还是要定义一个单一的 Ingress 资源文件,我们在其中为整个 K8s 集群定义所有这 3 个资源文件

【问题讨论】:

【参考方案1】:

TL;DR:是的,您需要将它们放在一个入口中。

解释

简单来说,入口是通往已部署应用程序的路由。 具有 TLS 或 JWT 身份验证是该路由的“属性”或“附加功能”。

在你提出的场景中,你有:

ingress1.yaml 使用 TLS 终止的属性/功能定义一条到空的路由。 ingress2.yaml 是一条具有 JWT 身份验证的属性/功能的路径。 ingress3.yaml 定义到您的应用程序的路由,无需任何其他属性。

您需要一个定义应用程序路由的入口,以及 TLS 和 JWT 身份验证的附加功能。您可以通过将所有入口组合在一起来实现这一点。

【讨论】:

以上是关于具有多个入口资源对象的 Kubernetes nginx 入口控制器的主要内容,如果未能解决你的问题,请参考以下文章

带有 ALB 入口控制器的 Terraform AWS Kubernetes EKS 资源不会创建负载均衡器

云原生 | kubernetes 资源对象 - 控制器模型之Deployment

Kubernetes — 核心资源对象 — 网络

Kubernetes笔记

具有多个字段的 AngularJS ng-options

Kubernetes 入口 |无法解析主机名