如何将Kubernetes与现有AWS ALB集成?

时间:2018-01-22 14:47:07

标签: amazon-web-services docker amazon-ec2 kubernetes microservices

我想将现有的AWS ALB用于我的kubernetes设置。即我不希望alb-ingress-controller创建或更新任何现有的AWS资源,即。目标群体,角色等。

如何让ALB与Kubernetes集群通信,从而将请求传递给现有服务并将响应返回给ALB以显示在前端?

我尝试this但它会为新的入口资源创建新的ALB。我想使用现有的。

1 个答案:

答案 0 :(得分:1)

您基本上必须在运行Kubernetes Pod的实例上打开节点端口。然后你需要让ALB指向那些实例。有两种配置方法。通过Pod或通过服务。

要通过服务进行配置,您需要指定.spec.ports[].nodePort。在默认设置中,端口需要介于3000032000之间。此端口在每个节点上打开,并将重定向到指定的Pod(可能位于任何其他节点上)。这有另一个缺点,即使用多可用区设置时也会花钱。示例服务可能如下所示:

---
apiVersion: v1
kind: Service

metadata:
  name: my-frontend
  labels:
    app: my-frontend

spec:
  type: NodePort
  selector:
    app: my-frontend
  ports:
  - port: 8080
    nodePort: 30082

要通过 Pod 进行配置,您需要指定.spec.containers[].ports[].hostPort。这可以是任何端口号,但必须在调度Pod的节点上空闲。这意味着每个节点只能有一个Pod,它可能与其他应用程序的端口冲突。这有一个缺点,即从ALB的角度看,并非所有实例都是健康的,因为只有具有该Pod的节点才能接受流量。您可以添加一个在ALB上注册当前节点的sidecar容器,但这意味着额外的复杂性。一个例子可能如下所示:

---
apiVersion: extensions/v1beta1
kind: Deployment

metadata:
  name: my-frontend
  labels:
    app: my-frontend

spec:
  replicas: 3

  selector:
    matchLabels:
      app: my-frontend

  template:
    metadata:
      name: my-frontend
      labels:
        app: my-frontend

    spec:
      containers:
      - name: nginx
        image: "nginx"

        ports:
        - containerPort: 80
          hostPort: 8080