具有单个 ALB、多个命名空间和外部 DNS 的 EKS Ingress

EKS Ingress with Single ALB, multiple namespaces, and External DNS

我正在尝试在 aws EKS 中跨多个命名空间配置单个 ALB,每个命​​名空间都有自己的入口资源。

我正在尝试在 k8s v1.20 上配置入口控制器 aws-loadbalancer-controller

我面临的问题是,每次我尝试部署新服务时,除了在入口配置中指定的共享 ALB 之外,它总是启动一个新的经典负载均衡器。

https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.2/

# service-realm1-dev.yaml:
apiVersion: v1
kind: Service
metadata:
  name: sentinel
  annotations:
    external-dns.alpha.kubernetes.io/hostname: realm1.dev.sentinel.mysite.io
  namespace: realm1-dev
  labels:
    run: sentinel
spec:
  ports:
    - port: 5001
      name: ps1
      protocol: TCP
  selector:
    app: sentinel
  type: LoadBalancer
# ingress realm1-app
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/group.name: sentinel-ingress
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip
    alb.ingress.kubernetes.io/healthcheck-protocol: HTTP
    alb.ingress.kubernetes.io/healthcheck-port: traffic-port
    alb.ingress.kubernetes.io/healthcheck-interval-seconds: "15"
    alb.ingress.kubernetes.io/healthcheck-timeout-seconds: "5"
    alb.ingress.kubernetes.io/success-codes: 200-300
    alb.ingress.kubernetes.io/healthy-threshold-count: "2"
    alb.ingress.kubernetes.io/unhealthy-threshold-count: "2"
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTP":80}]'
  name: sentinel-ingress-controller
  namespace: realm1-dev
spec:
  rules:
    - host: realm1.dev.sentinel.mysite.io
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              servicePort: use-annotation
              serviceName: sentinel

我还使用外部 dns 创建一个 route53 reecodset,然后我使用相同配置的 DNS 将请求路由到特定的 eks 服务,这种方法有什么问题吗?

不幸的是,用于您的用例的工具是错误的。 AWS Load Balancer Controller 将为每个入口资源创建一个新的负载均衡器,我认为,它为每个服务资源创建一个网络负载均衡器。

对于您的用例,最好的选择是使用 nginx 入口控制器。您可以在任何 1 命名空间中部署 nginx 入口控制器,然后在整个集群中创建入口资源,并且您可以在集群中拥有基于 path/hostname 的路由。

如果你有很多 teams/projects/applications 并且你想避免所有应用程序都依赖于 1 个 ELB 的单点故障,你可以在你的 k8s 集群中部署超过 1 个 nginx 入口控制器。

您只需在 nginx 入口控制器部署中定义一个 ingress-class 变量,并在您的应用程序中添加该 ingress-class 注释。这样,具有 ingress-class:nginxA 注释的应用程序将与在其部署中具有 ingress-class=nginxA 的 nginx 入口控制器集群。

我只用一个 ALB 就可以让它工作, @YYashwanth,使用 Nginx 是我的后备计划,我试图使配置尽可能简单,也许将来当我们尝试在其他云提供商中部署我们的解决方案时,我们将使用 nginx 入口控制器。

1-启动服务类型应该是node端口,使用loadbalancer会创建一个经典的LB。

apiVersion: v1
kind: Service
metadata:
  name: sentinel-srv
  annotations:
    external-dns.alpha.kubernetes.io/hostname: operatorv2.dev.sentinel.mysite.io
  namespace: operatorv2-dev
  labels:
    run: jsflow-sentinel
spec:
  ports:
    - port: 80
      targetPort: 80
      name: ps1
      protocol: TCP
  selector:
    app: sentinel-app
  type: NodePort

2- 其次我们需要配置 group.name,入口控制器使用注释 alb.ingress.kubernetes.io/group.name

合并所有入口配置
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    alb.ingress.kubernetes.io/healthcheck-interval-seconds: "15"
    alb.ingress.kubernetes.io/healthcheck-path: /
    alb.ingress.kubernetes.io/healthcheck-port: traffic-port
    alb.ingress.kubernetes.io/healthcheck-protocol: HTTP
    alb.ingress.kubernetes.io/healthcheck-timeout-seconds: "5"
    alb.ingress.kubernetes.io/healthy-threshold-count: "2"
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80} ]'
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/success-codes: "200"
    alb.ingress.kubernetes.io/tags: createdBy=aws-controller
    alb.ingress.kubernetes.io/target-type: ip
    alb.ingress.kubernetes.io/unhealthy-threshold-count: "2"
    external-dns.alpha.kubernetes.io/hostname: operatorv2.sentinel.mysite.io
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/group.name: sentinel-group
  name: dev-operatorv2-sentinel-ingress-controller
  namespace: operatorv2-dev
spec:
  rules:
    - host: operatorv2.dev.sentinel.mysite.io
      http:
        paths:
          - path: /*
            backend:
              servicePort: 80
              serviceName: sentinel-srv