Je souhaite accéder à mon service Grafana Kubernetes via le serveur proxy kubectl , mais pour une raison quelconque, cela ne fonctionnera pas, même si je peux le faire fonctionner pour d’autres services. Étant donné la définition de service ci-dessous, pourquoi n’est-il pas disponible sur http: // localhost: 8001/api/v1/proxy/espaces de nom/monitoring/services/grafana ?
apiVersion: v1
kind: Service
metadata:
namespace: monitoring
name: grafana
labels:
app: grafana
spec:
type: NodePort
ports:
- name: web
port: 3000
protocol: TCP
nodePort: 30902
selector:
app: grafana
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
namespace: monitoring
name: grafana
spec:
replicas: 1
template:
metadata:
labels:
app: grafana
spec:
containers:
- name: grafana
image: grafana/grafana:4.1.1
env:
- name: GF_AUTH_BASIC_ENABLED
value: "true"
- name: GF_AUTH_ANONYMOUS_ENABLED
value: "true"
- name: GF_SECURITY_ADMIN_USER
valueFrom:
secretKeyRef:
name: grafana-credentials
key: user
- name: GF_SECURITY_ADMIN_PASSWORD
valueFrom:
secretKeyRef:
name: grafana-credentials
key: password
volumeMounts:
- name: grafana-storage
mountPath: /var/grafana-storage
ports:
- name: web
containerPort: 3000
resources:
requests:
memory: 100Mi
cpu: 100m
limits:
memory: 200Mi
cpu: 200m
- name: grafana-watcher
image: quay.io/coreos/grafana-watcher:v0.0.5
args:
- '--watch-dir=/var/grafana-dashboards'
- '--grafana-url=http://localhost:3000'
env:
- name: GRAFANA_USER
valueFrom:
secretKeyRef:
name: grafana-credentials
key: user
- name: GRAFANA_PASSWORD
valueFrom:
secretKeyRef:
name: grafana-credentials
key: password
resources:
requests:
memory: "16Mi"
cpu: "50m"
limits:
memory: "32Mi"
cpu: "100m"
volumeMounts:
- name: grafana-dashboards
mountPath: /var/grafana-dashboards
volumes:
- name: grafana-storage
emptyDir: {}
- name: grafana-dashboards
configMap:
name: grafana-dashboards
L'erreur que je vois lors de l'accès à l'URL ci-dessus est "pas de points de terminaison disponibles pour le service" grafana "", code d'erreur 503.
Le problème est que le port de Grafana est nommé web et qu’il faut donc ajouter :web
à l’URL du proxy kubectl: http: // localhost: 8001/api/v1/proxy/namespaces/monitoring/services/grafana: web .
Une alternative consiste à ne pas nommer le port Grafana, car il n'est pas nécessaire d'ajouter :web
à l'URL du proxy kubectl pour le service: http: // localhost: 8001/api/v1/proxy/namespaces/monitoring/services/grafana: web . Je suis allé avec cette option à la fin car c'est plus facile.
Comme le dit Michael, il est fort possible que vos étiquettes ou vos espaces de noms ne correspondent pas. Cependant, gardez à l'esprit que même lorsque vous corrigez le point de terminaison, l'URL que vous recherchez ( http: // localhost: 8001/api/v1/proxy/noms-espaces/monitoring/services/grafana ) pourrait ne pas fonctionner correctement.
En fonction de vos paramètres de configuration root_url et/ou static_root_path grafana, lorsque vous essayez de vous connecter, vous pouvez demander à grafana d'essayer de POST sur http: // localhost: 8001/login et d'obtenir un 404.
Essayez plutôt d’utiliser kubectl port-forward:
kubectl -n monitoring port-forward [grafana-pod-name] 3000
puis accédez à grafana via http: // localhost: 3000/
https://kubernetes.io/docs/tasks/access-application-cluster/port-forward-access-application-cluster/
Votre déploiement peut ne pas avoir une application d'étiquette: grafana, ou être dans un autre espace de noms. Pourriez-vous également publier la définition de déploiement?
Quelques facteurs peuvent être à l'origine de ce problème.
Le service s'attend à trouver un ou plusieurs systèmes d'extrémité pris en charge, qu'il découvre via des règles de correspondance sur les étiquettes. Si les étiquettes ne sont pas alignées, le service ne trouvera pas de points de terminaison et la fonction de passerelle réseau remplie par le service donnera 503.
Le port déclaré par le POD et le processus contenu dans le conteneur ne sont pas alignés sur le --target-port
attendu par le service.
L'un ou l'autre de ceux-ci peut générer l'erreur. Regardons de plus près.
D'abord, kubectl describe
le service:
$ kubectl describe svc grafana01-grafana-3000
Name: grafana01-grafana-3000
Namespace: default
Labels: app=grafana01-grafana
chart=grafana-0.3.7
component=grafana
heritage=Tiller
release=grafana01
Annotations: <none>
Selector: app=grafana01-grafana,component=grafana,release=grafana01
Type: NodePort
IP: 10.0.0.197
Port: <unset> 3000/TCP
NodePort: <unset> 30905/TCP
Endpoints: 10.1.45.69:3000
Session Affinity: None
Events: <none>
Notez que mon service grafana a 1 noeud final répertorié (il peut y en avoir plusieurs). L'erreur ci-dessus dans votre exemple indique que les points de terminaison ne sont pas répertoriés ici.
Endpoints: 10.1.45.69:3000
Regardons maintenant les sélecteurs. Dans l'exemple ci-dessus, vous pouvez voir que j'ai 3 étiquettes de sélecteur sur mon service:
Selector: app=grafana01-grafana,component=grafana,release=grafana01
Je vais kubectl describe
mes pods ensuite:
$ kubectl describe pod grafana
Name: grafana01-grafana-1843344063-vp30d
Namespace: default
Node: 10.10.25.220/10.10.25.220
Start Time: Fri, 14 Jul 2017 03:25:11 +0000
Labels: app=grafana01-grafana
component=grafana
pod-template-hash=1843344063
release=grafana01
...
Notez que les étiquettes de la pod
s'alignent correctement. Par conséquent, mon service trouve pods
qui fournit endpoints
qui est contrebalancé par la charge de la service
. Vérifiez que cette partie de la chaîne n'est pas endommagée dans votre environnement.
Si vous constatez que les étiquettes sont correctes, il est possible que vous soyez toujours déconnecté du fait que le processus grafana exécuté dans la variable container
de la variable pod
s'exécute sur un port différent de celui auquel vous vous attendez.
$ kubectl describe pod grafana
Name: grafana01-grafana-1843344063-vp30d
...
Containers:
grafana:
Container ID: docker://69f11b7828c01c5c3b395c008d88e8640c5606f4d865107bf4b433628cc36c76
Image: grafana/grafana:latest
Image ID: docker-pullable://grafana/grafana@sha256:11690015c430f2b08955e28c0e8ce7ce1c5883edfc521b68f3fb288e85578d26
Port: 3000/TCP
State: Running
Started: Fri, 14 Jul 2017 03:25:26 +0000
Si, pour une raison quelconque, votre port
sous le conteneur indiquait une valeur différente, le service équilibrait effectivement la charge par rapport à un point de terminaison non valide.
Par exemple, si le port 80 est répertorié: Port: 80/TCP Ou était une valeur vide Port:
Ensuite, même si vos sélecteurs d'étiquettes étaient corrects, le service ne trouverait jamais de réponse valide du pod et supprimerait le noeud final de la rotation.
Je soupçonne que votre problème est le premier problème ci-dessus (sélecteurs d’étiquettes incompatibles).
Si les sélecteurs d'étiquettes et les ports s'alignent, vous pouvez avoir un problème avec le paramètre MTU entre les nœuds. Dans certains cas, si le MTU utilisé par votre couche réseau (tel que calico) est supérieur au MTU du réseau pris en charge, vous n'obtiendrez jamais une réponse valide du point de terminaison. Typiquement, ce dernier problème potentiel se présentera comme un délai d’attente plutôt que comme un 503.