Kubernetes ALB 入口:如何在入口资源上公开多个端口

Bak*_*vic 6 kubernetes kubernetes-ingress aws-alb

我正在尝试为这个看起来很常见的问题找到解决方案。

  1. 我有一个 k8s 集群 ip 服务,它暴露了两个端口:8088 和 60004
  2. 我想在 ALB 上公开这些相同的端口而不使用基于路径的路由

这适用于在 8088 端口上公开一项服务:

---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: myingress
  namespace: myns
  annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/healthcheck-path: /ping
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/tags: Environment=dev,Team=test
    alb.ingress.kubernetes.io/target-type: ip
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 8088}]'
spec:
  rules:
    - host: myhost
      http:
        paths:
          - path: /*
            backend:
              serviceName: firstservice
              servicePort: 8088
Run Code Online (Sandbox Code Playgroud)

如何使用 ONE Ingress 为两种服务实现相同的目标?

提前致谢。

Bak*_*vic 9

最后,为了解决这个问题,我使用了 ALB 入口控制器组功能,目前处于 alpha 状态:https : //github.com/kubernetes-sigs/aws-alb-ingress-controller/issues/914

这是我的入口资源现在的样子:

---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: myingress_1
  namespace: myns
  annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/tags: Environment=dev,Team=test
    alb.ingress.kubernetes.io/target-type: ip
    alb.ingress.kubernetes.io/group.name: mygroup
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 8088}]'
spec:
  rules:
    - host: <HOST>
      http:
        paths:
          - path: /*
            backend:
              serviceName: myservice
              servicePort: 8088
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: myingress_2
  namespace: myns
  annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/tags: Environment=dev,Team=test
    alb.ingress.kubernetes.io/target-type: ip
    alb.ingress.kubernetes.io/group.name: mygroup
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 60004}]'
spec:
  rules:
    - host: <HOST>
      http:
        paths:
          - path: /*
            backend:
              serviceName: myservice
              servicePort: 60004
Run Code Online (Sandbox Code Playgroud)

关键在哪里

alb.ingress.kubernetes.io/group.name: mygroup
Run Code Online (Sandbox Code Playgroud)

连接这两个入口资源。

因此,我最终得到以下结果:

  • 在 k8s 中具有多个(两个)端口的服务暴露在两个单独的入口资源中,但它们都指向同一个 AWS ALB(因为相同的组名)
  • 在 AWS ALB 方面,我得到了一个 ALB,其中暴露了两个端口:8088 和 60004,它们中的每一个都指向相同的 k8s 服务,但同一 pod 上的端口不同(如果需要,这很容易成为两个不同的 k8s 服务)