<p>I am running a cluster on Google Kubernetes Engine and I am currently trying to switch from using an Ingress with external load balancing (and NodePort services) to an ingress with container-native load balancing (and ClusterIP services) following this documentation: <a href="https://cloud.google.com/kubernetes-engine/docs/how-to/container-native-load-balancing" rel="noreferrer">Container native load balancing</a></p>
<p>To communicate with my services I am using the following ingress configuration that used to work just fine when using NodePort services instead of ClusterIP:</p>
<pre><code>apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: mw-ingress
  annotations:
    kubernetes.io/ingress.global-static-ip-name: mw-cluster-ip
    networking.gke.io/managed-certificates: mw-certificate
    kubernetes.io/ingress.allow-http: &quot;false&quot;
spec:
  rules:
    - http:
        paths:
          - path: /*
            backend:
              serviceName: billing-frontend-service
              servicePort: 80
          - path: /auth/api/*
            backend:
              serviceName: auth-service
              servicePort: 8083
</code></pre>
<p>Now following the documentation, instead of using a readinessProbe as a part of the container deployment as a health check I switched to using ClusterIP services in combination with BackendConfig instead. For each deployment I am using a service like this:</p>
<pre><code>apiVersion: v1
kind: Service
metadata:
  labels:
    app: auth
  name: auth-service
  namespace: default
  annotations:
    cloud.google.com/backend-config: '{&quot;default&quot;: &quot;auth-hc-config&quot;}'
spec:
  type: ClusterIP
  selector:
    app: auth
  ports:
    - port: 8083
      protocol: TCP
      targetPort: 8083
</code></pre>
<p>And a Backend config:</p>
<pre><code>apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
  name: auth-hc-config
spec:
  healthCheck:
    checkIntervalSec: 10
    port: 8083
    type: http
    requestPath: /auth/health
</code></pre>
<p>As a reference, this is what the readinessProbe used to look like before:</p>
<pre><code>          readinessProbe:
            failureThreshold: 3
            httpGet:
              path: /auth/health
              port: 8083
              scheme: HTTP
            periodSeconds: 10
</code></pre>
<p>Now to the actual problem. I deploy the containers and services first and they seem to startup just fine. The ingress however does not seem to pick up the health checks properly and shows this in the Cloud console:</p>
<pre><code>Error during sync: error running backend syncing routine: error ensuring health check: googleapi: Error 400: Invalid value for field 'resource.httpHealthCheck': ''. HTTP healthCheck missing., invalid
</code></pre>
<p>The cluster as well as the node pool are running GKE version 1.17.6-gke.11 so the annotation <code>cloud.google.com/neg: '{&quot;ingress&quot;: true}'</code> is not necessary. I have checked and the service is annotated correctly:</p>
<pre><code>Annotations:       cloud.google.com/backend-config: {&quot;default&quot;: &quot;auth-hc-config&quot;}
                   cloud.google.com/neg: {&quot;ingress&quot;:true}
                   cloud.google.com/neg-status: {&quot;network_endpoint_groups&quot;:{&quot;8083&quot;:&quot;k8s1-2078beeb-default-auth-service-8083-16a14039&quot;},&quot;zones&quot;:[&quot;europe-west3-b&quot;]}

</code></pre>
<p>I have already tried to re-create the cluster and the node-pool with no effect. Any ideas on how to resolve this? Am I missing an additional health check somewhere?
<a href="https://i.stack.imgur.com/aoA3S.png" rel="noreferrer"><img src="https://i.stack.imgur.com/aoA3S.png" alt="Cloud console" /></a></p>

<p>I found my issue. Apparently the BackendConfig's <code>type</code> attribute is case-sensitive. Once I changed it from <code>http</code> to <code>HTTP</code> it worked after I recreated the ingress.</p>
