如何在 Istio 中设置 AWS ALB 而不是 ELB?
Posted
技术标签:
【中文标题】如何在 Istio 中设置 AWS ALB 而不是 ELB?【英文标题】:How to set AWS ALB instead of ELB in Istio? 【发布时间】:2020-10-05 23:52:44 【问题描述】:我正在尝试在 Kubernetes AWS 中设置 ALB 负载均衡器而不是默认的 ELB 负载均衡器。负载均衡器必须连接到 istio ingressgateway。我寻找解决方案,但只找到了one。 但是提到的 istio 版本是 V1,现在 istio 发生了很多变化。我尝试在图表中将服务类型更改为 nodeport(根据博客),但服务仍然作为负载均衡器提供。
有人可以提一下如何为 istio ingressgateway 配置 ALB 的步骤吗?
感谢阅读
【问题讨论】:
【参考方案1】:第 1 步:将 istioingresssgateway 服务类型更改为节点端口
第 2 步:安装 ALB 入口控制器
第 3 步:为 istioingressgateway 编写 ingress.yaml,如下所示:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
namespace: istio-system
name: ingress
labels:
app: ingress
annotations:
kubernetes.io/ingress.class: alb
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/subnets: <subnet1>,<subnet2>
spec:
rules:
- http:
paths:
- path: /*
backend:
serviceName: istio-ingressgateway
servicePort: 80
如果您将 vpc 的子网标记为:
,则可以避免alb.ingress.kubernetes.io/subnets 注释
kubernetes.io/cluster/: 拥有
kubernetes.io/role/internal-elb: 1(用于内部 ELB)
kubernetes.io/role/elb: 1(用于外部 ELB)
否则您可以提供两个子网值,每个子网应位于上述 yaml 中的不同可用区
它在 Istio 1.6 中工作
【讨论】:
这仍然适用于 1.8.0 吗?我在目标群体中不断收到失败的健康检查。 @MichaelMartin,以及那些希望解决同样问题的人。您需要更改 ALB 目标组健康检查配置以使用 Istio 状态端口作为健康检查端口。使用映射 Istio 15021 targetPort 和 /healthz/ready URL 的 nodePort【参考方案2】:当前接受的答案是正确的。不过我想稍微更新一下。 安装和配置 AWS alb 控制器后,应采取几个步骤使其工作并可用:
-
使用
istioctl manifest generate
命令生成清单列表
找到istio-ingressgateway
服务配置
将其更新为 NodePort 类型
更新端口配置以具有节点和目标端口的预定义映射。注意status-port
NodePort
应用这些清单,而不是使用istioctl install
命令安装/更新 istio。在某些情况下,依赖 istio helm 安装可能会更好
更新入口配置以具有以下注释
alb.ingress.kubernetes.io/healthcheck-port: 'PORT'
alb.ingress.kubernetes.io/healthcheck-path: /healthz/ready
alb.ingress.kubernetes.io/healthcheck-protocol: HTTP```
where PORT equals to the istio status-port NodePort value
This way, you update ALB default configuration for the healthcheck to check Istio healthcheck
【讨论】:
【参考方案3】:我可以确认 tibin_tomy 在 Istio 1.7.4 上为我工作的解决方案。此外,我在第 1 步中使用了 ClusterIP 而不是 NodePort。
Step1 - 将 istioingresssgateway 服务类型更改为 ClusterIP(使用 IstioOperator 安装 Istio):
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
namespace: istio-system
name: istio
spec:
profile: default
components:
ingressGateways:
- name: istio-ingressgateway
k8s:
service:
type: ClusterIP # Disable classic load balancer creation (default), routing to here will be done via Kubernetes Ingress resource
注意:将“Ingress”部署在与 istio-ingressgateway 相同的命名空间中(默认为 istio-system)。 例如,如果 istio-ingressgateway 在命名空间 istio-system 中,而 Ingress 在命名空间系统中,则 aws-alb-ingress-controller 错误:
"kubebuilder/controller "msg"="Reconciler error" "error"="failed to 由于未能加载 serviceAnnotation 导致协调 targetGroups 本地存储中没有对象匹配键“system/istio-ingressgateway” “控制器”=“alb-入口控制器” "request"="Namespace":"system","Name":"sonata-ingress""
【讨论】:
以上是关于如何在 Istio 中设置 AWS ALB 而不是 ELB?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 S3 在 aws 中设置静态站点 - 是不是有视觉指南?
如何在 spark-shell 中设置 aws 访问密钥和 aws 密钥