web-dev-qa-db-fra.com

Comment obtenir un chemin de contrôle de santé personnalisé dans un équilibreur GCE L7 desservant une entrée Kubernetes?

J'essaie de déployer une instance de grafana dans Kubernetes (serveur 1.6.4) dans GCE. J'utilise les manifestes suivants:

Déploiement ( version complète ):

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: grafana
spec:
  replicas: 1
  template:
    metadata:
      labels:
        name: grafana
    spec:
      initContainers:
        …                                
      containers:
        - name: grafana
          image: grafana/grafana
          readinessProbe:
            httpGet:
              path: /login
              port: 3000
          …

Service :

apiVersion: v1
kind: Service
metadata:
  name: grafana
spec:
  selector:
    name: grafana
  ports:
    - protocol: TCP
      port: 3000
  type: NodePort

Entrée :

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: grafana
spec:
  tls:
    - secretName: grafana.example.com
  backend:
    serviceName: grafana
    servicePort: 3000

Il se trouve que grafana sert un 302 sur / mais le contrôle de santé d'entrée par défaut de GCE attend 200 sur / ( source ). Comme vous pouvez le voir, il existe un readinessProbe personnalisé dans Déploiement (ligne 22).

Une fois que j'ai posté ces ressources sur le kube-apiserver, tout est créé sans erreur. Concrètement, le Ingress obtient une adresse ip4 publique mais le healtcheck est configuré avec la valeur par défaut / chemin d'accès au lieu de celui personnalisé configuré dans le readinessProbe. Pour cette raison, j'obtiens un 502 si je curl l'adresse IP4 publique de l'entrée.

Le problème peut être résolu en modifiant manuellement le chemin d'accès de la sonde sur /login dans la console GCE.

15
mmoya

Citant de ici :

Le GLBC requiert que vous définissiez le port (dans votre cas 3000) dans la spécification du pod.

La solution consiste à déclarer le port utilisé pour le contrôle de santé dans ports en plus d'ajouter un readinessProbe personnalisé:

containers:
  - name: grafana
    readinessProbe:
      httpGet:
        path: /login
        port: 3000
    ports:
      - name: grafana
        containerPort: 3000
    …
10
mmoya

Personnalisation des bilans de santé

Avec l'addon GLBC

Ce n'est pas tout à fait clair à partir de votre question, mais si vous utilisez GCE Load-Balancer Controller (GLBC) Cluster Addon , vous pouvez personnaliser le chemin du bilan de santé .

Actuellement, tous les backends de service doivent satisfaire à l'une des exigences suivantes pour réussir les vérifications de l'état HTTP (S) qui lui sont envoyées par l'équilibreur de charge GCE:

  • Répondez avec un 200 sur '/'. Le contenu n'a pas d'importance.
  • Exposer une URL arbitraire en tant que sonde de disponibilité sur les pods soutenant le service.

Le contrôleur Ingress recherche d'abord une sonde de disponibilité compatible, s'il en trouve une, il l'adopte comme contrôle de santé HTTP (S) de l'équilibreur de charge GCE. S'il n'y a pas de sonde de disponibilité, ou si la sonde de préparation nécessite des en-têtes HTTP spéciaux, le contrôleur Ingress pointe le contrôle de santé HTTP de l'équilibreur de charge GCE sur '/'. Ceci est un exemple d'une entrée qui adopte la sonde de préparation des points de terminaison comme test de santé.

La page du module complémentaire GLBC le mentionne dans le section Limitations:

Tous les services Kubernetes doivent servir un 200 page sur '/', ou toute autre valeur personnalisée que vous avez spécifiée via le GLBC --health-check-path argument.

Sans addon GLBC

Si vous n'utilisez pas l'addon, actuellement Kubernetes vous oblige à servir 200 pour GET requêtes sur / chemin pour des contrôles d'intégrité réussis, sinon le backend n'obtiendra aucun trafic.

Il y a un peu de contexte à ce sujet dans ce bug .

Google Container Engine (GKE)

Si vous utilisez Google Container Engine (GKE), les mêmes exigences par défaut de Kubernetes pour les contrôles de santé s'appliquent là aussi .

Les services exposés via une entrée doivent répondre avec HTTP 200 état des demandes GET sur / chemin. Ceci est utilisé pour le contrôle de santé. Si votre application ne sert pas HTTP 200 sur /, le backend sera marqué comme malsain et n'obtiendra pas de trafic.

Répondre à votre vrai problème

Cela dit, comme vous (@mmoya) le signalez dans votre réponse, l'ajout du même port qui est utilisé pour la sonde de préparation car l'un des ports du pod résout le problème pour votre cas car le port lui-même n'est pas exposé à l'extérieur le pod autrement. Cela a amené Kubernetes à se fier au bilan de santé de / au lieu.

6
Tuxdude