почему модуль kubernete сообщает о «недостаточной памяти», даже если на хосте есть свободная память?

#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 ).