我将其从HTTP更改为TCP后,GCloud中GKE中的健康检查会重置

时间:2019-03-21 15:21:22

标签: kubernetes google-cloud-platform

我正在Kubernetes集群上工作,在那里我将服务从GCloud Ingress定向到我的服务。其中一个服务端点未通过运行状况检查(如HTTP),但将其作为TCP传递。

当我将GCloud中的运行状况检查选项更改为TCP时,运行状况检查通过,并且我的端点正常工作,但是几分钟后,GCloud上的运行状况检查将该端口重置为HTTP,运行状况检查再次失败,在端点上给了我502响应。

我不知道这是Google Cloud内部的错误还是Kubernetes中我做错的事情。我在这里粘贴了我的YAML配置:

命名空间

apiVersion: v1
kind: Namespace
metadata:
  name: parity
  labels:
    name: parity

存储类

apiVersion: storage.k8s.io/v1
metadata:
  name: classic-ssd
  namespace: parity
provisioner: kubernetes.io/gce-pd
parameters:
  type: pd-ssd
  zones: us-central1-a
reclaimPolicy: Retain

秘密

apiVersion: v1
kind: Secret
metadata:
    name: tls-secret 
    namespace: ingress-nginx 
data:
    tls.crt: ./config/redacted.crt
    tls.key: ./config/redacted.key

状态集

apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
  name: parity
  namespace: parity
  labels:
    app: parity
spec:
  replicas: 3 
  selector:
    matchLabels:
      app: parity
  serviceName: parity
  template:
    metadata:
      name: parity
      labels:
        app: parity
    spec:
      containers:
        - name: parity
          image: "etccoop/parity:latest"
          imagePullPolicy: Always
          args:
          - "--chain=classic"
          - "--jsonrpc-port=8545"
          - "--jsonrpc-interface=0.0.0.0"
          - "--jsonrpc-apis=web3,eth,net"
          - "--jsonrpc-hosts=all"
          ports:
            - containerPort: 8545
              protocol: TCP
              name: rpc-port
            - containerPort: 443
              protocol: TCP
              name: https
          readinessProbe:
            tcpSocket:
              port: 8545
            initialDelaySeconds: 650
          livenessProbe:
            tcpSocket:
              port: 8545
            initialDelaySeconds: 650
          volumeMounts:
            - name: parity-config
              mountPath: /parity-config
              readOnly: true
            - name: parity-data
              mountPath: /parity-data
      volumes:
      - name: parity-config
        secret:
          secretName: parity-config
  volumeClaimTemplates:
    - metadata:
        name: parity-data
      spec:
        accessModes: ["ReadWriteOnce"]
        storageClassName: "classic-ssd"
        resources:
          requests:
            storage: 50Gi

服务

apiVersion: v1
kind: Service
metadata:
  labels:
    app: parity
  name: parity
  namespace: parity
  annotations:
    cloud.google.com/app-protocols: '{"my-https-port":"HTTPS","my-http-port":"HTTP"}'
spec:
  selector:
    app: parity
  ports:
  - name: default
    protocol: TCP
    port: 80
    targetPort: 80
  - name: rpc-endpoint
    port: 8545
    protocol: TCP
    targetPort: 8545
  - name: https
    port: 443
    protocol: TCP
    targetPort: 443
  type: LoadBalancer

入口

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
    name: ingress-parity
    namespace: parity
    annotations:
        #nginx.ingress.kubernetes.io/rewrite-target: /
        kubernetes.io/ingress.global-static-ip-name: cluster-1
spec:
    tls:
      secretName: tls-classic
      hosts:
        - www.redacted.com
    rules:
    - host: www.redacted.com
      http:
        paths:
        - path: /
          backend:
            serviceName: web
            servicePort: 8080
        - path: /rpc
          backend:
            serviceName: parity 
            servicePort: 8545

问题

我已经编辑了主机名等,但这是我的基本配置。我还在以下文档中运行了此文档的hello-app容器进行调试:https://cloud.google.com/kubernetes-engine/docs/tutorials/hello-app

/服务的入口端点在hello-app上指向端口8080。效果很好,这不是问题,但此处仅作澄清。

因此,这里的问题是,在Google Cloud上使用GKE和入口LoadBalancer创建了集群(入口文件中的cluster-1全局静态ip名称)之后,在文件中创建了Kubernetes配置上面的代码,当我转到Google Compute Engine->运行状况检查-> /rpc端点的特定运行状况检查时,Google Cloud上/rpc端点的运行状况检查失败。

当我将运行状况检查编辑为不使用HTTP协议而不使用TCP协议时,运行状况检查通过了/rpc端点,我可以将其卷曲起来,然后返回正确的响应。 / p>

问题在于,几分钟后,即使我将其编辑为TCP,相同的Health-Check仍返回到HTTP协议,然后运行状况检查失败并且再次卷曲它时得到502响应

我不确定在kubernetes中创建Ingress之前是否可以将Google Cloud Health Check配置附加到我的Kubernetes Ingress。也不确定为什么要重置它,无法确定这是Google Cloud上的错误还是Kubernetes中我做错的事情。如果您注意到在我的statefulset部署中,我已指定livenessProbereadinessProbe使用TCP来检查端口8545。

650秒的延迟是由于此票务问题而导致的,该问题通过将延迟增加至大于600秒(以避免提及的比赛条件)解决:https://github.com/kubernetes/ingress-gce/issues/34

我真的不确定为什么将Google Cloud运行状况检查指定为TCP后会重置为HTTP。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

我找到了一个解决方案,其中在/ healthz端点上的有状态集上添加了用于运行状况检查的新容器,并配置了入口的运行状况检查,以检查kubernetes分配的8080端口上的端点是否为HTTP运行状况类型-check,使其正常工作。

在TCP重置时为什么会发生重置并不清楚。