web-dev-qa-db-fra.com

Comment accéder à ce service Kubernetes via un proxy Kubectl?

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 ?

grafana-service.yaml

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

grafana-deployment.yaml

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.

7
aknuds1

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.

3
aknuds1

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/

7
Stefan R

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? 

1
oe18

Quelques facteurs peuvent être à l'origine de ce problème. 

  1. 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. 

  2. 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. 

0
Michael Elder