Kubernetes GKE:pods 运行,但入口仍然显示 "unhealthy";使用 TCP liveness/readiness、ssl 端口 443 但入口报告 80?

Kubernetes GKE: pods running, but ingress still says "unhealthy"; using TCP liveness/readiness, ssl port 443 but ingress reports 80?

我正在继续尝试启动这个 GKE https 负载均衡器,但还有一个致命问题:我的 pods 看起来很健康(不要报告 [=37= 的任何问题]) 但入口仍然显示不健康...而且服务在端口 443 上并且入口继续报告端口 80。

我正在使用 TCP 套接字连接进行 liveness/readiness 探测,因为这是应用程序设置的目的。这是 TCP JSON-returning 的东西,不是 HTTP 协议。

更新:我使用 NGINX 将第二个容器添加到 pod 并将 liveness/readiness 探测器移到那里:没有区别。

这是所有部署:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: cleardev-deployment
  labels:
    app: clearspring
spec:
  replicas: 2
  selector:
    matchLabels:
      app: clearspring
  template:
    metadata:
      labels:
        app: clearspring
    spec:
      containers:
      - name: clearspring
        image: gcr.io/clearspring-dev/cleardev2:49477e1
        ports:
        - containerPort: 8080
        readinessProbe:
          tcpSocket:
            port: 8080
          successThreshold: 1
          failureThreshold: 5
          initialDelaySeconds: 5
          periodSeconds: 10
        livenessProbe:
          tcpSocket:
            port: 8080
          successThreshold: 1
          failureThreshold: 5
          initialDelaySeconds: 15
          periodSeconds: 20

和服务:

apiVersion: v1
kind: Service
metadata:
  name: clearspring-service443
spec:
  type: NodePort
  selector:
    app: clearspring
  ports:
    - name: https
      protocol: TCP
      port: 443
      targetPort: 8080

证书:

apiVersion: networking.gke.io/v1
kind: ManagedCertificate
metadata:
  name: clearspring-cert
spec:
  domains:
    - api.clearspringinsurance.com

入口:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: clearspring-ingress
  annotations:
    # If the class annotation is not specified it defaults to "gce".
    kubernetes.io/ingress.global-static-ip-name: "kubething"
    networking.gke.io/managed-certificates: clearspring-cert
    kubernetes.io/ingress.class: "gce"
spec:
  defaultBackend:
    service:
      name: clearspring-service443
      port:
        name: https

我想到的一个解决方法是向 pod 添加第二个容器,如 nginx,这将 return http 200 响应毫无问题。

还有其他想法吗?非常感谢任何建议!

有几个问题,但最基本的是 liveness/readiness 个探针。

据我所知,它们支持 TCP 连接,尽管文档中说它们支持。

我的项目的好消息是它基于 Flask,毕竟它是 http。所以我只需要向 Flask 应用程序添加一个路由 '/healthz'(然后在我收到 405 个错误后修复它,因为我把它写成 POST 而不是 GET第一次)。

另一个非常奇怪的事情是从 pods 获取日志的语法......如果你只是给

kubectl logs -p  podname -n seven

您收到错误消息“上一个 pod 不存在”。

如果改为添加此标志:

kubectl logs -p  podname -n seven --previous=false

然后显示我正在寻找的日志。

(设计这个的Kubernetes极客:你欠我一杯茶!)

其他细微差别:

  • kubernetes-minions-all 上的防火墙设置阻塞太多,所以我不得不将其更改为 'allow all'

  • 当集群被删除时,静态 IP 不会被标记回 RESERVED 而是保持 IN USE 所以如果您只是使用相同的静态 IP 恢复集群,入口将失败...

我想就是这样了...sheesh!