#docker #elasticsearch #kubernetes #kubernetes-helm #minikube
#docker #elasticsearch #kubernetes #kubernetes-helm #мини-куб
Вопрос:
Я запущен minikube v1.15.1
MacOS
и установлен helm v3.4.1
. Я запускаю helm install elasticsearch elastic/elasticsearch --set resources.requests.memory=2Gi --set resources.limits.memory=4Gi --set replicas=1
установку elasticsearch в кластере k8s. Модуль elasticsearch-master-0
развернут, но он находится в pending
состоянии.
Когда я запускаю kubectl describe pod elasticsearch-master-0
, он выдает мне предупреждение ниже:
Warning FailedScheduling 61s (x2 over 2m30s) default-scheduler 0/1 nodes are available: 1 Insufficient memory.
это так Insufficient memory
, но у моего хоста есть как минимум 4 ГБ свободной памяти. Означает ли проблема с памятью minikube
, что памяти недостаточно? Если да, как я могу увеличить его память?
Я увеличил объем памяти в minikube и перезапустил minikube, но все еще имеет ту же проблему.
Я запустил minikube delete
, а затем minikube start
. Вы можете видеть ниже вывод, что он использует 4 процессора и 8 ГБ памяти
minikube v1.15.1 on Darwin 11.0.1
✨ Automatically selected the docker driver. Other choices: hyperkit, virtualbox
👍 Starting control plane node minikube in cluster minikube
🔥 Creating docker container (CPUs=4, Memory=8096MB) ...
🐳 Preparing Kubernetes v1.19.4 on Docker 19.03.13 ...
🔎 Verifying Kubernetes components...
🌟 Enabled addons: default-storageclass, storage-provisioner
🏄 Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
Ниже приведен код для получения процессора и памяти из конфигурации.
$ minikube config get cpus
4
$ minikube config get memory
8096
Ниже приведен вывод metrics-server
.
$ kubectl top node
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
minikube 466m 5% 737Mi 37%
$ kubectl top pod
W1125 20:11:23.232025 46719 top_pod.go:265] Metrics not available for pod default/elasticsearch-master-0, age: 34m3.231199s
error: Metrics not available for pod default/elasticsearch-master-0, age: 34m3.231199s
Полный вывод kubectl describe pod
:
$ kubectl describe pod elasticsearch-master-0
Name: elasticsearch-master-0
Namespace: default
Priority: 0
Node: <none>
Labels: app=elasticsearch-master
chart=elasticsearch
controller-revision-hash=elasticsearch-master-677c65788d
release=elasticsearch
statefulset.kubernetes.io/pod-name=elasticsearch-master-0
Annotations: <none>
Status: Pending
IP:
IPs: <none>
Controlled By: StatefulSet/elasticsearch-master
Init Containers:
configure-sysctl:
Image: docker.elastic.co/elasticsearch/elasticsearch:7.10.0
Port: <none>
Host Port: <none>
Command:
sysctl
-w
vm.max_map_count=262144
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-kthrd (ro)
Containers:
elasticsearch:
Image: docker.elastic.co/elasticsearch/elasticsearch:7.10.0
Ports: 9200/TCP, 9300/TCP
Host Ports: 0/TCP, 0/TCP
Limits:
cpu: 1
memory: 4Gi
Requests:
cpu: 1
memory: 2Gi
Readiness: exec [sh -c #!/usr/bin/env bash -e
# If the node is starting up wait for the cluster to be ready (request params: "wait_for_status=greenamp;timeout=1s" )
# Once it has started only check that the node itself is responding
START_FILE=/tmp/.es_start_file
# Disable nss cache to avoid filling dentry cache when calling curl
# This is required with Elasticsearch Docker using nss < 3.52
export NSS_SDB_USE_CACHE=no
http () {
local path="${1}"
local args="${2}"
set -- -XGET -s
if [ "$args" != "" ]; then
set -- "$@" $args
fi
if [ -n "${ELASTIC_USERNAME}" ] amp;amp; [ -n "${ELASTIC_PASSWORD}" ]; then
set -- "$@" -u "${ELASTIC_USERNAME}:${ELASTIC_PASSWORD}"
fi
curl --output /dev/null -k "$@" "http://127.0.0.1:9200${path}"
}
if [ -f "${START_FILE}" ]; then
echo 'Elasticsearch is already running, lets check the node is healthy'
HTTP_CODE=$(http "/" "-w %{http_code}")
RC=$?
if [[ ${RC} -ne 0 ]]; then
echo "curl --output /dev/null -k -XGET -s -w '%{http_code}' ${BASIC_AUTH} http://127.0.0.1:9200/ failed with RC ${RC}"
exit ${RC}
fi
# ready if HTTP code 200, 503 is tolerable if ES version is 6.x
if [[ ${HTTP_CODE} == "200" ]]; then
exit 0
elif [[ ${HTTP_CODE} == "503" amp;amp; "7" == "6" ]]; then
exit 0
else
echo "curl --output /dev/null -k -XGET -s -w '%{http_code}' ${BASIC_AUTH} http://127.0.0.1:9200/ failed with HTTP code ${HTTP_CODE}"
exit 1
fi
else
echo 'Waiting for elasticsearch cluster to become ready (request params: "wait_for_status=greenamp;timeout=1s" )'
if http "/_cluster/health?wait_for_status=greenamp;timeout=1s" "--fail" ; then
touch ${START_FILE}
exit 0
else
echo 'Cluster is not yet ready (request params: "wait_for_status=greenamp;timeout=1s" )'
exit 1
fi
fi
] delay=10s timeout=5s period=10s #success=3 #failure=3
Environment:
node.name: elasticsearch-master-0 (v1:metadata.name)
cluster.initial_master_nodes: elasticsearch-master-0,
discovery.seed_hosts: elasticsearch-master-headless
cluster.name: elasticsearch
network.host: 0.0.0.0
ES_JAVA_OPTS: -Xmx1g -Xms1g
node.data: true
node.ingest: true
node.master: true
node.remote_cluster_client: true
Mounts:
/usr/share/elasticsearch/data from elasticsearch-master (rw)
/var/run/secrets/kubernetes.io/serviceaccount from default-token-kthrd (ro)
Conditions:
Type Status
PodScheduled False
Volumes:
elasticsearch-master:
Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
ClaimName: elasticsearch-master-elasticsearch-master-0
ReadOnly: false
default-token-kthrd:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-kthrd
Optional: false
QoS Class: Burstable
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedScheduling 76s (x2 over 77s) default-scheduler 0/1 nodes are available: 1 Insufficient memory.
Комментарии:
1. Модуль запрашивает 2 гигабайта памяти; если ни у одного узла нет такого объема памяти, то он не может быть запланирован. Если вы используете minikube на Docker Desktop в macOS, у него есть свой собственный лимит памяти, который можно регулировать.
Ответ №1:
Minikube на Mac использует виртуальную машину для размещения kubernetes. Это отдельно от хоста и ограничивает доступную память для кластера с одним узлом.
Вы можете настроить больше памяти для виртуальной машины с помощью
minikube start --memory=4096
Комментарии:
1. Я установил его и перезапустил minikube, но все та же проблема. Я задал конфигурацию в вопросе. Как я узнаю, сколько доступной памяти осталось в minikube?
Ответ №2:
Minikube
при первом запуске будут выбраны ваши настройки памяти, но если вы ранее запускали без этой опции, вам необходимо выполнить minikube delete
и перезапустить.
Чтобы проверить ресурсы, которые использует ваш модуль / узлы, вы можете включить metrics-server
с помощью minikube addons
:
➜ ~ minikube addons enable metrics-server
🌟 The 'metrics-server' addon is enabled
Вам придется немного подождать, пока появятся показатели:
➜ ~ kubectl top node
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
minikube 186m 4% 2344Mi 15%
➜ ~ kubectl top pod
NAME CPU(cores) MEMORY(bytes)
elasticsearch-master-0 6m 1272Mi
Комментарии:
1. Я сделал это, но все еще сталкиваюсь с той же проблемой. Я обновил свой вопрос, чтобы добавить вывод всех этих команд. Вы видите какие-либо проблемы с любым из них? Спасибо.
2. Я вижу ошибку
metric is not available for default/elasticsearch-master-0
. Это вызвано проблемой с памятью?3. Не совсем. Метрики доступны, потому что ваш модуль elastic не запущен (не запланирован), поэтому система может извлекать данные. Я развернул это в своей среде, и оно работает совершенно нормально. Что еще запущено в вашей системе? Можете ли вы попробовать запустить установку без ограничений и запросов?
4. Как я узнаю, сколько памяти требуется модулю?
5. Выполнить
kubectl top pod
(скопировано с linuxhint.com/check-memory-usage-kubernetes-pod ).