Kubernetes + Istio 入口网关端口

Kubernetes + Istio Ingress Gateway port

我在 kubernetes pod 中有一个应用程序 运行(在我的本地 docker 桌面上,启用了 kubernetes),侦听端口 8080。然后我有以下 kubernetes 配置

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: myrelease-foobar-app-gw
  namespace: default
spec:
  selector:
    istio: ingressgateway
  servers:
    - port:
        number: 443
        name: https
        protocol: HTTPS
      tls:
        mode: SIMPLE
        credentialName: default-foobar-local-credential
      hosts:
        - test.foobar.local
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: myrelease-foobar-app-vs
  namespace: default
spec:
  hosts:
    - test.foobar.local
  gateways:
    - myrelease-foobar-app-gw
  http:
    - match:
        - port: 443
      route:
        - destination:
            host: myrelease-foobar-app.default.svc.cluster.local
            subset: foobarAppDestination
            port:
              number: 8081
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: myrelease-foobar-app-destrule
  namespace: default
spec:
  host: myrelease-foobar-app.default.svc.cluster.local
  subsets:
    - name: foobarAppDestination
      labels:
        app.kubernetes.io/instance: myrelease
        app.kubernetes.io/name: foobar-app
---
apiVersion: v1
kind: Service
metadata:
  name: myrelease-foobar-app
  namespace: default
  labels:
    helm.sh/chart: foobar-app-0.1.0
    app.kubernetes.io/name: foobar-app
    app.kubernetes.io/instance: myrelease
    app.kubernetes.io/version: "1.0.0"
    app.kubernetes.io/managed-by: Helm
spec:
  type: ClusterIP
  ports:
    - port: 8081
      targetPort: 8080
      protocol: TCP
      name: http
  selector:
    app.kubernetes.io/name: foobar-app
    app.kubernetes.io/instance: myrelease     

这很好用。但我想将该端口 443 更改为其他端口,比如 8443(因为我将有多个网关)。当我有这个时,我无法再访问该应用程序。我缺少某些配置吗?我猜我也需要将 Istio 配置为接受端口 8443 吗?我使用以下命令安装了 istio:

istioctl install --set profile=default -y

编辑: 我读了更多的书 (https://www.dangtrinh.com/2019/09/how-to-open-custom-port-on-istio.html),并且做了以下内容:

  1. kubectl -n istio-system 获取服务 istio-ingressgateway -o yaml > istio_ingressgateway.yaml
  2. 编辑 istio_ingressgateway.yaml,并添加以下内容:
     - name: foobarhttps
       nodePort: 32700
       port: 445
       protocol: TCP
       targetPort: 8445
    
  3. kubectl apply -f istio_ingressgateway.yaml
  4. 上面我的网关内的变化:
     - port:
         number: 445
         name: foobarhttps
         protocol: HTTPS
    
  5. 在上面的 VirtualService 中进行更改:
     http:
     - match:
         - port: 445
    

但我仍然无法从我的浏览器访问它(https://foobar.test.local:445)

我想该端口必须映射到 Istio Ingress Gateway 上。因此,如果您想使用自定义端口,则可能需要对其进行自定义。

不过一般情况下多个Gateway使用同一个端口应该问题不大,不会造成冲突。因此,对于该用例,没有必要这样做。

已修复。我在上面的编辑中做错的是:

- name: foobarhttps
   nodePort: 32700
   port: 445
   protocol: TCP
   targetPort: 8443

(注意targetPort还是8443)。我猜有一个 istio 组件在端口 8443 上监听,它处理所有这些 https 的东西。感谢 user140547 的帮助!