在本地环境中进行ECK(弹性Kubernetes云)的运行确认
首先
ElasticStack的Kubernetes Operator,Elastic Cloud on Kubernetes(ECK),已于2020年1月16日发布了1.0版本。
我们过去在本地服务器上使用docker/docker-compose来使用ElasticStack,但现在我们正在考虑使用Kubernetes,在本地环境中进行ECK的操作验证。
弹性云容器化
可以使用Operator在Kubernetes上构建和运营ElasticStack。
ECK 支持版本
截至2020年2月1日,ECK 1.0的支持版本。
-
- kubectl 1.11+
-
- Kubernetes 1.12+ or OpenShift 3.11+
- Elastic Stack: 6.8+, 7.1+
操作员
截至2020年2月7日,Operator所支持的项目如下(引用自Operator.io)。
简而言之
-
- 構築は、Elasticsearch, Kinaba, APMserver に対応している。(Beats には未対応)
-
- TLS認証を管理してくれる。
-
- クラスタの変更に Elasticsearch クラスタを安全に変更してくれる。
-
- ボリュームに関しては、PVを使用するので、PVC等に対応できるPVを用意しないといけない。
- セキュリティ設定 (色々な secret の準備) は Operator で実施してくれる。
请负责管理和建立TLS、密码和设置,
同时还能安全处理数据库部分(Elasticsearch集群),非常方便。
但是,似乎运算符不会为了获取集群自身的可观察性而安装beats。
环境版本
Kubernetes:
Kubernetes:
在搭建于k8s上的kubespray上进行搭建(使用Intel NUC + ESXi + CentOS7 + kubespray)。
版本:v1.16.3
详细配置请参考以下文章。
https://qiita.com/suzuyui/items/e7531fe5e1e84c061b23
储存
我们正在使用QNAP构建的iSCSI作为PersistentVolume(PV)。
尽管在文中提到,在没有准备这个PV的情况下进行测试是会失败的。(这是显而易见的…)
详细配置可参考以下文章。
https://qiita.com/suzuyui/items/0efa505f3db03390f181
弹性堆栈
版本号为7.5.2和7.6.0
由于在确认期间发布了7.6.0版本,所以首先使用7.5.2版本进行实施,并进行了7.6.0的升级。
请问我可以帮您做些什么吗?
版本:1.0.0
本次实施的内容
按照官方页面上的QuickStart的1.到4.进行操作。
然后进行Elasticsearch的版本升级。(5.)
最后确认删除Elasticsearch会导致PVC也被删除,将其记录下来。(6.)
步骤如下:
-
- 在您的 Kubernetes 集群中部署 ECK Operator
-
- 部署 Elasticsearch 集群
-
- 部署 Kibana 实例
-
- 进行 Elasticsearch 部署数的更改测试
-
- Elasticsearch 版本升级
- 确认 Elasticsearch 删除操作
1. 在您的 Kubernetes 集群中安裝 ECK 運算子 (Deploy ECK in your Kubernetes cluster).
下载 ECK 的 yaml 文件并执行 apply 操作。
curl -OL https://download.elastic.co/downloads/eck/1.0.0/all-in-one.yaml
kubectl apply -f all-in-one.yaml
※ 如果不需要保存为 yaml 文件,一行就可以 (使用 kubectl apply -f https://download.elastic.co/downloads/eck/1.0.0/all-in-one.yaml)。
实施后将构建如下所示
$ kubectl apply -f all-in-one.yaml
customresourcedefinition.apiextensions.k8s.io/apmservers.apm.k8s.elastic.co created
customresourcedefinition.apiextensions.k8s.io/elasticsearches.elasticsearch.k8s.elastic.co created
customresourcedefinition.apiextensions.k8s.io/kibanas.kibana.k8s.elastic.co created
clusterrole.rbac.authorization.k8s.io/elastic-operator created
clusterrolebinding.rbac.authorization.k8s.io/elastic-operator created
namespace/elastic-system created
statefulset.apps/elastic-operator created
serviceaccount/elastic-operator created
validatingwebhookconfiguration.admissionregistration.k8s.io/elastic-webhook.k8s.elastic.co created
service/elastic-webhook-server created
secret/elastic-webhook-server-cert created
确认建设情况
$ kubectl get all -n elastic-system
NAME READY STATUS RESTARTS AGE
pod/elastic-operator-0 1/1 Running 0 2m22s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/elastic-webhook-server ClusterIP 10.233.46.231 <none> 443/TCP 2m23s
NAME READY AGE
statefulset.apps/elastic-operator 1/1 2m23s
操作员如何确认操作日志(会有很多日志产生)。
$ kubectl -n elastic-system logs -f statefulset.apps/elastic-operator
{"level":"info","@timestamp":"2020-02-01T06:01:05.514Z","logger":"manager","message":"Setting up client for manager","ver":"1.
0.0-6881438d"}
{"level":"info","@timestamp":"2020-02-01T06:01:05.515Z","logger":"manager","message":"Setting up scheme","ver":"1.0.0-6881438d
"}
{"level":"info","@timestamp":"2020-02-01T06:01:05.516Z","logger":"manager","message":"Setting up manager","ver":"1.0.0-6881438
d"}
部署 Elasticsearch 集群
首先,将下面的YAML代码按照quickstart中的说明进行应用。
apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
name: quickstart
spec:
version: 7.5.2
nodeSets:
- name: default
count: 1
config:
node.master: true
node.data: true
node.ingest: true
node.store.allow_mmap: false
$ kubectl apply -f elasticsearch-eck-test.yaml
elasticsearch.elasticsearch.k8s.elastic.co/quickstart created
然后,在这次执行环境中,以下项目如下所示失败了。
在PV分配中的失败
当检查状态时,一直显示为健康未知。
$ kubectl get elasticsearch
NAME HEALTH NODES VERSION PHASE AGE
quickstart unknown 7.5.2 ApplyingChanges 109s
※ Elasticsearch可以使用ES进行缩写(kubectl get es与上述相同)。
切分
检查Pod启动情况,并查看该描述信息中的Events。
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
quickstart-es-default-0 0/1 Pending 0 2m13s
$ kubectl describe pod quickstart-es-default-0
Name: quickstart-es-default-0
Namespace: default
Priority: 0
〜〜〜
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedScheduling <unknown> default-scheduler pod has unbound immediate PersistentVolumeClaims (repeated 4 times)
Warning FailedScheduling <unknown> default-scheduler pod has unbound immediate PersistentVolumeClaims (repeated 4 times)
公式问题解决
弹性网站中提到
如果您看到未绑定的持久卷声明(PVC)出现错误,那意味着目前没有可满足该声明的持久卷。
听说对于 ECK Operator 创建的 PVC,如果没有适用的 PV,就不行了。(当然,这是理所当然的。)
这次问题的要点和对策
-
- PVを用意してなかった。 → 「環境」項目に記載してある QNAPで作成した
PVC がうまくいかない → 次の項目「volumeClaimTemplate の追記」で対処する
volumeClaimTemplate 的添加
可在yaml文件的manifest(清单)中添加volumeClaimTemplate。
写法可以参考官方网站:https://www.elastic.co/guide/en/cloud-on-k8s/current/k8s-volume-claim-templates.html
以下是一种中文的表达方式:
事情可以改善的模式有两种。
A. 编写适用于环境PV的volumeClaimTemplate。
B. 将其设置为emptyDir。
A. 我会为环境的 PV 写一个相应的 volumeClaimTemplate。
根据官方网站提供的参考,用适合自己的方式进行补充。以下是基于个人环境的示例。
-
- volumeClaimTemplates[]
metadata.name: elasticsearch-data であることが ECK での Must 条件
spec
storage
storageClassName: PVに合った記載。PVにも同じstorageClassNameで準備する。
PV yaml例
https://qiita.com/suzuyui/items/0efa505f3db03390f181#5-pv-%E3%81%AE%E4%BD%9C%E6%88%90
spec.capacity.storage を 10Gi -> 50Gi に変えただけでそれ以外は同じで準備した
apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
name: quickstart
spec:
version: 7.5.2
nodeSets:
- name: default
count: 1
config:
node.master: true
node.data: true
node.ingest: true
node.store.allow_mmap: false
volumeClaimTemplates:
- metadata:
name: elasticsearch-data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 50Gi
storageClassName: standard
从现在开始,我们将使用上述的 YAML 进行操作(参考下一个 B. emptyDir)。
将其设置为 emptyDir
如果不需要永久保存卷内的数据,也可以通过使用emptyDir来解决。
(但是需要注意数据可能会丢失,因此不推荐使用。如果只是在测试环境中进行临时测试,可以接受。)
apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
name: quickstart
spec:
version: 7.5.2
nodeSets:
- name: default
count: 1
config:
node.master: true
node.data: true
node.ingest: true
node.store.allow_mmap: false
podTemplate:
spec:
volumes:
- name: elasticsearch-data
emptyDir: {}
PV/PVC准备后重新应用
实施 PV/PVC 兼容性,再次执行 kubectl apply。
$ kubectl apply -f elasticsearch-quickstart-pv.yaml
elasticsearch.elasticsearch.k8s.elastic.co/quickstart created
根据以下情况,我们确认此次部署成功了。
(Pod正在运行,PVC已绑定,elasticsearch已准备就绪)
$ kubectl get po -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
quickstart-es-default-0 0/1 Init:0/1 0 21s 10.233.65.103 k8sworker01 <none> <none>
$ kubectl get po -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS
GATES
quickstart-es-default-0 0/1 PodInitializing 0 22s 10.233.65.103 k8sworker01 <none> <none>
$ kubectl get po -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
quickstart-es-default-0 0/1 Running 0 30s 10.233.65.103 k8sworker01 <none> <none>
$ kubectl get po -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
quickstart-es-default-0 1/1 Running 0 37s 10.233.65.103 k8sworker01 <none> <none>
$ kubectl get elasticsearch
NAME HEALTH NODES VERSION PHASE AGE
quickstart green 1 7.5.2 Ready 55s
$ kubectl get es
NAME HEALTH NODES VERSION PHASE AGE
quickstart green 1 7.5.2 Ready 2m6s
$ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
elasticsearch-data-quickstart-es-default-0 Bound iscsi-50g-pv05 50Gi RWO standard 3m18s
$ kubectl get pv iscsi-50g-pv05
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
iscsi-50g-pv05 50Gi RWO Retain Bound default/elasticsearch-data-quickstart-es-default-0 standard 4m4s
3. 部署一个 Kibana 实例 (Deploy a Kibana instance)
3.1. 部署
使用下面的yaml配置文件按照快速入门指南构建Kibana。
apiVersion: kibana.k8s.elastic.co/v1
kind: Kibana
metadata:
name: quickstart
spec:
version: 7.5.2
count: 1
elasticsearchRef:
name: quickstart
申请。
$ kubectl apply -f kibana.yaml
kibana.kibana.k8s.elastic.co/quickstart created
等待一段时间后,健康状态会从红色变为绿色。(开始时就绪探针会失败,但是随着时间的推移,它会变成绿色,因此需要等待。)
$ kubectl get kibana
NAME HEALTH NODES VERSION AGE
quickstart red 7.5.2 37s
$ kubectl get kibana
NAME HEALTH NODES VERSION AGE
quickstart green 1 7.5.2 93s
3.2 网络访问
确认可以通过Web浏览器访问和登录Kibana。
服务
可以确认自动创建了 ClusterIP。
$ kubectl get service quickstart-kb-http
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
quickstart-kb-http ClusterIP 10.233.21.197 <none> 5601/TCP 7m30s
端口转发
使用kubectl port-forward将自动生成的SVC端口转发到本地环境。
$ kubectl port-forward service/quickstart-kb-http 5601
Forwarding from 127.0.0.1:5601 -> 5601
Forwarding from [::1]:5601 -> 5601
密码
需要登录的密码是由Operator自动创建的elastic用户的密钥,可以通过下面的base64解码获取。
$ kubectl get secret quickstart-es-elastic-user -o=jsonpath='{.data.elastic}' | base64 --decode; echo
pd7fxj899v8lsgh2ks4rkfjr
根据上述,pd7fxj899v8lsgh2ks4rkfjr是密码(请注意,该密码会因环境而异)。
访问界面
打开Web浏览器,按下述方式访问:
1. URL为「https://127.0.0.1:5601」
2. 用户名为「elastic」
3. 密码为先前从secret中获取的密码(此处记为pd7fxj899v8lsgh2ks4rkfjr,注意此内容因环境而异)
4. 点击「登录」按钮
登录认证之后
如果验证成功,则会跳转到以下页面。
我已成功部署Kibana并确认了Web访问和身份验证。
4. 升级你的 Elasticsearch 部署,进行建构数量的变更测试。
更改Elasticsearch的数量从1变为3,并确认其进行了扩容操作。
-
- 変更箇所
spec.nodeSets[].count: 1 -> 3 に変更するのみ
apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
name: quickstart
spec:
version: 7.5.2
nodeSets:
- name: default
count: 3
config:
node.master: true
node.data: true
node.ingest: true
node.store.allow_mmap: false
volumeClaimTemplates:
- metadata:
name: elasticsearch-data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 50Gi
storageClassName: standard
更改nodeSets为3后,执行apply。请注意使用-w选项逐渐增加。
$ kubectl apply -f elasticsearch-quickstart-pv.yaml
elasticsearch.elasticsearch.k8s.elastic.co/quickstart configured
$ kubectl get po -o wide -w
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
quickstart-es-default-0 1/1 Running 0 6m43s 10.233.65.103 k8sworker01 <none> <none>
quickstart-es-default-1 0/1 Running 0 15s 10.233.92.171 k8sworker02 <none> <none>
quickstart-kb-6c88bdd64c-87w9l 1/1 Running 0 2m7s 10.233.65.104 k8sworker01 <none> <none>
quickstart-es-default-1 1/1 Running 0 28s 10.233.92.171 k8sworker02 <none> <none>
quickstart-es-default-2 0/1 Pending 0 0s <none> <none> <none> <none>
quickstart-es-default-2 0/1 Pending 0 0s <none> <none> <none> <none>
quickstart-es-default-2 0/1 Pending 0 1s <none> k8sworker03 <none> <none>
quickstart-es-default-2 0/1 Init:0/1 0 1s <none> k8sworker03 <none> <none>
quickstart-es-default-2 0/1 Init:0/1 0 7s 10.233.110.31 k8sworker03 <none> <none>
quickstart-es-default-0 1/1 Running 0 7m4s 10.233.65.103 k8sworker01 <none> <none>
quickstart-es-default-1 1/1 Running 0 36s 10.233.92.171 k8sworker02 <none> <none>
quickstart-es-default-2 0/1 Init:0/1 0 7s 10.233.110.31 k8sworker03 <none> <none>
quickstart-es-default-0 1/1 Running 0 7m4s 10.233.65.103 k8sworker01 <none> <none>
quickstart-es-default-1 1/1 Running 0 36s 10.233.92.171 k8sworker02 <none> <none>
quickstart-es-default-2 0/1 Init:0/1 0 7s 10.233.110.31 k8sworker03 <none> <none>
quickstart-es-default-2 0/1 PodInitializing 0 9s 10.233.110.31 k8sworker03 <none> <none>
quickstart-es-default-2 0/1 Running 0 10s 10.233.110.31 k8sworker03 <none> <none>
quickstart-es-default-2 1/1 Running 0 21s 10.233.110.31 k8sworker03 <none> <none>
$ kubectl get es
NAME HEALTH NODES VERSION PHASE AGE
quickstart green 3 7.5.2 Ready 7m27s
$ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
elasticsearch-data-quickstart-es-default-0 Bound iscsi-50g-pv05 50Gi RWO standard 18m
elasticsearch-data-quickstart-es-default-1 Bound iscsi-50g-pv06 50Gi RWO standard 12m
elasticsearch-data-quickstart-es-default-2 Bound iscsi-50g-pv04 50Gi RWO standard 11m
我最终确认了节点数为3。
我也确认了下面三个 Elasticsearch QuickStart Pod 正在运行 1/1。
$ kubectl get po -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
quickstart-es-default-0 1/1 Running 0 11m 10.233.65.103 k8sworker01 <none> <none>
quickstart-es-default-1 1/1 Running 0 4m57s 10.233.92.171 k8sworker02 <none> <none>
quickstart-es-default-2 1/1 Running 0 4m28s 10.233.110.31 k8sworker03 <none> <none>
5. Elasticsearch 版本升级
由于在试用期间发布了新版本7.6.0,我们需要确认一下关于版本升级的操作是否正常。
-
- 変更箇所
spec.version: 7.5.2 -> 7.6.0 に変更するのみ
apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
name: quickstart
spec:
version: 7.6.0
nodeSets:
- name: default
count: 3
config:
node.master: true
node.data: true
node.ingest: true
node.store.allow_mmap: false
volumeClaimTemplates:
- metadata:
name: elasticsearch-data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 50Gi
storageClassName: standard
当应用上述的YAML文件时,可以确认以下操作。
-
- 動作
Apply 前の VERSION は 7.5.2 であり、Apply 完了後の VERSION は 7.6.0 になっている ($kubectl get es)
Upgrade 順番 ($ kubectl get po -o wide -w)
Pod が処理される順番: quickstart-es-default-2 -> quickstart-es-default-1 -> quickstart-es-default-0
Pod の状態遷移: Running(1/1) -> Terminating -> Pending -> Init:0/1 -> PodInitializing -> Running(0/1) -> Running(1/1)
$ kubectl get es
NAME HEALTH NODES VERSION PHASE AGE
quickstart green 3 7.5.2 Ready 25m
$ kubectl apply -f elasticsearch-quickstart-pv.yaml
elasticsearch.elasticsearch.k8s.elastic.co/quickstart configured
$ kubectl get po -o wide -w
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINE
SS GATES
quickstart-es-default-0 1/1 Running 0 25m 10.233.65.103 k8sworker01 <none> <none>
quickstart-es-default-1 1/1 Running 0 18m 10.233.92.171 k8sworker02 <none> <none>
quickstart-es-default-2 1/1 Terminating 0 18m 10.233.110.31 k8sworker03 <none> <none>
quickstart-kb-6c88bdd64c-87w9l 1/1 Running 0 20m 10.233.65.104 k8sworker01 <none> <none>
quickstart-es-default-2 0/1 Terminating 0 18m 10.233.110.31 k8sworker03 <none> <none>
quickstart-es-default-2 0/1 Terminating 0 18m 10.233.110.31 k8sworker03 <none> <none>
quickstart-es-default-2 0/1 Terminating 0 18m 10.233.110.31 k8sworker03 <none> <none>
quickstart-es-default-2 0/1 Pending 0 0s <none> <none> <none> <none>
quickstart-es-default-2 0/1 Pending 0 0s <none> k8sworker03 <none> <none>
quickstart-es-default-1 1/1 Running 0 19m 10.233.92.171 k8sworker02 <none> <none>
quickstart-es-default-2 0/1 Pending 0 1s <none> k8sworker03 <none> <none>
quickstart-es-default-0 1/1 Running 0 25m 10.233.65.103 k8sworker01 <none> <none>
quickstart-es-default-2 0/1 Init:0/1 0 1s <none> k8sworker03 <none> <none>
quickstart-es-default-2 0/1 PodInitializing 0 20s 10.233.110.32 k8sworker03 <none> <none>
quickstart-es-default-2 0/1 PodInitializing 0 20s 10.233.110.32 k8sworker03 <none> <none>
quickstart-es-default-0 1/1 Running 0 26m 10.233.65.103 k8sworker01 <none> <none>
quickstart-es-default-1 1/1 Running 0 19m 10.233.92.171 k8sworker02 <none> <none>
quickstart-es-default-1 1/1 Running 0 19m 10.233.92.171 k8sworker02 <none> <none>
quickstart-es-default-2 0/1 PodInitializing 0 20s 10.233.110.32 k8sworker03 <none> <none>
quickstart-es-default-0 1/1 Running 0 26m 10.233.65.103 k8sworker01 <none> <none>
quickstart-es-default-2 0/1 Running 0 21s 10.233.110.32 k8sworker03 <none> <none>
quickstart-es-default-2 1/1 Running 0 33s 10.233.110.32 k8sworker03 <none> <none>
quickstart-es-default-1 1/1 Terminating 0 20m 10.233.92.171 k8sworker02 <none> <none>
quickstart-es-default-1 0/1 Terminating 0 20m 10.233.92.171 k8sworker02 <none> <none>
quickstart-es-default-1 0/1 Terminating 0 20m 10.233.92.171 k8sworker02 <none> <none>
quickstart-es-default-1 0/1 Terminating 0 20m 10.233.92.171 k8sworker02 <none> <none>
quickstart-es-default-1 0/1 Pending 0 0s <none> <none> <none> <none>
quickstart-es-default-1 0/1 Pending 0 0s <none> k8sworker02 <none> <none>
quickstart-es-default-0 1/1 Running 0 27m 10.233.65.103 k8sworker01 <none> <none>
quickstart-es-default-1 0/1 Pending 0 1s <none> k8sworker02 <none> <none>
quickstart-es-default-2 1/1 Running 0 71s 10.233.110.32 k8sworker03 <none> <none>
quickstart-es-default-1 0/1 Init:0/1 0 1s <none> k8sworker02 <none> <none>
quickstart-es-default-1 0/1 Init:0/1 0 11s 10.233.92.172 k8sworker02 <none> <none>
quickstart-es-default-1 0/1 Init:0/1 0 11s 10.233.92.172 k8sworker02 <none> <none>
quickstart-es-default-2 1/1 Running 0 81s 10.233.110.32 k8sworker03 <none> <none>
quickstart-es-default-0 1/1 Running 0 27m 10.233.65.103 k8sworker01 <none> <none>
quickstart-es-default-1 0/1 Init:0/1 0 12s 10.233.92.172 k8sworker02 <none> <none>
quickstart-es-default-2 1/1 Running 0 82s 10.233.110.32 k8sworker03 <none> <none>
quickstart-es-default-0 1/1 Running 0 27m 10.233.65.103 k8sworker01 <none> <none>
quickstart-es-default-1 0/1 PodInitializing 0 12s 10.233.92.172 k8sworker02 <none> <none>
quickstart-es-default-1 0/1 Running 0 13s 10.233.92.172 k8sworker02 <none> <none>
quickstart-es-default-1 1/1 Running 0 27s 10.233.92.172 k8sworker02 <none> <none>
quickstart-es-default-0 1/1 Terminating 0 27m 10.233.65.103 k8sworker01 <none> <none>
quickstart-es-default-0 0/1 Terminating 0 28m <none> k8sworker01 <none> <none>
quickstart-es-default-1 1/1 Running 0 61s 10.233.92.172 k8sworker02 <none> <none>
quickstart-es-default-2 1/1 Running 0 2m11s 10.233.110.32 k8sworker03 <none> <none>
quickstart-es-default-0 0/1 Terminating 0 28m <none> k8sworker01 <none> <none>
quickstart-es-default-0 0/1 Terminating 0 28m <none> k8sworker01 <none> <none>
quickstart-es-default-0 0/1 Terminating 0 28m <none> k8sworker01 <none> <none>
quickstart-es-default-0 0/1 Terminating 0 28m <none> k8sworker01 <none> <none>
quickstart-es-default-0 0/1 Terminating 0 28m <none> k8sworker01 <none> <none>
quickstart-es-default-0 0/1 Pending 0 0s <none> <none> <none> <none>
quickstart-es-default-0 0/1 Pending 0 0s <none> k8sworker01 <none> <none>
quickstart-es-default-0 0/1 Init:0/1 0 1s <none> k8sworker01 <none> <none>
quickstart-es-default-0 0/1 PodInitializing 0 6s 10.233.65.105 k8sworker01 <none> <none>
quickstart-es-default-0 0/1 PodInitializing 0 6s 10.233.65.105 k8sworker01 <none> <none>
quickstart-es-default-1 1/1 Running 0 74s 10.233.92.172 k8sworker02 <none> <none>
quickstart-es-default-2 1/1 Running 0 2m24s 10.233.110.32 k8sworker03 <none> <none>
quickstart-es-default-0 0/1 PodInitializing 0 6s 10.233.65.105 k8sworker01 <none> <none>
quickstart-es-default-1 1/1 Running 0 74s 10.233.92.172 k8sworker02 <none> <none>
quickstart-es-default-2 1/1 Running 0 2m24s 10.233.110.32 k8sworker03 <none> <none>
quickstart-es-default-0 0/1 Running 0 7s 10.233.65.105 k8sworker01 <none> <none>
quickstart-es-default-0 1/1 Running 0 21s 10.233.65.105 k8sworker01 <none> <none>
$ kubectl get es
NAME HEALTH NODES VERSION PHASE AGE
quickstart green 3 7.6.0 Ready 28m
$ kubectl get po -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
quickstart-es-default-0 1/1 Running 0 40s 10.233.65.105 k8sworker01 <none> <none>
quickstart-es-default-1 1/1 Running 0 108s 10.233.92.172 k8sworker02 <none> <none>
quickstart-es-default-2 1/1 Running 0 2m58s 10.233.110.32 k8sworker03 <none> <none>
quickstart-kb-6c88bdd64c-87w9l 1/1 Running 0 24m 10.233.65.104 k8sworker01 <none> <none>
通过ECK运算符的节点编排功能,此操作能够安全地升级,具体如下所示。
-
- ECK Operator での Upgrade 動作
ノードが削除される前に、関連データは他のノードに移行
クラスタ・トポロジが変化したとき、Elasticsearch オーケストレーション設定は下記に応じて調整
discovery.seed_hosts
cluster.initial_master_nodes
discovery.zen.minimum_master_nodes
_cluster/voting_config_exclusions
ローリングアップグレードは安全に実行され、アップグレードされた Elasticsearch ノードは PersistentVolumes を再利用
删除 PVC 操作与 StatefulSet 的差异
请用中文将以下内容改写成同义句。
当删除使用的Elasticesearch时,自动生成的PVC也被删除了。(在StatefulSet中,PVC不会被删除)
由于StatefulSet的不同,我认为需要注意以下事项。
-
- 削除して再 Create した場合、StatefulSet とは異なり、PVCが再生成され、別PVがアサインされる可能性がある
- Retain ポリシーの場合、使用していた PV は Released 状態となり再利用するには対応が必要 (PersistentVolume で provisioner 未対応だと Recycle/Deleteが環境によって対応できず、削除・解放などの工夫が必要になると思われる)
因为首先已经删除了Elasticsearch,所以将连带删除相关的PVC,这并不是一个问题,只需要将其视为操作上的区别即可。
行为
在下面使用的 yaml 中执行删除操作,可以确认如下操作。
-
- delete 時動作
PVC が削除されている ($ kubectl get pvc)
PV がリリースされている ($ kubectl get pv)
$ kubectl get po
NAME READY STATUS RESTARTS AGE
quickstart-es-default-0 1/1 Running 0 51m
quickstart-es-default-1 1/1 Running 0 52m
quickstart-es-default-2 1/1 Running 0 54m
$ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
elasticsearch-data-quickstart-es-default-0 Bound iscsi-50g-pv05 50Gi RWO standard 80m
elasticsearch-data-quickstart-es-default-1 Bound iscsi-50g-pv06 50Gi RWO standard 73m
elasticsearch-data-quickstart-es-default-2 Bound iscsi-50g-pv04 50Gi RWO standard 73m
$ kubectl delete -f elasticsearch-eck-pvc.yaml
elasticsearch.elasticsearch.k8s.elastic.co "quickstart" deleted
$ kubectl get po
NAME READY STATUS RESTARTS AGE
quickstart-es-default-0 1/1 Terminating 0 52m
quickstart-es-default-1 1/1 Terminating 0 53m
quickstart-es-default-2 1/1 Terminating 0 54m
$ kubectl get po
NAME READY STATUS RESTARTS AGE
quickstart-es-default-0 0/1 Terminating 0 52m
[suzuyu@k8smaster01 elastic]$ k get po
NAME READY STATUS RESTARTS AGE
quickstart-es-default-0 0/1 Terminating 0 52m
$ kubectl get po
NAME READY STATUS RESTARTS AGE
quickstart-es-default-0 0/1 Terminating 0 52m
$ kubectl get po
No resources found in default namespace.
$ kubectl get pvc
No resources found in default namespace.
$ kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
iscsi-50g-pv04 50Gi RWO Retain Released default/elasticsearch-data-quickstart-es-default-2 standard 81m
iscsi-50g-pv05 50Gi RWO Retain Released default/elasticsearch-data-quickstart-es-default-0 standard 81m
iscsi-50g-pv06 50Gi RWO Retain Released default/elasticsearch-data-quickstart-es-default-1 standard 81m
确认事实
-
- Scale / Upgrade は 1箇所記載を変更して Apply するだけで Operator がよしなに安全に実施してくれた
-
- ストレージ
ストレージ(PV)を ECK に合った形で準備する必要がある(環境によると思うが)
StatefulSet のように volumeClaimTemplate で PVC 作成可能だが、削除時に PVC も消える
Secret をデフォルトで準備してくれるので TLS 対応がデフォルトでされている
最后
通过使用ECK的QuickStart和VersionUp,我们能够确认Elasticsearch/Kibana在ECK上的构建和运行。未来我们计划在ECK/ElasticStack上,在本地的Kubernetes上搭建可观察性(日志、指标、追踪)环境,并进行下一步的实施。