【问题标题】:Getting External-IP for Istio Gateway on Self-Managed Kubernetes在自我管理的 Kubernetes 上为 Istio 网关获取外部 IP
【发布时间】:2020-08-26 14:05:29
【问题描述】:

如果我的术语不完美,请提前抱歉,我现在正在学习 Kubernetes。

我在一系列 AWS 实例上拥有一个自我管理的 Kubernetes 集群,其中包含一个主节点和五个工作节点。所有节点都运行 Ubuntu 18.04。这些节点都在 VPC 上,我使用堡垒主机 ssh 进入它们。目前,我还为所有节点提供了外部 IP,只是为了使测试更容易。我也有一个域,我们叫它xxx.example.org,指向主节点当前的外部IP。

我使用 Kubespray 设置 Kubernetes,然后继续安装 Istio(使用 istioctl)并根据官方文档 here 和 here 设置 Ingress 网关

当我运行 kubectl get svc -n istio-system istio-ingressgateway 时,集群的外部 IP 始终是:

NAME                   TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)                                                                                                                                      AGE
istio-ingressgateway   LoadBalancer   10.233.3.209   <pending>     15020:30051/TCP,80:32231/TCP,443:30399/TCP,15029:31406/TCP,15030:32078/TCP,15031:30050/TCP,15032:30204/TCP,31400:31912/TCP,15443:31071/TCP   3m1s

我可以在浏览器中使用IP:32231/headers 或xxx.example.org:32231/headers 访问服务

我使用以下命令为 Istio 文档中引用的 httpbin 和 Bookinfo 项目配置了网关和 VirtualService:

kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: httpbin-gateway
spec:
  selector:
    istio: ingressgateway # use Istio default gateway implementation
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: httpbin
spec:
  hosts:
  - "*"
  gateways:
  - httpbin-gateway
  http:
  - match:
    - uri:
        prefix: /status
    - uri:
        prefix: /delay
    - uri:
        prefix: /headers
    route:
    - destination:
        port:
          number: 8000
        host: httpbin
  - match:
    - uri:
        exact: /productpage
    - uri:
        prefix: /static
    - uri:
        exact: /login
    - uri:
        exact: /logout
    - uri:
        prefix: /api/v1/products
    route:
    - destination:
        host: productpage
        port:
          number: 9080
EOF

鉴于这是一个自我管理的集群,有没有办法为集群获取外部 IP?如果没有,我将如何修改我当前的配置,以便可以从xxx.example.org 而不是xxx.example.org:32231 访问这些页面?

编辑#1

我确实尝试按照 this documentation 和 this guide 在 AWS 上设置 NLB。不幸的是,这并没有改变任何东西,EXTERNAL-IP 仍然是&lt;pending&gt;。之后,我部署了一个新的入口网关,如下所示:

apiVersion: v1
kind: Service
metadata:
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
  labels:
    app: istio-ingressgateway-2
    istio: ingressgateway-2
    operator.istio.io/component: IngressGateways
    operator.istio.io/managed: Reconcile
    operator.istio.io/version: 1.5.2
    release: istio
  name: istio-ingressgateway-2
  namespace: istio-system
spec:
  ports:
  - name: status-port
    nodePort: 30625
    port: 15020
    protocol: TCP
    targetPort: 15020
  - name: http2
    nodePort: 32491
    port: 80
    protocol: TCP
    targetPort: 80
  - name: https
    nodePort: 30466
    port: 443
    protocol: TCP
    targetPort: 443
  - name: kiali
    nodePort: 32034
    port: 15029
    protocol: TCP
    targetPort: 15029
  - name: prometheus
    nodePort: 30463
    port: 15030
    protocol: TCP
    targetPort: 15030
  - name: grafana
    nodePort: 31176
    port: 15031
    protocol: TCP
    targetPort: 15031
  - name: tracing
    nodePort: 32040
    port: 15032
    protocol: TCP
    targetPort: 15032
  - name: tcp
    nodePort: 32412
    port: 31400
    protocol: TCP
    targetPort: 31400
  - name: tls
    nodePort: 30411
    port: 15443
    protocol: TCP
    targetPort: 15443
  selector:
    app: istio-ingressgateway-2
    istio: ingressgateway-2
  type: LoadBalancer

我还将我的httpbin-gateway 更改为使用ingressgateway-2。这无法加载任何内容,即使在端口 32231 上也是如此。

【问题讨论】:

    标签: amazon-web-services networking kubernetes istio


    【解决方案1】:

    可以通过向您的 LoadBalancer 服务清单添加注释来解决此问题。

    根据Amazon文档:

    Amazon EKS 通过 LoadBalancer 类型的 Kubernetes 服务支持在 Amazon EC2 实例工作线程节点上运行的 Pod 的网络负载均衡器和经典负载均衡器。在 AWS Fargate (Fargate) 上运行的 Pod 不支持 Classic Load Balancer 和 Network Load Balancer。对于 Fargate 入口,我们建议您在 Amazon EKS(最低版本 v1.1.4)上使用 ALB Ingress Controller。

    负载均衡器的配置由添加到服务清单中的注释控制。默认情况下,Classic Load Balancer 用于LoadBalancer 类型的服务。要改用网络负载均衡器,请将以下注释应用于您的服务:

    service.beta.kubernetes.io/aws-load-balancer-type: nlb

    有关指定负载均衡器的示例服务清单,请参阅 Kubernetes 文档中的 Type LoadBalancer。有关在 Kubernetes 中使用网络负载均衡器的更多信息,请参阅 Kubernetes 文档中的Network Load Balancer support on AWS。

    默认情况下,LoadBalancer 类型的服务会创建面向公众的负载均衡器。要使用内部负载均衡器,请将以下注释应用于您的服务:

    service.beta.kubernetes.io/aws-load-balancer-internal: "true"

    对于内部负载均衡器,您的 Amazon EKS 集群必须配置为在您的 VPC 中使用至少一个私有子网。 Kubernetes 检查您的子网的路由表,以确定它们是公共的还是私有的。公共子网使用互联网网关直接连接到互联网,但私有子网没有。

    要将一个或多个这样的注释添加到您的 istio 入口配置中,您可以按照 this 文章中的示例进行操作。

    希望对你有帮助。

    【讨论】:

    • 我确实需要公众可以访问该服务,并且我没有使用 EKS 来管理集群。我已经用我也尝试过的修改后的入口网关更新了原始问题。我未能加载任何配置,即使在端口 32231 上也是如此。
    • @vivek 你有运气吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-14
    • 2018-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多