1

我在 Google Cloud Kubernetes Engine 集群上设置了 StatefulSet、带有 NEG 的服务和 Ingress。

每个工作负载和网络对象都准备就绪且运行良好。创建入口并更新所有服务的 NEG 状态。为集群启用了 VPC-native (Alias-IP) 和 HTTP 负载均衡器选项。

但是,当我尝试使用 Ingress 中指定的路径访问我的应用程序时,我总是会收到 502 (Bad Gateway) 错误。

这是我的配置(名称已编辑,包括图像名称):

apiVersion: v1
kind: Service
metadata:
  annotations:
    cloud.google.com/neg: '{"ingress": true}'
  labels:
    app: myapp
  name: myapp
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: tcp
  selector:
    app: myapp
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  labels:
    app: myapp
  name: myapp
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myapp
  serviceName: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        livenessProbe:
          httpGet:
            path: /
            port: tcp
            scheme: HTTP
          initialDelaySeconds: 60
        image: myapp:8bebbaf
        ports:
        - containerPort: 1880
          name: tcp
          protocol: TCP
        readinessProbe:
          failureThreshold: 1
          httpGet:
            path: /
            port: tcp
            scheme: HTTP
        volumeMounts:
        - mountPath: /data
          name: data
      securityContext:
        fsGroup: 1000
      terminationGracePeriodSeconds: 10
  volumeClaimTemplates:
  - metadata:
      labels:
        app: myapp
      name: data
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 1Gi
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: myapp-ingress
spec:
  rules:
  - http:
      paths:
      - path: /workflow
        backend:
          serviceName: myapp
          servicePort: 80

它有什么问题,我该如何解决?

4

1 回答 1

2

经过大量的挖掘和测试,我终于发现了问题所在。此外,GKE NEG Ingress 似乎不是很稳定(实际上 NEG 处于测试阶段)并且并不总是符合 Kubernetes 规范。

GKE Ingress存在与targetPort字段中的命名端口相关的问题。该修复程序已实施并可从1.16.0-gke.20集群版本 ( Release ) 获得,该版本截至今天(2020 年 2 月)可在 Rapid Channel 下获得,但我尚未测试该修复程序,因为我在入口处遇到了其他问题此频道的版本。

因此,如果您遇到相同的问题,基本上有两种选择:

  1. targetPort在服务的字段中指定确切的端口号而不是端口名称。这是我的示例中的固定服务配置文件:

    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        cloud.google.com/neg: '{"ingress": true}'
      labels:
        app: myapp
      name: myapp
    spec:
      ports:
      - port: 80
        protocol: TCP
        # !!!
        # targetPort: tcp
        targetPort: 1088
      selector:
        app: myapp
    
  2. 将 GKE 集群升级到 1.16.0-gke.20+ 版本(自己没有测试过)。

于 2020-02-29T20:37:04.723 回答