首页 > 解决方案 > 网关端口定义如何工作?

问题描述

我在 AKS 上有一个带有默认入口网关的示例 istio 集群。一切都按预期工作我只是想了解如何。网关定义如下:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: my-gateway
  namespace: some-config-namespace
spec:
  selector:
    app: istio-ingressgateway
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - uk.bookinfo.com
    - eu.bookinfo.com
    tls:
      httpsRedirect: true # sends 301 redirect for http requests
  - port:
      number: 443
      name: https-443
      protocol: HTTPS
    hosts:
    - uk.bookinfo.com
    - eu.bookinfo.com
    tls:
      mode: SIMPLE # enables HTTPS on this port
      serverCertificate: /etc/certs/servercert.pem
      privateKey: /etc/certs/privatekey.pem

在https://uk.bookinfo.com上访问该网站可以正常工作。但是,当我查看进入 ingressgateway pod 的 LB 和 Service 时,我看到:

LB-IP:443 -> CLUSTER-IP:443 -> istio-ingressgateway:8443
kind: Service
spec:
  ports:
    - name: http2
      protocol: TCP
      port: 80
      targetPort: 8080
      nodePort: 30804
    - name: https
      protocol: TCP
      port: 443
      targetPort: 8443
      nodePort: 31843
  selector:
    app: istio-ingressgateway
    istio: ingressgateway
  clusterIP: 10.2.138.74
  type: LoadBalancer

由于 istio-ingressgateway pod 的 targetPort 是8443 ,那么将端口号定义为443的网关定义如何工作?

标签: kubernetesistioenvoyproxy

解决方案


正如这里提到的

端口:此服务的端口

targetPort:Pod 上的目标端口,用于将流量转发到

据我所知targetPort: 8443,指向特使边车,所以如果我理解正确,特使在 8080 上监听 http,在 8443 上监听 https。

特使文档中有一个示例。

所以它是这样的:

LB-IP:443 -> CLUSTER-IP:443 -> istio-ingressgateway:443 -> envoy-sidecar:8443
LB-IP:80 -> CLUSTER-IP:80 -> istio-ingressgateway:80 -> envoy-sidecar:8080

例如,对于 http,如果您在未配置任何网关的情况下使用 netstat 检查 ingress-gateway pod,则端口 8080 上没有任何监听:

kubectl exec -ti istio-ingressgateway-86f88b6f6-r8mjt -n istio-system -c istio-proxy -- /bin/bash
istio-proxy@istio-ingressgateway-86f88b6f6-r8mjt:/$ netstat -lnt | grep 8080

现在让我们使用下面的 yaml 创建一个 http 网关。

apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: istio-gw
  namespace: istio-system
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*"

并再次检查 netstat:

kubectl exec -ti istio-ingressgateway-86f88b6f6-r8mjt -n istio-system -c istio-proxy -- /bin/bash
istio-proxy@istio-ingressgateway-86f88b6f6-r8mjt:/$ netstat -lnt | grep 8080
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN

如您所见,我们在端口 80 上配置了网关,但在 ingressgateway 内部,我们可以看到它正在侦听端口 8080。


推荐阅读