我想以一种集中管理的安全方式向互联网公开EKS中的一些网络应用。
在AWS中,使用ALB很好,例如,它允许您终止TLS并使用terminate添加身份验证。(请看这里)
要提供ALB并将其连接到应用程序,就需要负载平衡器控制器。它工作得很好,但是每个应用程序/入口都需要配置一个新的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)中似乎没有-出版-进入选项。)
问题:
发布于 2022-03-03 17:41:43
我想我找到了一个很好的解决办法。
我用地形建立了我的环境。在我设置alb入口控制器之后,我可以创建一个合适的入口对象,直到ALB启动,使用terraform提取ALB的地址,并使用publish-status-address告诉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地址的任何更改。-幸运的是,我不指望那个地址会改变,所以我对这个解决方案没意见。
发布于 2022-03-02 17:12:31
您可以通过两个入口控制器来实现这一点。ALB入口控制器将公开公开的端点并将流量路由到nginx入口控制器作为其后端。然后配置nginx入口控制器,以管理应用程序流量的入口。

https://stackoverflow.com/questions/71316070
复制相似问题