如何在 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 中设置静态站点 - 是不是有视觉指南?

如何从私有 AWS ALB 公开 API 端点

AWS NLB 到 ALB IP 白名单

如何在 spark-shell 中设置 aws 访问密钥和 aws 密钥

如果我在 Cloudfront 上启用了 SSL,AWS ALB 是不是需要 SSL?

如何在 AWS 实例中设置 telnet?