Heapster не может получить статистику контейнера из Kubelet в кластере Kubernetes
Я установил кластер Kubernetes в Ubuntu (надежный) на основе Руководства по локальному запуску Kubernetes через Docker, развернул DNS и запустил Heapster с бэкендом InfluxDB и графическим интерфейсом пользователя Grafana.
Кажется, что все идет гладко, за исключением Grafana, который не показывает никаких графиков, кроме сообщения No datapoints
на его диаграммах: Скриншот
После проверки журналов контейнера Docker я обнаружил, что Heapster не может получить доступ к API-интерфейсу kubelet (?), И поэтому в InfluxDB не сохраняются метрики:
user@host:~$ docker logs e490a3ac10a8
I0701 07:07:30.829745 1 heapster.go:65] /heapster --source=kubernetes:https://kubernetes.default --sink=influxdb:http://monitoring-influxdb:8086
I0701 07:07:30.830082 1 heapster.go:66] Heapster version 1.2.0-beta.0
I0701 07:07:30.830809 1 configs.go:60] Using Kubernetes client with master "https://kubernetes.default" and version v1
I0701 07:07:30.831284 1 configs.go:61] Using kubelet port 10255
E0701 07:09:38.196674 1 influxdb.go:209] issues while creating an InfluxDB sink: failed to ping InfluxDB server at "monitoring-influxdb:8086" - Get http://monitoring-influxdb:8086/ping: dial tcp 10.0.0.223:8086: getsockopt: connection timed out, will retry on use
I0701 07:09:38.196919 1 influxdb.go:223] created influxdb sink with options: host:monitoring-influxdb:8086 user:root db:k8s
I0701 07:09:38.197048 1 heapster.go:92] Starting with InfluxDB Sink
I0701 07:09:38.197154 1 heapster.go:92] Starting with Metric Sink
I0701 07:09:38.228046 1 heapster.go:171] Starting heapster on port 8082
I0701 07:10:05.000370 1 manager.go:79] Scraping metrics start: 2016-07-01 07:09:00 +0000 UTC, end: 2016-07-01 07:10:00 +0000 UTC
E0701 07:10:05.008785 1 kubelet.go:230] error while getting containers from Kubelet: failed to get all container stats from Kubelet URL "http://127.0.0.1:10255/stats/container/": Post http://127.0.0.1:10255/stats/container/: dial tcp 127.0.0.1:10255: getsockopt: connection refused
I0701 07:10:05.009119 1 manager.go:152] ScrapeMetrics: time: 8.013178ms size: 0
I0701 07:11:05.001185 1 manager.go:79] Scraping metrics start: 2016-07-01 07:10:00 +0000 UTC, end: 2016-07-01 07:11:00 +0000 UTC
E0701 07:11:05.007130 1 kubelet.go:230] error while getting containers from Kubelet: failed to get all container stats from Kubelet URL "http://127.0.0.1:10255/stats/container/": Post http://127.0.0.1:10255/stats/container/: dial tcp 127.0.0.1:10255: getsockopt: connection refused
I0701 07:11:05.007686 1 manager.go:152] ScrapeMetrics: time: 5.945236ms size: 0
W0701 07:11:25.010298 1 manager.go:119] Failed to push data to sink: InfluxDB Sink
I0701 07:12:05.000420 1 manager.go:79] Scraping metrics start: 2016-07-01 07:11:00 +0000 UTC, end: 2016-07-01 07:12:00 +0000 UTC
E0701 07:12:05.002413 1 kubelet.go:230] error while getting containers from Kubelet: failed to get all container stats from Kubelet URL "http://127.0.0.1:10255/stats/container/": Post http://127.0.0.1:10255/stats/container/: dial tcp 127.0.0.1:10255: getsockopt: connection refused
I0701 07:12:05.002467 1 manager.go:152] ScrapeMetrics: time: 1.93825ms size: 0
E0701 07:12:12.309151 1 influxdb.go:150] Failed to create infuxdb: failed to ping InfluxDB server at "monitoring-influxdb:8086" - Get http://monitoring-influxdb:8086/ping: dial tcp 10.0.0.223:8086: getsockopt: connection timed out
I0701 07:12:12.351348 1 influxdb.go:201] Created database "k8s" on influxDB server at "monitoring-influxdb:8086"
I0701 07:13:05.001052 1 manager.go:79] Scraping metrics start: 2016-07-01 07:12:00 +0000 UTC, end: 2016-07-01 07:13:00 +0000 UTC
E0701 07:13:05.015947 1 kubelet.go:230] error while getting containers from Kubelet: failed to get all container stats from Kubelet URL "http://127.0.0.1:10255/stats/container/": Post http://127.0.0.1:10255/stats/container/: dial tcp 127.0.0.1:10255: getsockopt: connection refused
...
Я обнаружил несколько проблем на GitHub, описывающих подобные проблемы, которые заставили меня понять, что Heapster не получает доступ к кублету (через петлю узла), а сам по себе (через петлю контейнера). Тем не менее, я не могу воспроизвести их решения:
github.com/kubernetes/heapster/issues/1183
Вам следует либо использовать хост-сеть для модуля Heapster, либо настроить кластер так, чтобы узел имел обычное имя, а не 127.0.0.1. В настоящее время проблема заключается в том, что имя узла разрешено в Heapster localhost. Пожалуйста, откройте в случае возникновения новых проблем.
- @ piosz
- Как включить "хост-сеть" для моего модуля Heapster?
- Как настроить мой кластер / узел на использование обычного имени, а не 127.0.0.1?
github.com/kubernetes/heapster/issues/744
Исправлено с помощью лучших опций в гиперкубе, спасибо за помощь!
- @ ddispaltro
- Есть ли способ решить эту проблему, добавив / изменив опции флагов kubelet в
docker run
?
Я пробовал настройку--hostname-override=<host's eth0 IP>
а также--address=127.0.0.1
(как предложено в последнем ответе на эту проблему GitHub), но журнал контейнера Heapster тогда заявляет:I0701 08:23:05.000566 1 manager.go:79] Scraping metrics start: 2016-07-01 08:22:00 +0000 UTC, end: 2016-07-01 08:23:00 +0000 UTC E0701 08:23:05.000962 1 kubelet.go:279] Node 127.0.0.1 is not ready E0701 08:23:05.003018 1 kubelet.go:230] error while getting containers from Kubelet: failed to get all container stats from Kubelet URL "http://<host's eth0 IP>:10255/stats/container/": Post http://<host's eth0 IP>/stats/container/: dial tcp <host's eth0 IP>:10255: getsockopt: connection refused
Проблема пространства имен
Может ли эта проблема быть вызвана тем, что я использую Kubernetes API в default
пространство имен и Heapster в kube-system
?
user@host:~$ kubectl get --all-namespaces pods
NAMESPACE NAME READY STATUS RESTARTS AGE
default k8s-etcd-127.0.0.1 1/1 Running 0 18h
default k8s-master-127.0.0.1 4/4 Running 1 18h
default k8s-proxy-127.0.0.1 1/1 Running 0 18h
kube-system heapster-lizks 1/1 Running 0 18h
kube-system influxdb-grafana-e0pk2 2/2 Running 0 18h
kube-system kube-dns-v10-4vjhm 4/4 Running 0 18h
ОС: Ubuntu 14.04.4 LTS (верный) | Кубернетес: v1.2.5 | Докер: v1.11.2
1 ответ
Heapster получил список узлов из Kubernetes и теперь пытается получить статистику из процесса kublete на каждом узле (который имеет встроенный cAdvisor, собирающий статистику на узле). В этом случае есть только один узел, и он известен как 127.0.0.1 для kubernetes. И есть проблема. Контейнер Heapster пытается получить доступ к узлу 127.0.0.1, который сам по себе, и, конечно, не находит ни одного процесса kublete для запроса в контейнере Heapster.
Две вещи должны произойти, чтобы решить эту проблему.
- Нам нужно сослаться на рабочий узел kublete (наш хост-компьютер, на котором выполняется kubernetes) чем-то другим, кроме петлевого сетевого адреса 127.0.0.1.
- Процесс kublete должен принимать трафик от нового сетевого интерфейса / адреса
Предполагая, что вы используете местное руководство по установке и запускаете kubernetes с
hack/local-up-cluster.sh
Изменить имя хоста, на которое ссылается kublete, довольно просто. Вы можете использовать более сложные подходы, но установка этого на ваш eth0 ip работала хорошо для меня (ifconfig eth0). Недостатком является то, что вам нужен интерфейс eth0, и это зависит от DHCP, поэтому ваш пробег может варьироваться в зависимости от того, насколько это удобно.
export HOSTNAME_OVERRIDE=10.0.2.15
Получить процесс kublete для приема трафика из любого сетевого интерфейса так же просто.
export KUBELET_HOST=0.0.0.0
Укажите приведенный ниже аргумент в своей конфигурации heapster для решения проблемы.
--source = kubernetes: https: //kubernetes.default: 443? useServiceAccount = true & kubeletHttps = true & kubeletPort = 10250 & insecure = true