在本地环境中进行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.)
步骤如下:

    1. 在您的 Kubernetes 集群中部署 ECK Operator

 

    1. 部署 Elasticsearch 集群

 

    1. 部署 Kibana 实例

 

    1. 进行 Elasticsearch 部署数的更改测试

 

    1. 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. 点击「登录」按钮

スクリーンショット 2020-02-14 14.50.38.png

登录认证之后

如果验证成功,则会跳转到以下页面。

スクリーンショット 2020-02-14 14.55.16.png

我已成功部署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上搭建可观察性(日志、指标、追踪)环境,并进行下一步的实施。

广告
将在 10 秒后关闭
bannerAds