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.
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
…
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.
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 .
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 demandesGET
sur/
chemin. Ceci est utilisé pour le contrôle de santé. Si votre application ne sert pasHTTP 200
sur/
, le backend sera marqué comme malsain et n'obtiendra pas de trafic.
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.