Как мне получить доступ к этой службе Kubernetes через прокси-сервер kubectl?

Я хочу получить доступ к моей службе Grafana Kubernetes через прокси-сервер kubectl, но по какой-то причине это не сработает, хотя я могу заставить его работать для других сервисов. Учитывая приведенное ниже определение службы, почему она недоступна на http://localhost:8001/api/v1/proxy/namespaces/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

Ошибка, которую я вижу при доступе к указанному выше URL: "нет доступных конечных точек для службы" grafana "", код ошибки 503.


person aknuds1    schedule 18.07.2017    source источник


Ответы (5)


Как говорит Майкл, вполне возможно, что ваши метки или пространства имен не совпадают. Однако в дополнение к этому имейте в виду, что даже когда вы исправляете конечную точку, URL-адрес, который вам нужен (http://localhost:8001/api/v1/proxy/namespaces/monitoring/services/grafana) может работать некорректно.

В зависимости от настроек конфигурации графаны root_url и / или static_root_path, при попытке входа в систему вы можете получить grafana, пытаясь выполнить POST на http://localhost:8001/login и получите 404.

Попробуйте вместо этого использовать kubectl port-forward:

kubectl -n monitoring port-forward [grafana-pod-name] 3000

затем получите доступ к графане через http://localhost:3000/

https://kubernetes.io/docs/tasks/access-application-cluster/port-forward-access-application-cluster/

person Stefan R    schedule 19.07.2017

В Kubernetes 1.10 URL-адрес прокси должен немного отличаться, например:

http://localhost:8080/api/v1/namespaces/default/services/SERVICE-NAME:PORT-NAME/proxy/ 

Ссылка: https://kubernetes.io/docs/tasks/access-application-cluster/access-cluster/#manually-constructing-apiserver-proxy-urls

person Shivam Mehrotra    schedule 11.12.2019

Проблема в том, что порт Grafana называется web, и в результате нужно добавить :web к URL-адресу прокси kubectl: http://localhost:8001/api/v1/proxy/namespaces/monitoring/services/grafana:web.

Альтернативный вариант - вместо этого не называть порт Grafana, потому что тогда вам не нужно добавлять :web к URL-адресу прокси kubectl для службы: http://localhost:8001/api/v1/proxy/пространстваимен/мониторинг/услуги/grafana:web. В конце концов, я выбрал этот вариант, так как он проще.

person aknuds1    schedule 22.08.2017
comment
Я не знаю почему, но я не могу заставить этот шаблон работать на AKS. Вместо этого я должен следовать этому шаблону (прокси в конце): localhost: 8001 / api / v1 / namespaces / ‹NAMESPACE› / services / - person Nicolas Albert; 18.12.2018
comment
Это связано с тем, что конечные точки службы обновляются kubernetes.io/docs/reference/generated/kubernetes-api/v1.14/ - person p_champ; 30.09.2019

Ваше развертывание может не иметь ярлыка app: grafana или находиться в другом пространстве имен. Не могли бы вы также опубликовать определение развертывания?

person rrh    schedule 18.07.2017
comment
Привет, извините, я так долго не отвечал вам, но сейчас я опубликовал манифест развертывания! Тем временем пришлось сосредоточиться на других вещах. - person aknuds1; 21.08.2017

Есть несколько факторов, которые могут вызвать эту проблему.

  1. Служба ожидает найти одну или несколько поддерживающих конечных точек, которые она обнаруживает с помощью правил сопоставления на этикетках. Если метки не совпадают, тогда служба не найдет конечные точки, и функция сетевого шлюза, выполняемая службой, приведет к 503.

  2. Порт, объявленный POD, и процесс в контейнере смещены от --target-port, ожидаемого службой.

Любой из них может вызвать ошибку. Давайте рассмотрим подробнее.

Во-первых, kubectl describe услуга:

$ 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>

Обратите внимание, что в моем сервисе grafana указана 1 конечная точка (их может быть несколько). Ошибка, приведенная выше в вашем примере, указывает на то, что у вас не будет перечисленных здесь конечных точек.

Endpoints:      10.1.45.69:3000

Давайте теперь посмотрим на селекторы. В приведенном выше примере вы можете видеть, что у меня есть 3 метки селектора в моем сервисе:

Selector:       app=grafana01-grafana,component=grafana,release=grafana01

Я kubectl describe мои капсулы следующим:

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

Обратите внимание, что метки на pod выровнены правильно, поэтому моя служба находит pods, которые предоставляют endpoints, которые сбалансированы по нагрузке с помощью service. Убедитесь, что эта часть цепочки не нарушена в вашей среде.

Если вы обнаружите, что метки верны, у вас все еще может быть отключение, поскольку процесс grafana, работающий в container внутри pod, работает на другом порту, чем вы ожидали.

$ 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

Если по какой-то причине ваш port под контейнером указал другое значение, значит, служба эффективно балансирует нагрузку с недопустимой конечной точкой.

Например, если в нем указан порт 80: Порт: 80 / TCP или было пустое значение Порт:

Тогда, даже если бы ваши селекторы меток были правильными, служба никогда не найдет действительный ответ от модуля и удалит конечную точку из ротации.

Я подозреваю, что ваша проблема - это первая проблема, указанная выше (несоответствующие селекторы меток).

Если и селекторы меток, и порты выровнены, у вас могут возникнуть проблемы с настройкой MTU между узлами. В некоторых случаях, если MTU, используемый вашим сетевым уровнем (например, calico), больше, чем MTU поддерживающей сети, вы никогда не получите действительный ответ от конечной точки. Обычно эта последняя потенциальная проблема проявляется в виде тайм-аута, а не ошибки 503.

person Michael Elder    schedule 19.07.2017