GCE入口健康检查在kubernetes上失败

时间:2018-09-30 07:39:42

标签: google-cloud-platform kubernetes-ingress google-kubernetes-engine

我正在尝试在kubernetes上运行一个比特币节点。我的有状态集合如下:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: bitcoin-stateful
  namespace: dev
spec:
  serviceName: bitcoinrpc-dev-service
  replicas: 1
  selector:
    matchLabels:
      app: bitcoin-node
  template:
    metadata:
      labels:
        app: bitcoin-node
    spec:
      containers:
      - name: bitcoin-node-mainnet
        image: myimage:v0.13.2-addrindex
        imagePullPolicy: Always
        ports:
        - containerPort: 8332 
        volumeMounts:
        - name: bitcoin-chaindata
          mountPath: /root/.bitcoin
        livenessProbe:
          exec:
            command:
            -  bitcoin-cli
            -  getinfo
          initialDelaySeconds: 60 #wait this period after staring fist time
          periodSeconds: 15  # polling interval
          timeoutSeconds: 15    # wish to receive response within this time period
        readinessProbe: 
          exec:
            command:
            -  bitcoin-cli
            -  getinfo
          initialDelaySeconds: 60 #wait this period after staring fist time
          periodSeconds: 15    # polling interval
          timeoutSeconds: 15    # wish to receive response within this time period
        command: ["/bin/bash"]
        args: ["-c","service ntp start && \
                    bitcoind -printtoconsole -conf=/root/.bitcoin/bitcoin.conf -reindex-chainstate -datadir=/root/.bitcoin/ -daemon=0 -bind=0.0.0.0"]

由于比特币节点不支持任何http get请求,而只能满足发布请求,因此我尝试对bitcoin-cliliveness使用readiness probe命令

我的服务如下:

kind: Service
apiVersion: v1
metadata:
  name: bitcoinrpc-dev-service
  namespace: dev
spec:
  selector:
    app: bitcoin-node
  ports:
  - name: mainnet
    protocol: TCP
    port: 80
    targetPort: 8332

当我描述豆荚时,它们运行正常,所有运行状况检查似乎都正常。

但是,我还使用具有以下配置的入口控制器:

kind: Ingress
apiVersion: extensions/v1beta1
metadata:
  name: dev-ingress
  namespace: dev
  annotations:
    kubernetes.io/ingress.class: "gce"
    kubernetes.io/ingress.global-static-ip-name: "dev-ingress"
spec:
  rules:
        - host: bitcoin.something.net
      http:
        paths:
        - path: /rpc
          backend:
            serviceName: bitcoinrpc-dev-service
            servicePort: 80

L7负载平衡器的运行状况检查似乎失败。这些测试将通过以下方式自动配置。

enter image description here

但是,这些测试与“就绪”探针中配置的测试不同。我尝试删除入口并重新创建,但是它的行为仍然相同。

我有以下问题:

1. Should I modify/delete this health check manually?
2. Even if the health check is failing (wrongly configured), since the containers and ingress are up, does it mean that I should be able to access the service through http?

2 个答案:

答案 0 :(得分:0)

缺少的是,您正在以exec命令的形式执行活动性和就绪性探针,因此您需要创建一个包含Exec准备性探针的Pod,以及一个其他包含Exec准备性探针的Pod,HereHere的描述方法。

另一件事是通过所需的GCE L7负载平衡器控制器接收流量: 至少1个Kubernetes NodePort Service(这是Ingress的端点),因此您的服务配置不正确。因此,您将无法访问该服务。

默认后端(MIG在其中使用它来检查节点的运行状况)中的运行状况检查(图中)表示节点的运行状况检查不是容器。

答案 1 :(得分:0)

  1. 不,您不必删除运行状况检查,因为即使您删除它,它也会自动创建。
  2. 不,在健康检查通过之前您将无法访问这些服务,因为 gke 的流量是使用 NEG 传递的,NEG 依赖于健康检查来了解流量可以路由到哪里。

一种可能的解决方案是,您需要向返回 200 的应用程序添加一个基本的 http 路由器,这可以用作运行状况检查端点。

其他可能的选项包括:

  1. 创建 NodePort 类型的服务并使用 LoadBalancer 将给定端口上的流量路由到节点池/实例组作为后端服务,而不是使用 NEG
  2. 创建 LoadBalancer 类型的服务。此步骤最简单,但您需要确保使用最佳安全策略(如 IAP、防火墙规则等)保护负载平衡器 IP。