web-dev-qa-db-fra.com

kubernetes backend d'entrée malsaine

J'ai suivi le didacticiel sur l'équilibreur de charge: https://cloud.google.com/container-engine/docs/tutorials/http-balancer qui fonctionne correctement lorsque j'utilise l'image Nginx, lorsque j'essaie et utiliser ma propre image d'application si le backend passe à malsain.

Mon application redirige sur/(renvoie un 302) mais j'ai ajouté un livenessProbe dans la définition du pod:

    livenessProbe:
      httpGet:
        path: /ping
        port: 4001
        httpHeaders:
          - name: X-health-check
            value: kubernetes-healthcheck
          - name: X-Forwarded-Proto
            value: https
          - name: Host
            value: foo.bar.com

Mon entrée ressemble à:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: foo
spec:
  backend:
    serviceName: foo
    servicePort: 80
  rules:
  - Host: foo.bar.com

La configuration du service est:

kind: Service
apiVersion: v1
metadata:
  name: foo
spec:
  type: NodePort
  selector:
    app: foo
  ports:
    - port: 80 
      targetPort: 4001

La santé du backend dans ingress describe ing ressemble à:

backends:       {"k8s-be-32180--5117658971cfc555":"UNHEALTHY"}

et les règles sur l'entrée ressemblent à:

Rules:
  Host  Path    Backends
  ----  ----    --------
  * *   foo:80 (10.0.0.7:4001,10.0.1.6:4001)

Tous les conseils ont été grandement reçus, j'ai essayé de résoudre ce problème pendant des heures sans succès.

Mise à jour

J'ai ajouté le readinessProbe à mon déploiement mais quelque chose semble toujours frapper/et l'entrée est toujours malsaine. Ma sonde ressemble à:

    readinessProbe:
      httpGet:
        path: /ping
        port: 4001
        httpHeaders:
          - name: X-health-check
            value: kubernetes-healthcheck
          - name: X-Forwarded-Proto
            value: https
          - name: Host
            value: foo.com

J'ai changé mon service pour:

kind: Service
apiVersion: v1
metadata:
  name: foo
spec:
  type: NodePort
  selector:
    app: foo
  ports:
    - port: 4001
      targetPort: 4001

Update2

Après avoir supprimé les en-têtes personnalisés du readinessProbe, il a commencé à fonctionner! Merci beaucoup.

19
Will Pink

Vous devez ajouter un readinessProbe (copiez simplement votre livenessProbe).

C'est expliqué dans le GCE L7 Ingress Docs .

Contrôles de santé

Actuellement, tous les backends de service doivent satisfaire à l'une des conditions suivantes pour réussir les vérifications de l'état HTTP qui lui sont envoyées par l'équilibreur de charge GCE: 1. Répondez par 200 sur "/". Le contenu n'a pas d'importance. 2. Exposez une URL arbitraire en tant que sonde de disponibilité sur les modules soutenant le service.

Assurez-vous également que readinessProbe pointe vers le même port que celui que vous exposez à Ingress. Dans votre cas, c'est bien puisque vous n'avez qu'un seul port, si vous en ajoutez un autre, vous risquez de rencontrer des problèmes.

34
tex

J'avais le même problème. A suivi le conseil de Tex mais a continué à voir ce message. Il s'est avéré que j'ai dû attendre quelques minutes avant d'entrer pour valider l'intégrité du service. Si quelqu'un va dans le même sens et fait toutes les étapes comme readinessProbe et linvenessProbe, assurez-vous simplement que votre entrée pointe vers un service qui est soit un NodePort, et attendez un quelques minutes avant que l'icône d'avertissement jaune ne devienne verte. Consultez également le journal sur StackDriver pour avoir une meilleure idée de ce qui se passe.

4
Mauricio