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

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"

默认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

配置完成后发现服务未就绪,且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

登录到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

这里发现是通过请求,通过判断返回值来确定服务是否就绪。在第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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值