【问题标题】:How to integrate Kubernetes with existing AWS ALB?如何将 Kubernetes 与现有的 AWS ALB 集成?
【发布时间】:2018-07-01 05:42:16
【问题描述】:
我想将现有的 AWS ALB 用于我的 kubernetes 设置。即我不希望 alb-ingress-controller 创建或更新任何现有的 AWS 资源,即。目标群体、角色等。
如何让 ALB 与 Kubernetes 集群通信,从而将请求传递给现有服务并将响应返回给 ALB 以显示在前端?
我尝试了this,但它会为新的入口资源创建新的 ALB。我想使用现有的。
【问题讨论】:
标签:
amazon-web-services
docker
amazon-ec2
kubernetes
microservices
【解决方案1】:
您基本上必须在运行 Kubernetes Pod 的实例上打开一个节点端口。然后您需要让 ALB 指向这些实例。有两种配置方式。通过 Pod 或服务。
要通过服务配置它,您需要指定.spec.ports[].nodePort。在默认设置中,端口需要介于 30000 和 32000 之间。此端口在每个节点上都打开,并将被重定向到指定的 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 上注册当前节点,但这意味着额外的复杂性。一个示例可能如下所示:
---
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