Как отключить подкачку в Elasticsearch на Kubernetes?

Согласно официальным документам ES, отключение подкачки является одним из лучших способов повышения производительности, доступных Elasticsearch.

Тем не менее, это оказывается трудно настроить. Я провел несколько часов, исследуя и пытаясь различными способами отключить обмен, используя официальный образ ES-докера в Kubernetes.

При настройке bootstrap.memory_lock: true в качестве переменной env образ не загружается с ошибкой: Unable to lock JVM Memory: error=12, reason=Cannot allocate memory. This can result in part of the JVM being swapped out. Increase RLIMIT_MEMLOCK, soft limit: 65536, hard limit: 65536, Как указывают документы, это отчасти ожидаемо. Я даже смонтировал кастом /etc/security/limits.conf с настройками, но это не удалось.

Каков рекомендуемый способ отключить подкачку при использовании официального образа es на k8s?

А вот соответствующие разделы моего ямля

apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
  name: elastic-data
spec:
  serviceName: elastic-data
  replicas: 1
  template:
    spec:
      securityContext:
        runAsUser: 0
        fsGroup: 0
      containers:
      - name: elastic-data
        image: docker.elastic.co/elasticsearch/elasticsearch-oss:6.4.0
        env:
        - name: ES_JAVA_OPTS
          value: "-Xms2g -Xmx2g"
        - name: cluster.name
          value: "elastic-devs"
        - name: node.name
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: discovery.zen.ping.unicast.hosts
          value: "elastic-master.default.svc.cluster.local"
        - name: node.master
          value: "false"
        - name: node.ingest
          value: "false"
        - name: node.data
          value: "true"
        - name: network.host
          value: "0.0.0.0"
        - name: path.data
          value: /usr/share/elasticsearch/data
        - name: indices.memory.index_buffer_size
          value: "512MB"
        - name: bootstrap.memory_lock
          value: "true"
        resources:
          requests:
            memory: "3Gi"
          limits:
            memory: "3Gi"
        ports:
        - containerPort: 9300
          name: transport
        - containerPort: 9200
          name: http
        volumeMounts:
        - name: data-volume
          mountPath: /usr/share/elasticsearch/data
        - name: swappiness-config
          mountPath: /etc/security/limits.conf
          subPath: limits.conf
      volumes:
      - name: data-volume
        persistentVolumeClaim:
          claimName: pvc-es
     - name: swappiness-config
       configMap:
         name: swappiness-config
         items:
          - key: limits.conf
             path: limits.conf

limits.conf

elasticsearch soft memlock unlimited
elasticsearch hard memlock unlimited
elasticsearch hard nofile 65536
elasticsearch soft nofile 65536

2 ответа

Я думаю, что ulimits в моем yaml не были распознаны, поэтому я последовал этому посту и создал изображение с пользовательской точкой входа, которая устанавливает настройки.

Какой тип изображения вы используете? Если его ОС оптимизирована для контейнеров (cos), попробуйте переключиться на образы на основе Ubuntu

Другие вопросы по тегам