search
LoginSignup
7
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

ECK(Elastic Cloud on Kubernetes) オンプレ動作確認

はじめに

ElasticStack の Kubernetes Operator である Elastic Cloud on Kubernetes (ECK) が 1.0 でリリースされた。(2020.01.16)

これまでは オンプレサーバで、docker/docker-compose で ElasticStack を利用してきたが、
Kubernetes での利用を視野にオンプレ環境で ECK の動作確認を実施した。

Elastic Cloud on Kubernetes

ElasticStack を Kuberetes 上で Operator を使用して構築・運用が可能。

ECK Support Version

ECK 1.0 でのサポートバージョン(2020.02.01時点)

  • kubectl 1.11+
  • Kubernetes 1.12+ or OpenShift 3.11+
  • Elastic Stack: 6.8+, 7.1+

Operator

Operatorで対応している項目は下記の通り (2020.02.07時点.Operator.io記載引用)

[要約]

  • 構築は、Elasticsearch, Kinaba, APMserver に対応している。(Beats には未対応)
  • TLS認証を管理してくれる。
  • クラスタの変更に Elasticsearch クラスタを安全に変更してくれる。
  • ボリュームに関しては、PVを使用するので、PVC等に対応できるPVを用意しないといけない。
  • セキュリティ設定 (色々な secret の準備) は Operator で実施してくれる。

TLS とかパスワードとか設定を管理・構築してくれ、
DB 部分 (Elasticsearch クラスタ) も安全に処理してくれて便利な感じ。
ただ、クラスタ自体のオブザーバビリティ取得のため beats を入れるなどは operator ではそこまでしてくれないようです。

環境・Version

kubernetes

kubespray で構築した k8s上で構築する。(intel nuc + ESXi + CentOS7 + kubespray)
Version : v1.16.3
詳細構成は下記記事の環境。
https://qiita.com/suzuyui/items/e7531fe5e1e84c061b23

Storage

PersistentVolume (PV) としては QNAP で構築した iSCSI を使用している。
途中で記載するが、これを最初に用意せずに PV 無しでテストして途中で失敗する。(当たり前だが…)
詳細構成は下記記事の環境。
https://qiita.com/suzuyui/items/0efa505f3db03390f181

ElasticStack

Version: 7.5.2 and 7.6.0
本確認中に 7.6.0 がリリースされたため、最初は 7.5.2 で実施し、7.6.0 に Upgrade も実施した。

ECK

Version: 1.0.0

今回の実施内容

公式ページ記載のQuickStartの 1.~4. なぞって実施してみる。
次に、Elasticsearch の Version Upgrade も実施する。(5.)
最後に Elasticsearch の delete を実施すると PVC も消える動作が確認できたのでそれも記載する。(6.)
ステップは下記の通り。

  1. ECK Operator 導入 (Deploy ECK in your Kubernetes cluster)
  2. Elasticsearch の構築 (Deploy an Elasticsearch cluster)
  3. Kibana の構築 (Deploy a Kibana instance)
  4. Elasticsearch 構築数の変更テスト(Upgrade your deployment)
  5. Elasticsearch の Version Upgrade
  6. Elasticsearch の delete 動作確認

1. ECK Operator 導入 (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

Operatorのログの確認方法 (たくさんのログが出ます)

$ 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"}

2. Elasticsearch の構築 (Deploy an Elasticsearch cluster)

まずは quickstart 記載のママの下記 yaml を apply する。

elasticsearch-quickstart.yaml
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アサインでの失敗

状態を確認するとずっとHEALTHが unknown 。。。

$ kubectl get elasticsearch
NAME         HEALTH    NODES   VERSION   PHASE             AGE
quickstart   unknown           7.5.2     ApplyingChanges   109s

※ elasticsearch は es で短縮可能 (kubectl get es が上記と同様)

切り分け

起動podを確認して、そのdescribe情報での 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)

公式トラブルシュート

Elasticサイトに記載あり

以下抜粋。
If you see an error with unbound persistent volume claims (PVCs), it means there is not currently a persistent volume that can satisfy the claim.

ECK Operator が作成する PVC に適応する PV がないとだめらしい。(当たり前ですね。。)

今回の問題点と対処

  • PVを用意してなかった。 → 「環境」項目に記載してある QNAPで作成した
  • PVC がうまくいかない → 次の項目「volumeClaimTemplate の追記」で対処する

volumeClaimTemplate の追記

マニフェスト (yaml) に追加で volumeClaimTemplate を記載してあげる。
書き方は公式サイトを参照:https://www.elastic.co/guide/en/cloud-on-k8s/current/k8s-volume-claim-templates.html

事象改善できるパターンは2つ。
A. 環境のPVにあった volumeClaimTemplate を書いてあげる
B. emptyDir にしてしまう

A. 環境のPVにあった volumeClaimTemplate を書いてあげる

公式サイトを参考に自身にあった書き方で追記する。
下記は自環境での例。

elasticsearch-quickstart-pv.yaml
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 は参考)

B. emptyDir にしてしまう

vloume 自体を永続化しないのであれば、emptyDirで対処することも可能。
(こちらはデータ消失の可能性もあるので非推奨。テスト環境で動き見るだけならばOK)

elasticsearch-quickstart-emptydir.yaml
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 準備後の再 Apply

PV/PVC 対応を実施し、再度 kubectl apply を実行

$ kubectl apply -f elasticsearch-quickstart-pv.yaml
elasticsearch.elasticsearch.k8s.elastic.co/quickstart created

下記の通り、今回はデプロイが成功したことが確認できる。
(pod は Running, PVC は Bound, elasticsearch は Ready)

$ 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. Deploy

quickstart 記載通りの下記 yaml にて kibana を構築する。

kibana-quickstart.yaml
apiVersion: kibana.k8s.elastic.co/v1
kind: Kibana
metadata:
  name: quickstart
spec:
  version: 7.5.2
  count: 1
  elasticsearchRef:
    name: quickstart

applyする。

$ kubectl apply -f kibana.yaml 
kibana.kibana.k8s.elastic.co/quickstart created

時間が経つと HEALTH が green となる。
(最初は Readiness probe が failed になるが時間が経つと greenになるので待つ)

$ 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 Access

Kibana へ Web ブラウザでアクセス・ログインできることを確認する。

Service

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

PortForward

自動作成された SVC へ kubectl port-forward を使用して、手元環境へポートフォワードする。

$ kubectl port-forward service/quickstart-kb-http 5601
Forwarding from 127.0.0.1:5601 -> 5601
Forwarding from [::1]:5601 -> 5601

Password

ログインに必要なパスワードは、Operator が自動で elastic ユーザで secret が作成されているので、
下記で 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. Username は「elastic」
3. Password は一つ前で secret から取得したパスワード (本記載では pd7fxj899v8lsgh2ks4rkfjr これは 環境により異なるので注意)
4. 「Log in」をクリック

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

ログイン認証後

認証が上手くいけば、下記のようなページに遷移する。

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

KibanaをデプロイしWebアクセス・認証まで確認できた

4. Elasticsearch 構築数の変更テスト(Upgrade your deployment)

Elasticsearch 数を 1 -> 3 に変更してElasticsearch の数をスケールさせる動作を確認する。

  • 変更箇所
    • spec.nodeSets[].count: 1 -> 3 に変更するのみ
elasticsearch-quickstart-pv.yaml
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

最終的には NODES が 3 となっていることまで確認できた。
下記で 3 つの elasticsearch の quickstart の Pod が Running 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 の Version Upgrade

試している期間に 7.6.0 が新しくリリースされたので VersionUp についても動作を確認する。

  • 変更箇所
    • spec.version: 7.5.2 -> 7.6.0 に変更するのみ
elasticsearch-quickstart-pv.yaml
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 すると下記の動作を確認できた。

  • 動作
    • 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 Operator の Node Orchestrationによって、下記のように安全に Upgrade している。

  • ECK Operator での Upgrade 動作
    • ノードが削除される前に、関連データは他のノードに移行
    • クラスタ・トポロジが変化したとき、Elasticsearch オーケストレーション設定は下記に応じて調整
      • discovery.seed_hosts
      • cluster.initial_master_nodes
      • discovery.zen.minimum_master_nodes
      • _cluster/voting_config_exclusions
    • ローリングアップグレードは安全に実行され、アップグレードされた Elasticsearch ノードは PersistentVolumes を再利用

delete 時の PVC 動作の StatefulSet との違い

内容

今回使用した Elasticesearch を Delete した際に、
自動生成されていた PVC も削除された。(StatefulSet では PVC は削除されない)
これは StatefulSet は異なるため、下記の注意が必要だと思われる。

  • 削除して再 Create した場合、StatefulSet とは異なり、PVCが再生成され、別PVがアサインされる可能性がある
  • Retain ポリシーの場合、使用していた PV は Released 状態となり再利用するには対応が必要 (PersistentVolume で provisioner 未対応だと Recycle/Deleteが環境によって対応できず、削除・解放などの工夫が必要になると思われる)

そもそも Elasticsearch を削除しているので、紐づく PVC も一緒に削除してくれるので問題ではなく、動作の違いとして認識すればいい感じかと思う。

動作

下記に使用していた yaml で delete を実施すると下記の動作が確認できる。

  • 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 などを通して、ECK による Elasticsearch/Kibana の構築・動作の確認を実施できた。
今後は、ECK / ElasticStack でオブザーバビリティ(ログ・メトリクス・トレーシング)環境を、オンプレ Kubernetes 上で構築をしたかったので、次にそちらを実施していく予定。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
7
Help us understand the problem. What are the problem?