【问题标题】:How are the various Istio Ports used?各种 Istio 端口是如何使用的?
【发布时间】:2021-08-13 05:46:31
【问题描述】:

问题

我正在尝试学习 Istio,并且正在设置我的 Istio Ingress-Gateway。当我设置它时,有以下端口选项(as indicated here):

  • 端口
  • 节点端口
  • 目标端口

NodePort 对我来说很有意义。这是 Ingress-Gateway 将在 Kubernetes 集群中的每个工作节点上侦听的端口。到达那里的请求将使用 Ingress Gateway CRD 路由到 Kubernetes 集群。

在示例中,Port 通常设置为其匹配流量的公共端口(80 用于 http,443 用于 https 等)。我不明白 Istio 需要这个端口做什么,因为除了 NodePort 之外我没有看到任何流量。

TargetPort 对我来说是个谜。我看过一些关于普通 Istio 网关的文档(说它是only applicable when using ServiceEntries),但对于 Ingress-Gateway 没有任何意义。

我的问题是,关于 Ingress-Gateway(不是普通网关),TargetPort 是什么?

更多详情

最后,我正在尝试调试为什么我的入口流量会收到“连接被拒绝”响应。

我使用以下配置设置了我的 Istio Operator following this tutorial

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  name: istio-controlplane
  namespace: istio-system
spec:
  components:    
    ingressGateways:
    - enabled: true
      k8s:
        service:
          ports:
          - name: http2
            port: 80
            nodePort: 30980            
        hpaSpec:
          minReplicas: 2
      name: istio-ingressgateway
    pilot:
      enabled: true
      k8s:
        hpaSpec:
          minReplicas: 2
  profile: default

我从配置中省略了 TargetPort,因为我发现 this release notes 表示 Istio 将选择安全的默认值。

我尝试按照this tutorial 中的步骤进行操作。

我尝试了该教程中指示的 curl 命令:

curl -s -I -H Host:httpbin.example.com "http://10.20.30.40:30980/status/200"

收到Failed to connect to 10.20.30.40 port 30980: Connection refused的回复

但是我可以 ping 10.20.30.40 很好,并且获取 NodePort 的命令返回 30980

所以我开始想,这可能是我不理解的 TargetPort 设置的问题。

检查istiod 日志暗示我可能走在正确的轨道上。我跑了:

kubectl logs -n istio-system -l app=istiod

在我找到的日志中:

warn    buildGatewayListeners: skipping privileged gateway port 80 for node istio-ingressgateway-dc748bc9-q44j7.istio-system as it is an unprivileged pod
warn    gateway has zero listeners for node istio-ingressgateway-dc748bc9-q44j7.istio-system

所以,如果你能走到这一步,那就哇!我感谢你阅读这一切。如果您对我需要将 TargetPort 设置为什么有任何建议,或者如果我缺少其他内容,我很想听听。

【问题讨论】:

    标签: kubernetes istio istio-gateway


    【解决方案1】:

    我仍然不太明白 TargetPort 在做什么,但我已经完成了教程。

    我返回了一个卸载的 Istio(通过删除操作员配置,然后删除 istio 命名空间)。然后我重新安装了它,但我删除了指定节点端口的部分配置。

    然后我运行了kubectl get namespace istio-ingressgateway -o yaml -n istio-system。这向我展示了 istio 入口网关使用什么作为端口的默认值。然后我去更新我的 yaml 以供操作员匹配(除了我想要的自定义 NodePort)。那行得通。

    最后,yaml 是这样的:

    apiVersion: install.istio.io/v1alpha1
    kind: IstioOperator
    metadata:
      name: istio-controlplane
      namespace: istio-system
    spec:
      components:    
        ingressGateways:
        - enabled: true
          k8s:
            service:
              ports:
              - name: status-port
                nodePort: 32562
                port: 15021
                protocol: TCP
                targetPort: 15021
              - name: http2
                nodePort: 30980
                port: 80
                protocol: TCP
                targetPort: 8080
              - name: https
                nodePort: 32013
                port: 443
                protocol: TCP
                targetPort: 8443           
            hpaSpec:
              minReplicas: 2
          name: istio-ingressgateway
        pilot:
          enabled: true
          k8s:
            hpaSpec:
              minReplicas: 2
      profile: default
    

    我仍然想了解TargetPort 在做什么。因此,如果有人可以回答这个问题(同样,在 Istio Ingress Gateway 服务(不是 istio 网关)的上下文中),那么我会接受这个答案。

    【讨论】:

      【解决方案2】:

      Port、Nodeport 和 TargetPort 不是 Istio 的概念,而是 Kubernetes 的概念,更具体地说是 Kubernetes Services,这也是 Istio Operator API 中没有详细描述的原因。

      Istio Operator API 公开了配置 Ingress Gateway 的 (Kubernetes) 服务的选项。

      有关这些概念的描述,请参阅Kubernetes Service 的文档。

      另请参阅 Difference between targetPort and port in Kubernetes Service definition

      所以目标端口是 Ingress Gateway 的 Pod 的容器接收流量的地方。

      因此我认为,端口和目标端口的配置是特定于应用程序的,映射 80->8080 或多或少是任意的,即应用程序的“决定”。

      其他细节:

      Istio Operator 描述了 Ingress Gateway,它本身由一个 Kubernetes Service 和一个 Kubernetes Deployment 组成。通常部署在 istio-system 中。您可以检查 istio-ingressgateway 的 Kubernetes 服务,它会匹配该 YAML 的规范。

      因此,Istio Ingress Gateway 实际上是在与其容器对话。 但是,这主要是 Istio Ingress Gateway 的实现细节,与您为应用定义的 Service 和 VirtualService 无关。

      Ingressgateway 本身就是一项服务,在您定义的端口(即 80)上接收流量,并将其转发到其容器上的 8080。然后根据 Gateways 和 VirtualServices 配置的规则处理流量,并将其发送到应用程序的 Service。

      【讨论】:

      • 这让我很困惑,因为 Istio 虚拟服务是连接到 Kubernetes 服务的。流量从 Istio Ingress Gateway 传递到普通的 Istio 网关,然后在到达容器之前传递到 Istio 虚拟服务。我认为连接 Kubernetes 服务是虚拟服务的工作(包括通过 yaml 的destination 部分在容器中的端口号)。如果 Istio Ingress Gateway 不与 Kubernetes 容器通信,Istio Ingress Gateway 上的 TargetPort 是做什么用的?
      • @Vaccano 添加了一个包含更多详细信息的部分
      • 那么 NodePort 用于我的服务/pod 的流量,但 TargetPort 用于 Ingress 网关容器的流量?在 yaml 的完全相同的部分中配置这两个似乎真的很奇怪。 (我认为您在配置 NodePort 时不会强制配置入口控制器的内部通信。)
      • 不,NodePort:在每个节点的 IP 上的静态端口(NodePort)上公开服务。对于 LoadBalancer:自动创建外部负载均衡器路由到的 NodePort 和 ClusterIP 服务......所以 NodePort 是可以从集群外部访问服务的端口,而 Loadbalancer 使用该端口进行路由所以我猜猜你甚至不需要显式配置 NodePort,Port 和 Targetport 就足够了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-28
      • 1970-01-01
      • 2019-04-18
      • 2019-01-20
      • 1970-01-01
      • 1970-01-01
      • 2018-12-06
      相关资源
      最近更新 更多