在本地环境中进行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上搭建可观察性(日志、指标、追踪)环境,并进行下一步的实施。
 
    