EKS Ingress ALB 为某些服务添加 HTTP 侦听器,为其他服务添加 HTTPS

EKS Ingress ALB add HTTP listener for some services and HTTPS for others

我有以下 ingress.yaml 文件

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
    name: in
    annotations:
        kubernetes.io/ingress.class: alb
        alb.ingress.kubernetes.io/scheme: internet-facing
        alb.ingress.kubernetes.io/load-balancer-attributes: idle_timeout.timeout_seconds=600
        alb.ingress.kubernetes.io/target-type: ip
        alb.ingress.kubernetes.io/certificate-arn: xxxx
        alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS": 443}]'
spec:
    rules:
        - http:
            paths:
                - path: /api/bulk-api/*
                  backend:
                    serviceName: dg-bulk-api
                    servicePort: 5000
                - path: /api/adjuster-selection
                  backend:
                    serviceName: dg-adjuster-selection
                    servicePort: 5050
                - path: /api/cockpit/*
                  backend:
                    serviceName: dg-cockpit
                    servicePort: 5050
                - path: /api/regression/*
                  backend:
                    serviceName: dg-regression
                    servicePort: 5005
                - path: /api/lp/task-details*
                  backend:
                    serviceName: lp-task-detail
                    servicePort: 5050
                - path: /api/tool-setup/*
                  backend:
                    serviceName: dg-tool-setup
                    servicePort: 5000
                - path: /api/guideline/*
                  backend:
                    serviceName: dg-guideline
                    servicePort: 5050
                - path: /*
                  backend:
                    serviceName: dg-ui
                    servicePort: 80

上面提到的 yaml 创建了一个 ALB,并为所有路由添加了 80 和 443 的侦听器。但是,我希望监听 80 用于除 dg-ui 服务之外的所有路由,而 443 仅用于 dg-ui 服务。让我知道如何做到这一点。

如果您想确保某些网址仅使用 https 或 http,您需要为 http 定义 ingress.kubernetes.io/ssl-redirect: "true" 注释或仅使用 http 定义 ingress.kubernetes.io/ssl-redirect: "false"。事实上,声明的注释会影响您在入口对象中定义的整个路径,这就是为什么您需要像下面的示例那样分离入口定义。因此,对于 http,您需要像下面那样使用 yaml;

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: https-ingress
  annotations:
    ingress.kubernetes.io/ssl-redirect: "true"
spec:
  tls:
  - hosts:
    - example.com
    secretName: tls-secret
  rules:
  - host: example.com
    http:
      paths:
      - path: /secured
        backend:
          serviceName: my-service
          servicePort: 8080
 

对于 http 你需要像下面的 yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: http-ingress
  annotations:
    ingress.kubernetes.io/ssl-redirect: "false"
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /unsecured
        backend:
          serviceName: my-service
          servicePort: 8080

我已经解决了这个问题。觉得对大家有帮助。

  1. 已将我的 ALB Ingress Controller 更新到 v2.1。说明可在以下位置找到:AWS LoadBalancer Controller
  2. 为 Http 和 Https 侦听器规则创建单独的 Ingress Yaml。
  3. 添加注释:alb.ingress.kubernetes.io/group.name: my-team.awesome-group 到两个 Ingress。这将创建 2 个入口并将规则附加到 1 个公共 ALB。可以在此处找到有关此注释的更多信息:IngressGroups