当前位置: 首页 > 知识库问答 >
问题:

Kubernetes GKE:豆荚在跑,但ingress仍然说“不健康”;使用TCP活跃度/就绪度,ssl端口443,但入口报告80?

伍光济
2023-03-14

我使用TCP套接字连接进行活动性/就绪性探测,因为应用程序就是这样设置的。这是一个TCP JSON返回的东西,而不是HTTP协议。

更新:我用NGINX在pod中添加了第二个容器,并将活性/就绪性探针移到了那里:没有区别。

以下是所有部署:

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,它将毫无问题地返回http 200响应。

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

共有1个答案

裘嘉木
2023-03-14

有几个问题,但最基本的是活性/准备性探测。

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

对我的项目来说,好消息是它基于Flask,毕竟是http。所以我只需要在Flask应用程序中添加一个路由“/healthz”(然后在我得到405个错误后修复它,因为我把它作为POST,而不是第一次得到)。

另一件非常奇怪的事情是从pod中获取日志的语法。。。如果你只是给

kubectl logs -p  podname -n seven

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

如果您添加此标志:

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

然后显示了我要找的日志。

(设计这个的库伯内特斯怪胎:你欠我一杯茶!)

其他细微差别:

>

  • kubernetes仆从的防火墙设置阻塞太多,所以我不得不将其更改为“允许所有”

    当集群被删除时,静态IP不会被标记回保留,但会继续使用,因此如果您只是使用相同的静态IP将集群恢复,则入口将失败。。。

    我想就是这样。。。嘘!

  •  类似资料:
    • 我可以找到文件,其中提到我如何添加我的自定义探针和改变探针参数,如初始延迟等,但不能找到默认的探针方法使用的K8S。

    • 对于liveness,我认为它可能会开始循环使用POD/容器,尽管(在DB关闭的情况下)它可能无法修复任何东西。 准备就绪后,我想如果数据库关闭,可能会导致可用应用程序池为0。如果数据库关闭,应用程序本身很可能不会很有用,但我想部分可能仍然可以工作。 对于这种类型的事情,有推荐的最佳实践吗?

    • 问题内容: 我遵循了负载均衡器教程:https : //cloud.google.com/container- engine/docs/tutorials/http-balancer 在使用Nginx映像时,当尝试使用自己的应用程序映像时,它工作正常后端切换为不正常。 我的应用程序重定向到/(返回302),但在pod定义中添加了一个: 我的入口看起来像: 服务配置为: 后端健康状况如下: 入口的规

    • 我遵循了负载均衡器教程:https://cloud.google.com/container-engine/docs/tutorials/http-balancer当我使用Nginx映像时工作正常,当我尝试使用我自己的应用程序映像时,尽管后端切换到不健康。 我的应用程序重定向到/(返回302),但我在pod定义中添加了一个livenessProbe: 我的入口看起来像: 服务配置为: 入口中的后端

    • 给出一个Python应用程序,它在无限循环中轮询Kafka主题,并在处理接收到的Kafka消息后将结果上传到s3 bucket。 null 并且活性探测只检查轮询循环是否尚未退出。 严格来说,在准备调查中检查这样的事情是不好的做法吗?