helm在k8s上部署Elasticsearch和Kibana

  • 前提
    • 在win上安装docker desktop,没有网络限制,而且,打开kubernetes之后,很快就安装启动好了。
    • 在win上安装scoop,有网络限制,需要访问github raw的文件内容,安装方法 官网 有安装命令 > Set-ExecutionPolicy RemoteSigned -Scope CurrentUser # Optional: Needed to run a remote script the first time > irm get.scoop.sh | iex
      • 为什么要安装scoop, 因为可以在win的机器上,快速安装命令行工具。
      • 因为windows的docker desktop安装了之后,没有命令行工具 kubectl 和 docker了 (20230228近期安装更新的)
    • 如果本身是mac环境的也是需要安装docker desktop或者虚拟机linux系列上面部署k8s集群也无妨。
    • 对elasticsearch以及kibana的知识,本文没有细述,需要另外查找
    • 一些内容是通过chatgpt返回的过程和方法,所以基本上没有去网上查其他的资料。主要还是自己的认知,然后把chatgpt的零碎的内容整合起来,可能会比百度更快,但是,如果真的遇到问题,无法得到答案,自己排查,比如排查了2天,ssl连接不上elasticsearch,因为k8s的service的selector配错了,是app=elasticsearch-master, 我漏了-master
  • 其他的一些环境安装
    • 通过上面的scoop,在win上面安装docker 和kubectl ,但是对于curl命令powershell有自己的解释,所以建议安装git,就会有自带的git bash。git bash运行方法,可以右键选择启动gi t bash,或者在vscode编辑器的终端中选择git bash的终端。
    • 在win上面安装tightVNC, 配置好密码,其他默认。然后在mac上的app store里面安装ripple remote就可以远程连接局域网的win主机了。如果有打不出的字符,win+ R启动osk屏幕键盘。
    • 用scoop安装base64,因为后面elasticsearch的密码存在了k8s的secret里面,需要base64解码
    • 用scoop安装jq,对json内容进行解析和操作,因为elasticsearch返回的内容多为json格式。
    • 用scoop安装helm scoop install helm
    • 如果可以创建共享文件夹,或者用nas硬盘的话,vscode在两台机器上面是可以同时编辑同一个文件的。这样就好像粘贴板一样。远程桌面也可以复制文本,复制文件到共享目录下面
  • 正文
    • 在安装好docker desktop(k8s)的机器上运行命令, 启动elasticsearch 和kibana
    • 如果kibana查找elasticsearch失败了。用helm uninstall kibana也不能彻底删除干净,再次启动的时候要换个名字了。
    • 相关的helm chart的使用文档和chart的文件在git上。链接在这ELK Helm Chart
# 安装helm的chart的来源 helm repo add elastic https://helm.elastic.co  # 可以另外创建一个k8s的namespace kubectl create namespace elastic-system  # 需要注意的是,如果docker desktop,k8s集群只有一个节点,默认是replicas=3 # 导致唯一在running状态下的pod elasticsearch-master-0一直不是ready状态 # 好像是还有一个pushto not ready的一个参数可以设置,但是效果我没有去看 # 所以务必加上 --set replicas=1, 否则kibana启动直接失败 helm install elasticsearch elastic/elasticsearch --set replicas=1 -n elastic-system  # 启动之后会得到一下的log打印出来 1. Watch all cluster members come up.   $ kubectl get pods --namespace=elastic-system -l app=elasticsearch-master -w 2. Retrieve elastic user's password.   $ kubectl get secrets --namespace=elastic-system elasticsearch-master-credentials -ojsonpath='{.data.password}' | base64 -d 3. Test cluster health using Helm test.   $ helm --namespace=elastic-system test elasticsearch # kibana启动多了这个 3. Retrieve the kibana service account token.   $ kubectl get secrets --namespace=elastic-system kibana-kibana-es-token -ojsonpath='{.data.token}' | base64 -d  #第二个是为了获取kibana的用户elastic的密码的,可以看到还有elasticsearch-master-certs 的secret #也可以通过base64解码,然后把内容生成3个证书文件 #这样就不用通过 k8s的拷贝命令, 来吧pod中的证书文件给复制下来了 kubectl cp elasticsearch-master-0:/usr/share/elasticsearch/config/certs ./certs  #第一个命令,是查看有没有elasticsearch的pod,处于running,并且ready的状态 # 其他多余的就不细说了。这一步是必要的过程 #elasticsearch的pod READY之后,可以启动kibana helm install kibana elastic/kibana -n elastic-system  # 如果失败了重新来,需要改名字比如后面加数字,因为uninstall不干净,留了一个configmap, # 就算删除之后,helm也提示名称重复,暂时不知道原因 # kubectl delete all -all 或者 kubectl delete all -n elastic-system也不行 helm uninstall kibana helm install kibana2 elastic/kibana -n elastic-system  #另外说一句,虽然elasticsearch是作为stateful部署的,但是数据的持久化,还是靠的pvc #否则一旦pod重启数据就没有了,这个helm的chart已经给我们写好了,如果需要额外配置,需要用values.yml添加需要修改的参数,然后启动  # 这个时候查看k8s中,可以看到elasticsearch已经有一个service是提供给kibana来通信的。 # 但是我们自己需要去访问kibana, 或者对elasticsearch发送请求,如curl或者客户端 # 就需要把kibana和elasticsearch暴露到节点之外。为了长期部署的方便,不建议使用port-forward # --address 0.0.0.0这样其他局域网的机器也可以访问 kubectl port-forward service/kibana-kibana 5601:5601 --address 0.0.0.0 -n elastic-system  # 需要另外创建2个service, type是nodeport,但是nodeport的端口的范围是固定的30000到多少 # nodeport命令里面不知道怎么没有selector这个参数了,只能输出文件之后修改selector # 这文件就不列出来了。查看label的方法如下 kubectl get pods -n elastic-system --show-labels  # 先导出文件,dry-run不能少,端口可以自己定义,我这里写了9200有点关系的32400 kubectl create service nodeport my-elasticsearch-service --tcp=9200:9200 --node-port=32400 -o yaml --dry-run=client  > elasticsearchservice.yml  # 修改文件中的selector的部分 # 我就是因为少了-master导致ssl链接不上,排查了2天 把 app: my-elasticsearch-service 改成 app: elasticsearch-master  # 然后启动 apply create都可以 kubectl apply -f .elasticsearchservice.yml  # 然后是kibana的service, 我选了和5601相近的32601 kubectl create service nodeport my-kibana-service --tcp=5601:5601 --node-port=32601 -o yaml --dry-run=client  > kibanaservice.yml  # 然后启动 kubectl create -f .kibanaservice.yml   
  • 验证
    • 到了这里就配置好了。感觉就是4个命令的事情
    • 验证的一些步骤
# 看看elasticsearch和kibana是不是正常启动着,这个在上面的过程中就会看到 # 比如说docker desktop里面有没有elasticsearch和kibana的容器在运行着 # 通过kubectl get pod -n elasticsearch, 或者get service看看这些服务  # 连接kibana # 在本机的话就是访问 localhost:32601就能看到kibana的登录页面 # 通过上面获得密码的方法就不用进elasticsearch去找密码了。我也不知道怎么找密码,暂时只知道怎么重置密码,密码在启动log里面 # 进elasticsearch的方法 kubectl exec -it elasticsearch-master-0 -n elastic-system --  /bin/bash  # 进kibana的方法 kubectl exec -it kibana-kibana-XXXpodname -n elastic-system --  /bin/bash  # 获取密码的方法 kubectl get secrets --namespace=elastic-system elasticsearch-master-credentials -ojsonpath='{.data.password}' | base64 -d  # 进去之后因为elasticsearch里面什么数据也没有,想要去创建index pattern,只会出现一个添加integration的界面,所以看不出这个pod的数据是持久的。 # 要验证这个elasticsearch的数据是持久的,可以添加一个用户。然后把docker关了重启,然后再登录进去 # 然后发现这个用户还在。这里我说的就比较模糊了。不细说的原因是因为我也没有对elk掌握的很深,elk知识,不是我两句话能说的清的。  # 然后看一下elasticsearch的数据现在没办法用index patten映射,可以先去dev tools里面加2条数据 # kibana据说是nodejs前端,devtools上发送的内容是不会直接去elasticsearch服务的,是有后台转发给elasticsearch # 在kibana的dev tool的console随便加点不多的数据,可以随时删掉 POST products/_bulk {"index":{"_id":1}} {"name":"Wine - Maipo Valle Cabernet","price":152,"in_stock":38,"sold":47,"tags":["Beverage","Alcohol","Wine"],"description":"Aliquam augue quam, sollicitudin vitae, consectetuer eget, rutrum at, lorem. Integer tincidunt ante vel ipsum. Praesent blandit lacinia erat. Vestibulum sed magna at nunc commodo placerat. Praesent blandit. Nam nulla. Integer pede justo, lacinia eget, tincidunt eget, tempus vel, pede. Morbi porttitor lorem id ligula.","is_active":true,"created":"2004/05/13"} {"index":{"_id":2}} {"name":"Tart Shells - Savory","price":99,"in_stock":10,"sold":430,"tags":[],"description":"Pellentesque at nulla. Suspendisse potenti. Cras in purus eu magna vulputate luctus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus vestibulum sagittis sapien. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Etiam vel augue. Vestibulum rutrum rutrum neque. Aenean auctor gravida sem.","is_active":true,"created":"2007/10/14"}  # 添加好了之后,去kibana的dataviews那里就可以看到添加elasticsearch的index pattern。不再是啥也没有了。 # 在登录kibana的时候,也基本上验证了kibana成功连接上elasticsearch了。  # 连接elasticsearch # 没有用到客户端,可以用nodejs, python,或者java # 这里用curl试一下,如果是windows环境,要在git bash里面用curl命令,随便用的一个命令 # 改成自己的password curl --insecure -u elastic:passwordXXXXXX -H "Content-Type:application/x-ndjson" -XGET 'https://localhost:32401/orders/_search?scroll=1m' -d '{    "query": {         "match_all": {}     } }'  # 返回没这个index, 随便找的命令,当然没有这个index {"error":{"root_cause":[{"type":"index_not_found_exception","reason":"no such index [orders]","resource.type":"index_or_alias","resource.id":"orders","index_uuiuid":"_na_","index":"orders"}],"type":"index_not_found_exception","reason":"no such index [orders]","resource.type":"index_or_alias","resource.id":"orders","iexndex_uuid":"_na_","index":"orders"},"status":404}   # 在elasticsearch自己的pod上因为我当时去排查问题 curl --insecure --cacert config/cert/ca.crt -u elastic:passwordXXX -H "Content-Type:application/json" -XGET 'https://localhost:9200/orders/_search?scroll=1m' -d '{    "query": {         "match_all": {}     } }'  # 在kibana的pod上 # 在pod上都是正常的,所以是自己的service配错了 # charles或者用wireshark抓包抓不到dev tool的console的请求,才发现是前端的后台发送的请求 curl --insecure -u elastic:passwordXXXX -H "Content-Type:application/json" -XGET 'https://elasticsearch-master:9200/orders/_search?scroll=1m' -d '{    "query": {         "match_all": {}     } }'   
  • 题外话
    • 那么现在部署好了。可以愉快的玩耍起来了。
    • 其实在helm的chart里面还有logstash以及2个beat这几个主力,其实这些也不占什么内存,就本地部署测试一下也是可以的
    • helm chart里面把密码和证书部署在k8s中,这个内容,我也没有去细看,
    • 包括似乎还有kibana获取短时有效的elasticsearch的token, 和elasticsearch形成信任关系这个步骤也不清楚,如果是自己部署,要把token从elasticsearch启动log里面粘贴出来,贴到kibana的初始页面,这样才回到用户登录的界面,默认管理员用户elastic
    • 新的docker-desktop居然不用那么费劲,以前是有个github上的sh, 执行获得需要的包,而且最新的docker-desktop的包所对应的版本可能没有。所以要去release note里面找9⃣️一版本的dockerdesktop。坑爹的是,安装了之后,没有命令行docker和kubectl, UI界面的功能倒是全了,终于想通了。
    • 证书有什么用不知道,ssl去连接的时候,还是提示要authentication
    • 这个helm的elasticsearch的chart 用一些附加的配置的命令 helm install kibana elastic/kibana -f values.yaml 或者把这个git下载下来,然后在本地启动。helm的使用方法就不多说了。
    • 好,暂时先说这么多
  • 最后想说句话,本来觉得笔记贴过来很快,写个博客。内容也比较简单。用处可能会有一点点。但是感觉写了好久,快2个小时。
发表评论

相关文章