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