• ElasticSearch容器化从0到1实践(问题汇总)


    ik插件如何安装?

    ik插件(中文分词插件)无法直接通过install指定插件名称的方式进行安装,可以通过指定zip包的方式对插件进行安装,需要注意的是通过zip包方式安装插件是会有交互式确认,通过指定-b参数来忽略确认。

        podTemplate:
          spec:
            initContainers:
            - name: install-plugins
              command:
              - sh
              - -c
              - |
                bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.8.0/elasticsearch-analysis-ik-6.8.0.zip -b
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    6.8.0版本JVM参数调整

    Elasticsearch7以上版本会根据系统内存情况自动配置JVM内存参数(可用内存的一半),但是6.8.0版本不生效,具体什么原因有待后续分析。
    配置Elasticsearch使用的JVM内存大小,需要更改JVM堆大小,可以在ECK的Elasticsearch manifest的spec部分找到nodeSets,然后更改config下的node.store.allow_mmap: false。

    可以设置ES_JAVA_OPTS环境变量来修改JVM堆的大小,例如,下面的配置会设置JVM堆的最小大小和最大大小各为1GB。

    apiVersion: elasticsearch.k8s.elastic.co/v1
    kind: Elasticsearch
    metadata:
      name: elasticsearch-sample
    spec:
      version: 6.8.0
      nodeSets:
      - name: default
        count: 3
        podTemplate:
          spec:
            containers:
            - name: elasticsearch
              env:
              - name: ES_JAVA_OPTS
                value: "-Xms1g -Xmx1g"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    默认ECK自动开启证书认证,如何关闭?

    按照官方的步骤可以完美的运行Elasticsearch服务,由于默认的ECK自动开启证书认证,不满足业务需要,所以尝试将证书及认证取消。

    通过官方文档发现,虽然指出部分配置由ECK接管,但是配置依然是可用的,相关配置参考

    众所周知,Elasticsearch服务可以通设置xpack.security.enabled参数来关闭认证,配置如下:

    cat <<EOF | kubectl apply  -f -
    apiVersion: elasticsearch.k8s.elastic.co/v1
    kind: Elasticsearch
    metadata:
      name: quickstarthelei
    spec:
      version: 8.8.2
      nodeSets:
      - name: default
        count: 3
        config:
          node.store.allow_mmap: false
          xpack.security.enabled: false
    EOF
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    配置完成后发现服务未就绪,且elasticsearch对象状态异常,如下图:

    在这里插入图片描述

    实际直接请求pod IP,发现集群是正常的。
    在这里插入图片描述

    那就是集群readiness 配置没通过导致的,查看服务的Readiness配置,如下:

    Readiness:  exec [bash -c /mnt/elastic-internal/scripts/readiness-probe-script.sh] delay=10s timeout=5s period=5s #success=1 #failure=3
    
    • 1

    登录到pod内部,查看该就绪脚本逻辑,如下。

    #!/usr/bin/env bash
    
    # fail should be called as a last resort to help the user to understand why the probe failed
    function fail {
      timestamp=$(date --iso-8601=seconds)
      echo "{\"timestamp\": \"${timestamp}\", \"message\": \"readiness probe failed\", "$1"}" | tee /proc/1/fd/2 2> /dev/null
      exit 1
    }
    
    labels="/mnt/elastic-internal/downward-api/labels"
    
    version=""
    if [[ -f "${labels}" ]]; then
      # get Elasticsearch version from the downward API
      version=$(grep "elasticsearch.k8s.elastic.co/version" ${labels} | cut -d '=' -f 2)
      # remove quotes
      version=$(echo "${version}" | tr -d '"')
    fi
    
    READINESS_PROBE_TIMEOUT=${READINESS_PROBE_TIMEOUT:=3}
    
    # Check if PROBE_PASSWORD_PATH is set, otherwise fall back to its former name in 1.0.0.beta-1: PROBE_PASSWORD_FILE
    if [[ -z "${PROBE_PASSWORD_PATH}" ]]; then
      probe_password_path="${PROBE_PASSWORD_FILE}"
    else
      probe_password_path="${PROBE_PASSWORD_PATH}"
    fi
    
    # setup basic auth if credentials are available
    if [ -n "${PROBE_USERNAME}" ] && [ -f "${probe_password_path}" ]; then
      PROBE_PASSWORD=$(<${probe_password_path})
      BASIC_AUTH="-u ${PROBE_USERNAME}:${PROBE_PASSWORD}"
    else
      BASIC_AUTH=''
    fi
    
    # Check if we are using IPv6
    if [[ $POD_IP =~ .*:.* ]]; then
      LOOPBACK="[::1]"
    else
      LOOPBACK=127.0.0.1
    fi
    
    # request Elasticsearch on /
    # we are turning globbing off to allow for unescaped [] in case of IPv6
    ENDPOINT="${READINESS_PROBE_PROTOCOL:-https}://${LOOPBACK}:9200/"
    ORIGIN_HEADER="x-elastic-product-origin: cloud"
    status=$(curl -o /dev/null -w "%{http_code}" --max-time ${READINESS_PROBE_TIMEOUT} -H "${ORIGIN_HEADER}" -XGET -g -s -k ${BASIC_AUTH} $ENDPOINT)
    curl_rc=$?
    
    if [[ ${curl_rc} -ne 0 ]]; then
      fail "\"curl_rc\": \"${curl_rc}\""
    fi
    
    # ready if status code 200, 503 is tolerable if ES version is 6.x
    if [[ ${status} == "200" ]] || [[ ${status} == "503" && ${version:0:2} == "6." ]]; then
      exit 0
    else
      fail " \"status\": \"${status}\", \"version\":\"${version}\" "
    fi
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60

    这里发现是通过请求,通过判断返回值来确定服务是否就绪。在第46行拼接请求地址,且配置为如果存在环境变量READINESS_PROBE_PROTOCOL则以环境变量为准, 否则为https。

    至此,基本定位到为就绪检查的地址不正常,导致服务没有就绪。

    如何处理呢?

    通过查看源码发现。

    系统初始化是会指定EnvReadinessProbeProtocol的协议类型的配置。
    在这里插入图片描述

    EnvReadinessProbeProtocol默认值由是有httpCfg对象的Protocol方法决定的。

    在这里插入图片描述

    该默认方法在podspec文件的的BuildPodTemplateSpec中调用

    在这里插入图片描述

    而该函数的参数为es对象的Spec.HTTP

    在这里插入图片描述

    然后继续追溯es对象Spec.HTTP对象的Protocol方法,发现:如果tls开启默认为https,否则为http。
    在这里插入图片描述

    然后重新整理部署yaml。关闭http tls,重新部署服务。如下

    cat <<EOF | kubectl apply  -f -
    apiVersion: elasticsearch.k8s.elastic.co/v1
    kind: Elasticsearch
    metadata:
      name: quickstarthelei
    spec:
      http:
        tls:
          selfSignedCertificate:
            disabled: true
      version: 8.8.2
      nodeSets:
      - name: default
        count: 3
        config:
          node.store.allow_mmap: false
          xpack.security.enabled: false
    EOF
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
  • 相关阅读:
    面试又卡在多线程?那就来分享几道 Java 多线程高频面试题,面试不用愁
    头歌初识redis答案
    网页设计软件Bootstrap Studio6.7.1
    Java 使用Velocity引擎生成代码
    netrw模拟nerdtree的go命令连续打开多个文件
    elasticsearch18-自动补全实战
    设计模式之原型模式(Prototype)
    Docker快速入门到项目部署,docker自定义镜像
    面试官:Redis如何实现持久化的、主从哨兵又是什么?
    Linux pidof
  • 原文地址:https://blog.csdn.net/u012881331/article/details/133925528