首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何建立具有中央证书和统一管理的入口控制器

如何建立具有中央证书和统一管理的入口控制器
EN

Stack Overflow用户
提问于 2022-03-02 00:18:32
回答 2查看 974关注 0票数 1

我想以一种集中管理的安全方式向互联网公开EKS中的一些网络应用。

在AWS中,使用ALB很好,例如,它允许您终止TLS并使用terminate添加身份验证。(请看这里)

要提供ALB并将其连接到应用程序,就需要负载平衡器控制器。它工作得很好,但是每个应用程序/入口都需要配置一个新的ALB:

代码语言:javascript
复制
  annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/tags: Environment=test,Project=cognito
    external-dns.alpha.kubernetes.io/hostname: sample.${COK_MY_DOMAIN} 
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS":443}]'
    alb.ingress.kubernetes.io/actions.ssl-redirect: '{"Type": "redirect", "RedirectConfig": { "Protocol": "HTTPS", "Port": "443", "StatusCode": "HTTP_301"}}'
    alb.ingress.kubernetes.io/auth-type: cognito
    alb.ingress.kubernetes.io/auth-scope: openid
    alb.ingress.kubernetes.io/auth-session-timeout: '3600'
    alb.ingress.kubernetes.io/auth-session-cookie: AWSELBAuthSessionCookie
    alb.ingress.kubernetes.io/auth-on-unauthenticated-request: authenticate
    alb.ingress.kubernetes.io/auth-idp-cognito: '{"UserPoolArn": "$(aws cognito-idp describe-user-pool --user-pool-id $COK_COGNITO_USER_POOL_ID --region $COK_AWS_REGION --query 'UserPool.Arn' --output text)","UserPoolClientId":"${COK_COGNITO_USER_POOL_CLIENT_ID}","UserPoolDomain":"${COK_COGNITO_DOMAIN}.auth.${COK_AWS_REGION}.amazoncognito.com"}'
    alb.ingress.kubernetes.io/certificate-arn: $COK_ACM_CERT_ARN 
    alb.ingress.kubernetes.io/target-type: 'ip'

我希望有一个中央明确定义的ALB和所有的应用程序不需要再关心这一点。

我的想法是拥有一个常规的nginx-入口控制器并通过一个中央ALB公开它。

现在的问题是:如何将ALB连接到nginx控制器?

一种方法是手动配置ALB并手工构建目标组,这不像是一个稳定的解决方案。

另一种方法是使用aws负载平衡器控制器连接nginx。然而,在这种情况下,nginx似乎无法发布正确的负载均衡器地址,外部DNS将输入错误的DNS记录。(不幸的是,在通常的入口控制器(如nginx或traefik)中似乎没有-出版-进入选项。)

问题:

  • 是否有办法使nginx入口控制器提供正确的地址?
  • 有没有更简单的方法把两个入口控制器结合起来?
EN

回答 2

Stack Overflow用户

发布于 2022-03-03 17:41:43

我想我找到了一个很好的解决办法。

我用地形建立了我的环境。在我设置alb入口控制器之后,我可以创建一个合适的入口对象,直到ALB启动,使用terraform提取ALB的地址,并使用publish-status-address告诉nginx将该地址准确地发布到它的所有入口:

代码语言:javascript
复制
resource "kubernetes_ingress_v1" "alb" {
  wait_for_load_balancer = true
  metadata {
    name = "alb"
    namespace = "kube-system"
    annotations = {
      "alb.ingress.kubernetes.io/scheme" = "internet-facing"
      "alb.ingress.kubernetes.io/listen-ports" = "[{\"HTTP\": 80}, {\"HTTPS\":443}]"
      "alb.ingress.kubernetes.io/ssl-redirect" = "443"
      "alb.ingress.kubernetes.io/certificate-arn" = local.cert
      "alb.ingress.kubernetes.io/target-type" = "ip"
    }
  }
  spec {
    ingress_class_name = "alb"
    default_backend {
      service {
        name = "ing-nginx-ingress-nginx-controller"
        port {
          name = "http"
        }
      }
    }
  }
}

resource "helm_release" "ing-nginx" {
  name       = "ing-nginx"

  repository = "https://kubernetes.github.io/ingress-nginx"
  chart      = "ingress-nginx"
  namespace  = "kube-system"

  set {
    name  = "controller.service.type"
    value = "ClusterIP"
  }
  set {
    name  = "controller.publishService.enabled"
    value = "false"
  }
  set {
    name  = "controller.extraArgs.publish-status-address"
    value = kubernetes_ingress_v1.alb.status.0.load_balancer.0.ingress.0.hostname
  }
  set {
    name  = "controller.config.use-forwarded-headers"
    value = "true"
  }
  set {
    name  = "controller.ingressClassResource.default"
    value = "true"
  }
}

这有点奇怪,因为它引入了类似循环依赖的东西,但入口只是等待直到nginx最终起来,一切都好起来。

此解决方案与-出版-进入选项不完全相同,因为它无法适应ALB地址的任何更改。-幸运的是,我不指望那个地址会改变,所以我对这个解决方案没意见。

票数 1
EN

Stack Overflow用户

发布于 2022-03-02 17:12:31

您可以通过两个入口控制器来实现这一点。ALB入口控制器将公开公开的端点并将流量路由到nginx入口控制器作为其后端。然后配置nginx入口控制器,以管理应用程序流量的入口。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71316070

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档