当前位置: 首页 > 知识库问答 >
问题:

如何构建具有中央证书和身份验证管理的入口控制器

松嘉颖
2023-03-14

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

在AWS中,使用ALB很好,例如它允许您终止TLS并使用Cognito添加身份验证。(见此处)

要预配ALB并将其连接到应用程序,有aws-load-balancer-控制器。它工作正常,但它需要每个应用程序/入口配置一个新的ALB:

  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入口控制器提供正确的地址

共有2个答案

燕正德
2023-03-14

您可以使用两个入口控制器来实现这一点。ALB入口控制器将把公开的endpoint和路由流量交给作为后端的nginx入口控制器。然后配置nginx入口控制器以管理应用程序流量的入口。

阳航
2023-03-14

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

我使用terraform设置环境。设置alb入口控制器后,我可以创建一个合适的入口对象,等待alb启动,使用terraform提取alb的地址,并使用发布状态地址告诉nginx将该地址准确发布到其所有入口:

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地址的任何更改。-幸运的是,我不希望地址改变,所以我对这个解决方案没意见。

 类似资料:
  • 我有一个通过X509验证的API。但是,我需要从身份验证中绕过我的执行器健康检查endpoint,这样我就可以在没有客户端证书的情况下进行健康检查。 我意识到,这可以通过使用不同的端口来实现,用于执行器endpoint将命中的服务器和管理。 我的application.yml配置如下: 我的问题是,即使使用这种配置,管理endpoint也不是我可以访问健康endpoint的地方。http://lo

  • 我们正在尝试做一些具有登录屏幕的网站。但是我们有一个问题。我们的域是本地主机/登录/用户。但是,如果用户进入localhost/Home/Index,他/她无需登录即可访问我们的主站点。因此,我们将 [授权] 写入索引控制器。但我不知道我必须使用什么。我是否必须在我们的项目中使用AuthorizeAttribute? 如何访问LoginController/Authentication函数中的索引

  • 我有一个Spring启动的应用程序,用户可以通过登录和密码或数字证书进行身份验证。我试图用用户和密码验证,但当我试图用证书验证时,chrome不显示窗口来选择我想在验证中使用的证书(我有几个证书,服务器是安全的,等等...) 有什么想法吗?我附上我的WebSecurity配置适配器的代码,以防我出错 配置属性包括: 服务器ssl。密钥存储=存储/密钥存储。jks服务器。ssl。密钥存储密码=更改I

  • 我是SOAP新手,正在尝试运行wsimport命令来生成存根,以便我可以调用相关服务。我有wsdl url,要访问它,我需要进行身份验证。所以我尝试了以下命令来解决身份验证问题: wsimport -Xauthfile C:\auth.txt -keep http://example.com/test?wsdl -s c:\path\to\源\ 然而,当我在浏览器中启动服务器url时,它抱怨“站点

  • 问题内容: 我正在尝试连接到HTTPS URL,但是我需要使用客户端身份验证以及第三方软件在我的系统上放置的证书。 我丝毫不知道如何找到或使用它,我所要做的只是C#示例代码,这与我为此找到的所有Java答案都大不相同。(例如,KeyStore显然需要某种密码吗?) 这是我拥有的C#示例代码 然后,它仅遍历WS2_store_Certs CertificateCollection并一路检查它们。再进

  • 我正在使用Vert。后端为x,前端为AngularJS。 Vert. x服务器使用POST和GET方法接收HTTP操作。不知何故,我为每个请求获取不同的会话ID。 以下是来自我的LoginFormHandler类句柄例程的代码片段。 我正在将用户对象放入当前会话中。然后我移动到新页面并向Vert. x服务器发送POST请求。在那个POST处理程序中,我正在尝试获取会话对象: 我没有得到用户。此外,