学习日志 211227 k8s上安装elasticsearch
安装测试用elastic search
===================
# 211227
# 背景
- 一个网站的基本功能就是信息的匹配
- 信息由发布者发布后, 使用者要能找到这些信息
- 这种匹配可以由多种方式实现
- 基于搜索引擎的信息匹配方式是最常用的
- elastic search是常用的开源解决方案
- 基于k8s的elastic search集群安装是elastic search常用的运维方案
# 目标
- 在我们的测试集群中 搭建elastic search
- 同上, 搭建kibana管理工具
- kibana是elastic stack推荐的elastic search管理工具
- 面向开发和运维
# 安装elastic search测试集群
## 创建CRD
- 参考
- https://www.elastic.co/guide/en/cloud-on-k8s/current/k8s-deploy-eck.html
- CRD即custom resource definitions
- 用户自定义资源
- 比如之前介绍的pods StatefulSet 都是k8s内置的资源类型
- 在此之上, 也可以自定义资源类型, 并基于这种资源类型
- 编写k8s描述文件
- 执行kubectl指令 如get
- 自定义资源也是基于已有的资源的
- 创建自定义资源时, 往往会同时创建pods service等
- 同时, 还可以为自定义的资源类型创建对应的管理角色
- 细节 略
- 测试环境我们只有一个管理员 有最高权限
- 具体步骤
- 见参考文档即可 略
## 创建elastic search测试集群
- 参考
- https://www.elastic.co/guide/en/cloud-on-k8s/current/k8s-deploy-elasticsearch.html
- 具体步骤
- 如下
### 编写基于自定义资源类型 Elasticsearch 的描述文件
- 描述文件原文
```
apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
name: quickstart
spec:
version: 7.16.2
nodeSets:
- name: default
count: 1
config:
node.store.allow_mmap: false
```
- 解释 描述文件
- 资源类型 Elasticsearch
- 这个资源类型即上一步创建的CRD
- 注意这里E是大写 但在kubectl命令行中使用时e小写
- name quickstart
- 这个name实际上还会作为对应的基本资源如pod和service的前缀使用
- 见下
- version 版本
- 这里用了比较新的7.16.2
- elastic search的版本更新还是很快的
- nodeSets
- Elasticsearch 资源类型是一个集群的概念
- Elasticsearch 资源和pod资源是1对多的关系
- 这里暗示了es和nodeSet也是1对多的关系
- 但是此处只创建了一个nodeSet
- 该nodeSet里 count是1 表示只需要一个pod
- 该pod的规格没有指定
- 但实际上有一系列的默认值 比如有一个1G的pvc见下
- config allow_mmap: false
- 这个设置关闭了es的mmap功能
- 该功能非常消耗内存 但可以提高性能
### apply 该描述文件
略
### 检查结果
- `kubectl get elasticsearch`
- 注意 HEALTH 字段
- 该字段的取值 参考
- https://www.elastic.co/guide/en/elasticsearch/reference/7.16/cluster-health.html
- `kubectl get pods --selector='elasticsearch.k8s.elastic.co/cluster-name=quickstart'`
- 注意这里在选取pod时 采用了CRD的自定义选择器cluster-name
- `kubectl get service quickstart-es-http`
- 这里检查service则使用了基础的按名字查的方式
- 注意这个命字的格式, 除了前缀, `-es-http` 这个部分是固定的
- 这是个ClusterIP类型的service 但是没有外部IP
- 获取密码
- 新版的es都默认开了要密码
- 用户名默认是 elastic
- 密码按如下命令
- `kubectl get secret quickstart-es-elastic-user -o go-template='{{.data.elastic | base64decode}}'`
- 显然 这个secret也是CRD所属的基础资源之一
- 拿到我们的es密码 复制一下 下文以`$PASSWORD`表示
- 检查服务
- k8s集群内 域名使用 svc 名 即
- `curl -u "elastic:$PASSWORD" -k "https://quickstart-es-http:9200"`
- 端口为9200
- `-k` 表示不做证书校验
- 显然目前的quickstart集群的是用了自签名证书来支持https协议
- 集群外需要kubectl的port-forward
- 我们先略过这块 因为我们的开发机win10没有装好curl工具
- 下一步装完kibana直接用kibana的界面
- 检查存储
- 查看 pvc 结果 多了一个
- elasticsearch-data-quickstart-es-default-0
- 用了1Gi的硬盘 先这样吧
- 注意k8s的硬盘容量单位 Gi和M
## 创建kibana管理实例
- 参考
- https://www.elastic.co/guide/en/cloud-on-k8s/current/k8s-deploy-kibana.html
### 编写 kibana 描述文件
- 原文
```
apiVersion: kibana.k8s.elastic.co/v1
kind: Kibana
metadata:
name: quickstart
spec:
version: 7.16.2
count: 1
elasticsearchRef:
name: quickstart
```
- 解释
- kind 这里又是一种新的CRD资源类型 Kibana
- 和Elasticsearch一样, 该资源类型也可以使用kubectl get
- version
- count: 1
- 可见kibana也可以做成集群
- 这里和es不同 es是每个nodeSet都有一个count
- kibana只有一个count
- 可见kibana是一整个集群
- elasticsearchRef
- 需要管理的es集群的名字
- 可见CRD是环环相套的
- kibana这种资源类型可以基于elasticsearch资源类型来创建
### apply -f
### 检查
- 检查kibana
- `kubectl get kibana`
- HEALTH 是 red 见 Q&A 1
- 要点通过describe node可以检查资源使用情况
- 解决完上述问题 再检查 green 了
- 检查pod
- `kubectl get pod --selector='kibana.k8s.elastic.co/name=quickstart'`
- 检查service
- `kubectl get service quickstart-kb-http`
- 这次也是ClusterIP类型 (内部服务)
- 通过http使用
- 端口代理
- `kubectl port-forward service/quickstart-kb-http 5601`
- 访问 `https://localhost:5601/`
- 接受https证书(忽略告警)
- 需要登录 之前创建elasticsearch集群时有说
- 帐号是elastic
- 密码通过之前说的指令获取 即
- `kubectl get secret quickstart-es-elastic-user -o go-template='{{.data.elastic | base64decode}}'`
- 密码本质上是一个k8s secret
- 跳过引导
- 左侧三横菜单 滚到下面找到dev tools
- 执行 `GET /`
- 结果 与上一篇教程直接 curl 到 elasticsearch集群上的结果是一样的
- 类似
```
{
"name" : "quickstart-es-default-0",
"cluster_name" : "quickstart",
"cluster_uuid" : "KhQi5J-KR4O8_MWxvhzeTg",
"version" : {
"number" : "7.16.2",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "2b937c44140b6559905130a8650c64dbd0879cfb",
"build_date" : "2021-12-18T19:42:46.604893745Z",
"build_snapshot" : false,
"lucene_version" : "8.10.1",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
```
- 明天继续
### Q&A
- Q: kibana集群HEALTH是red
- A: 检查pods 发现对应 quickstart-kb-75dc58678b-lstdz 状态是pending
- 怀疑集群资源不够
- 检查node使用情况
- `kubectl describe node`
- 发现cpu requests 97% (只有2个cpu, 即2000m, m表示千分之一个cpu)
- memory还有剩余
- 检查所有cpu使用者 发现之前两个mysql实例都是500m
- 发现新创建的elasticsearch才用了100m
- 把mysql的cpu使用调整为100m
- 修改描述文件 cpu request和limit都写0.1 重新apply -f
- Q: 执行上一步操作时 mysql对应的pod重建失败
- A: 检查pod
- `kubectl describe pods mycluster-mysql-1`
- 注意不是logs指令 现在pod本身没创建出来 看logs没什么东西
- 发现报错mysql-pass这个secret不存在
- 列出secret `kubectl get secret`
- 发现名字变成了 mysql-pass-78h9g286gm 后面多了串东西
- 不知道什么原因 可能和之前有重新minikube start有关
- 修改描述文件, 把secretKeyRef部分改为mysql-pass-78h9g286gm
- 重新apply -f
- 删除挂掉的pod
- 系统自动完成了mysql两个节点的重部署
- 检查数据还在不在
- `http://192.168.2.15:31000/doc/_list`
- 还是三条数据
============
由于es官网的网络问题 暂时没有好的解决办法 今天没能直播只是自己装了一下
明天继续直播es的基本使用