【问题标题】:Strange behavior of the Istio Gateway portIstio 网关端口的奇怪行为
【发布时间】:2022-01-27 03:28:16
【问题描述】:

我很难理解 Istio 网关端口是如何使用的。我指的是下面示例中的第 14 行

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: gateway
spec:
  selector:
    istio: ingressgateway
  servers:
    - port:
        number: 8169
        name: http-test1
        protocol: HTTP
      hosts:
        - '*'

来自 Istio 文档:

代理应侦听传入连接的端口。所以 确实,如果您应用上述 yaml 文件并检查 istio-ingressgateway pod 用于监听 TCP 端口,你会发现 实际使用了 8169 端口(见下面的输出)

kubectl -n=istio-system exec istio-ingressgateway-8577c57fb6-p8zl5 -- ss -nl | grep 8169
tcp   LISTEN 0      4096               0.0.0.0:8169        0.0.0.0:*

但棘手的部分来了。如果在应用网关之前,您将 istio-ingressgateway 服务更改如下:

apiVersion: v1
kind: Service
metadata:
  name: istio-ingressgateway
...
  - name: http5
    nodePort: 31169
    port: 8169
    protocol: TCP
    targetPort: 8069
...

然后你应用网关,那么实际使用的端口不是 8169 而是 8069。似乎网关资源将首先检查 istio-ingressgateway 服务中的匹配端口,并改用服务的 targetPort

kubectl -n=istio-system exec istio-ingressgateway-8577c57fb6-p8zl5 -- ss -nl | grep 8169
<empty result>
kubectl -n=istio-system exec istio-ingressgateway-8577c57fb6-p8zl5 -- ss -nl | grep 8069
tcp   LISTEN 0      4096               0.0.0.0:8069        0.0.0.0:*

谁能解释为什么? 提前感谢您的任何帮助

【问题讨论】:

  • 您是否也在您的情况下使用了ServiceEntry?看here:targetPort uint32 The port number on the endpoint where the traffic will be received. Applicable only when used with ServiceEntries.
  • 没有使用ServiceEntry。

标签: kubernetes istio istio-gateway


【解决方案1】:

您遇到了 Istio 的一个有趣方面 - 如何配置 Istio 以使用 Istio 网关在服务网格之外公开服务。

首先,请注意网关配置将应用于在 Pod 上运行的代理(在您的示例中,在标签为 istio: ingressgateway 的 Pod 上)。 Istio 负责配置代理以侦听这些端口,但用户有责任确保允许到这些端口的外部流量进入网格。

让我举个例子。您遇到的是预期行为,因为这正是 Istio 的工作原理。


首先,我创建了一个简单的网关配置(为简单起见,我省略了虚拟服务和目标规则配置),如下所示:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: gateway
  namespace: istio-system
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 9091
      name: http-test-1
      protocol: HTTP
    hosts:
    - '*'

然后:

    $ kubectl apply -f gw.yaml
    gateway.networking.istio.io/gateway created

让我们检查一下我们的代理是否正在侦听端口9091。我们可以直接从istio-ingressgateway-* pod 中查看,也可以使用istioctl proxy-config listener 命令检索指定 Pod 中 Envoy 实例的监听器配置信息:

    $ kubectl exec istio-ingressgateway-8c48d875-lzsng -n istio-system -- ss -tulpn | grep 9091
    tcp     LISTEN   0        1024             0.0.0.0:9091           0.0.0.0:*      users:(("envoy",pid=14,fd=35))
    
    $ istioctl proxy-config listener istio-ingressgateway-8c48d875-lzsng  -n istio-system
    ADDRESS PORT  MATCH DESTINATION
    0.0.0.0 9091  ALL   Route: http.9091

在 pod 上暴露这个端口并不意味着我们可以从外部访问它,但是可以从另一个 pod 内部访问这个端口:

    $ kubectl get pod -n istio-system -o wide
    NAME                                  READY   STATUS    RESTARTS   AGE   IP         
    istio-ingressgateway-8c48d875-lzsng   1/1     Running   0          43m   10.4.0.4
    
    $ kubectl exec -it test -- curl 10.4.0.4:9091
    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    ...

为了使它可以被外部访问,我们需要在istio-ingressgateway服务上公开这个端口:

    ...
      ports:
      - name: http-test-1
        nodePort: 30017
        port: 9091
        protocol: TCP
        targetPort: 9091
    ...

经过这个修改,我们可以从外界到达端口9091

    $ curl http://<PUBLIC_IP>:9091
    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    ...

请注意,从 Pod 的角度来看,没有任何变化:

    $ kubectl exec istio-ingressgateway-8c48d875-lzsng -n istio-system -- ss -tulpn | grep 9091
    tcp     LISTEN   0        1024             0.0.0.0:9091           0.0.0.0:*      users:(("envoy",pid=14,fd=35))
    
    $ istioctl proxy-config listener istio-ingressgateway-8c48d875-lzsng  -n istio-system
    ADDRESS PORT  MATCH DESTINATION
    0.0.0.0 9091  ALL   Route: http.9091

现在让我们将istio-ingressgateway服务配置中的targetPort: 9091更改为targetPort: 9092,看看会发生什么:

    ...
      ports:
      - name: http-test-1
        nodePort: 30017
        port: 9091
        protocol: TCP
        targetPort: 9092   <--- "9091" to "9092"
    ...
    
    $ kubectl exec istio-ingressgateway-8c48d875-lzsng -n istio-system -- ss -tulpn | grep 9091
    tcp     LISTEN   0        1024             0.0.0.0:9091           0.0.0.0:*      users:(("envoy",pid=14,fd=35))
    
    $ istioctl proxy-config listener istio-ingressgateway-8c48d875-lzsng  -n istio-system
    ADDRESS PORT  MATCH DESTINATION
    0.0.0.0 9091  ALL   Route: http.9091

如您所见,到目前为止,从 Pod 的角度来看似乎没有任何变化,但我们还需要重新应用网关配置:

    $ kubectl delete -f gw.yaml && kubectl apply -f gw.yaml
    gateway.networking.istio.io "gateway" deleted
    gateway.networking.istio.io/gateway created
    
    $ kubectl exec istio-ingressgateway-8c48d875-lzsng -n istio-system -- ss -tulpn | grep 9092
    tcp     LISTEN   0        1024             0.0.0.0:9092           0.0.0.0:*      users:(("envoy",pid=14,fd=35))
    
    $ istioctl proxy-config listener istio-ingressgateway-8c48d875-lzsng  -n istio-system
    ADDRESS PORT  MATCH DESTINATION
    0.0.0.0 9092  ALL   Route: http.9092

我们的代理现在正在侦听端口9092 (targetPort),但是只要我们的网关指定此端口并且它在istio-ingressgateway 服务上打开,我们仍然可以从外部访问端口9091

    $ kubectl describe gw gateway -n istio-system | grep -A 4 "Port"
        Port:
          Name:      http-test-1
          Number:    9091
          Protocol:  HTTP
          
    $ kubectl get svc -n istio-system -oyaml | grep -C 2 9091
        - name: http-test-1
          nodePort: 30017
          port: 9091
          protocol: TCP
          targetPort: 9092
          
    $ curl http://<PUBLIC_IP>:9091
    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    ...

【讨论】:

  • 感谢您的贡献。虽然它没有完全回答我的问题。我认为这是有用的。底线网关端口与 istio-ingressgateway 服务 targetPort 相关。
【解决方案2】:

据我所知,网关是虚拟的,你可以定义多个网关并暴露不同的端口。但是,这些端口仍然需要在istio-ingressgateway上打开

因此,当您手动更改实际 ingressgateway 上的端口配置时,在应用它后只有该特定端口处于打开状态是有意义的。您正在检查 ingressgateway 而不是虚拟网关上的开放端口。

另外,我认为不鼓励直接编辑istio-ingressgateway 服务。如果您想自定义 ingressgateway,您可以定义一个 IstioOperator 并将其应用于安装 Istio。

【讨论】:

    猜你喜欢
    • 2019-04-18
    • 2019-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多