エックの紹介
Elastic Cloud on Kubernetes (ECK) は、kubernetes オペレーターに基づいて、Elasticsearch、Kibana、および APM サーバー サービスを Kubernetes クラスターに自動的にデプロイ、管理、調整できます。
ECK の機能は、Kubernetes 上での Elasticsearch と Kibana のデプロイメントを簡素化するタスクに決して限定されるわけではなく、次のようなすべての運用後の作業を簡素化することに重点を置いています。
- 複数のクラスターの管理と監視
- 新しいクラスターのバージョンに簡単にアップグレード
- クラスター容量の拡張または縮小
- クラスター構成の変更
- ローカル ストレージの動的サイズ変更 (Elastic Local Volume、ローカル ストレージ ドライブを含む)
- バックアップを実行する
ECK で起動されるすべての Elasticsearch クラスターはデフォルトで保護されています。つまり、最初の作成時に暗号化が有効になり、強力なデフォルトのパスワードで保護されます。
公式ウェブサイト:https ://www.elastic.co/cn/elastic-cloud-kubernetes
プロジェクトアドレス: https://github.com/elastic/cloud-on-k8s
ECKの導入
参考:
https://www.elastic.co/guide/en/cloud-on-k8s/current/k8s-quickstart.html
https://github.com/elastic/cloud-on-k8s/tree/master/config/recipes/beats
https://www.elastic.co/guide/en/cloud-on-k8s/current/k8s-volume-claim-templates.html
https://github.com/elastic/cloud-on-k8s/tree/master/config/samples
環境情報:
3 つのノードを準備します。ここでは、ポッドをスケジュールするようにマスター ノードを構成します。
[root@master01 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master01 Ready master 7d v1.18.2
node01 Ready <none> 7d v1.18.2
node02 Ready <none> 7d v1.18.2
eck 導入バージョン:eck v1.1.0
NFSストレージを準備する
eck データは永続化する必要があります。簡単なテストには emptydir タイプの一時ボリュームを使用することも、nfs や rook などの永続ストレージを使用することもできます。テストとして、docker を使用して nfs サーバーを master01 ノードに一時的にデプロイしますPVC に必要なストレージ リソースを提供します。
docker run -d
--name nfs-server
--privileged
--restart always
-p 2049:2049
-v /nfs-share:/nfs-share
-e SHARED_DIRECTORY=/nfs-share
itsthenetwork/nfs-server-alpine:latest
nfs-client-provisioner をデプロイし、nfs ストレージ リソースを動的に適用します。192.168.93.11 は master01 ノードの IP アドレスです。nfsv4 バージョンの nfs.path は / として指定できます。
ここでは、helm を使用して、Alibaba Cloud Helm ウェアハウスから nfs-client-provisioner をデプロイします。
helm repo add apphub https://apphub.aliyuncs.com
helm install nfs-client-provisioner
–set nfs.server=192.168.93.11
–set nfs.path=/
apphub/nfs-client-provisioner
作成された storageClass を表示します。デフォルト名は nfs-client です。この名前は、以下で elasticsearch をデプロイするときに使用されます。
[root@master01 ~]# kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
nfs-client cluster.local/nfs-client-provisioner Delete Immediate true 172m
すべてのノードに nfs クライアントをインストールし、rpcbind サービスを有効にします。
yum install -y nfs-utils
systemctl enable --now rpcbind
eck オペレーターをインストールする
バージョン 1.1.0 をデプロイします
kubectl apply -f https://download.elastic.co/downloads/eck/1.1.0/all-in-one.yaml
作成されたポッドを表示する
[root@master01 ~]# kubectl -n elastic-system get pods
NAME READY STATUS RESTARTS AGE
elastic-operator-0 1/1 Running 1 17m
作成された crd を表示する apmserver、elasticsearche、kibana の 3 つの crd が作成されました。
[root@master01 ~]# kubectl get crd | grep elastic
apmservers.apm.k8s.elastic.co 2020-04-27T16:23:08Z
elasticsearches.elasticsearch.k8s.elastic.co 2020-04-27T16:23:08Z
kibanas.kibana.k8s.elastic.co 2020-04-27T16:23:08Z
es と kibana をデプロイする
リリース バージョンのサンプル yaml を github でローカルにダウンロードします。バージョン 1.1.0 はここからダウンロードします。
curl -LO https://github.com/elastic/cloud-on-k8s/archive/1.1.0.tar.gz
tar -zxf cloud-on-k8s-1.1.0.tar.gz
cd cloud-on-k8s-1.1.0/config/recipes/beats/
名前空間の作成
kubectl apply -f 0_ns.yaml
es と kibana をデプロイします。数は 3 で、3 つの es ノードのデプロイを指定します。初期段階で 1 つのノードをデプロイし、その後容量を拡張することもできます。storageClassName を nfs-client として指定し、http 部分を追加しますサービスタイプをnodePortとして指定します。
$ cat 1_monitor.yaml
apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
name: monitor
namespace: beats
spec:
version: 7.6.2
nodeSets:
- name: mdi
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: nfs-client
http:
service:
spec:
type: NodePort
---
apiVersion: kibana.k8s.elastic.co/v1
kind: Kibana
metadata:
name: monitor
namespace: beats
spec:
version: 7.6.2
count: 1
elasticsearchRef:
name: "monitor"
http:
service:
spec:
type: NodePort
yaml ファイルを実行して es と kibana をデプロイする
kubectl apply -f 1_monitor.yaml
イメージを取得できない場合は、手動で dockerhub イメージに置き換えることができます。
docker pull elastic/elasticsearch:7.6.2
docker pull elastic/kibana:7.6.2
docker tag elastic/elasticsearch:7.6.2 docker.elastic.co/elasticsearch/elasticsearch:7.6.2
docker tag elastic/kibana:7.6.2 docker.elastic.co/kibana/kibana:7.6.2
ヘルスステータス、バージョン、ノード数など、作成された Elasticsearch および kibana リソースを表示します。
[root@master01 ~]# kubectl get elasticsearch
NAME HEALTH NODES VERSION PHASE AGE
quickstart green 3 7.6.2 Ready 77m
[root@master01 ~]# kubectl get kibana
NAME HEALTH NODES VERSION AGE
quickstart green 1 7.6.2 137m
作成されたポッドを表示します。
[root@master01 ~]# kubectl -n beats get pods
NAME READY STATUS RESTARTS AGE
monitor-es-mdi-0 1/1 Running 0 109s
monitor-es-mdi-1 1/1 Running 0 9m
monitor-es-mdi-2 1/1 Running 0 3m26s
monitor-kb-54cbdf6b8c-jklqm 1/1 Running 0 9m
作成したPVとPVCを表示する
[root@master01 ~]# kubectl -n beats get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
elasticsearch-data-monitor-es-mdi-0 Bound pvc-882be3e2-b752-474b-abea-7827b492d83d 10Gi RWO nfs-client 3m33s
elasticsearch-data-monitor-es-mdi-1 Bound pvc-8e6ed97e-7524-47f5-b02c-1ff0d2af33af 10Gi RWO nfs-client 3m33s
elasticsearch-data-monitor-es-mdi-2 Bound pvc-31b5f80d-8fbd-4762-ab69-650eb6619a2e 10Gi RWO nfs-client 3m33s
[root@master01 ~]# kubectl -n beats get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pvc-31b5f80d-8fbd-4762-ab69-650eb6619a2e 50Gi RWO Delete Bound beats/elasticsearch-data-monitor-es-mdi-2 nfs-client 3m35s
pvc-882be3e2-b752-474b-abea-7827b492d83d 50Gi RWO Delete Bound beats/elasticsearch-data-monitor-es-mdi-0 nfs-client 3m35s
pvc-8e6ed97e-7524-47f5-b02c-1ff0d2af33af 50Gi RWO Delete Bound beats/elasticsearch-data-monitor-es-mdi-1 nfs-client 3m35s
実際のデータは、master01 ノード/nfs-share ディレクトリに保存されます。
[root@master01 ~]# tree /nfs-share/ -L 2
/nfs-share/
├── beats-elasticsearch-data-monitor-es-mdi-0-pvc-250c8eef-4b7e-4230-bd4f-36b911a1d61b
│ └── nodes
├── beats-elasticsearch-data-monitor-es-mdi-1-pvc-c1a538df-92df-4a8e-9b7b-fceb7d395eab
│ └── nodes
└── beats-elasticsearch-data-monitor-es-mdi-2-pvc-dc21c1ba-4a17-4492-9890-df795c06213a
└── nodes
作成されたサービスを確認します。デプロイメント中に、クラスターの外部からのアクセスを容易にするために、es および kibana サービス タイプが NodePort に変更されました。
[root@master01 ~]# kubectl -n beats get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
monitor-es-http NodePort 10.96.82.186 <none> 9200:31575/TCP 9m36s
monitor-es-mdi ClusterIP None <none> <none> 9m34s
monitor-kb-http NodePort 10.97.213.119 <none> 5601:30878/TCP 9m35s
デフォルトでは、elasticsearch では認証が有効になっています。elastic ユーザーのパスワードを取得します。
PASSWORD=$(kubectl -n beats get secret monitor-es-elastic-user -o=jsonpath='{.data.elastic}' | base64 --decode)
echo $PASSWORD
elasticsearch にアクセス
ブラウザーアクセスの elasticsearch:
https://192.168.93.11:31575/
または、Kubernetes クラスター内から elasticsearch エンドポイントにアクセスします。
[root@master01 ~]# kubectl run -it --rm centos--image=centos -- sh
sh-4.4#
sh-4.4# PASSWORD=gf4mgr5fsbstwx76b8zl8m2g
sh-4.4# curl -u "elastic:$PASSWORD" -k "https://monitor-es-http:9200"
{
"name" : "quickstart-es-default-2",
"cluster_name" : "quickstart",
"cluster_uuid" : "mrDgyhp7QWa7iVuY8Hx6gA",
"version" : {
"number" : "7.6.2",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
"build_date" : "2020-03-26T06:34:37.794943Z",
"build_snapshot" : false,
"lucene_version" : "8.4.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
kibanaにアクセスします
ブラウザでkibanaにアクセスします ユーザーのパスワードはelasticsearchと同じです Explore on my ownを選択します まだインデックスが作成されていないことがわかります
https://192.168.93.11:30878/
ファイルビートをデプロイする
dockerhub イメージを使用すると、バージョンが 7.6.2 に変更されます。
sed -i 's#docker.elastic.co/beats/filebeat:7.6.0#elastic/filebeat:7.6.2#g' 2_filebeat-kubernetes.yaml
kubectl apply -f 2_filebeat-kubernetes.yaml
作成されたポッドを表示する
[root@master01 beats]# kubectl -n beats get pods -l k8s-app=filebeat
NAME READY STATUS RESTARTS AGE
filebeat-dctrz 1/1 Running 0 9m32s
filebeat-rgldp 1/1 Running 0 9m32s
filebeat-srqf4 1/1 Running 0 9m32s
イメージを取得できない場合は、手動で取得できます。
docker pull elastic/filebeat:7.6.2
docker tag elastic/filebeat:7.6.2 docker.elastic.co/beats/filebeat:7.6.2
docker pull elastic/metricbeat:7.6.2
docker tag elastic/metricbeat:7.6.2 docker.elastic.co/beats/metricbeat:7.6.2
kibana にアクセスすると、filebeat インデックスを検索し、インデックス パターンを入力し、@timestrap を選択してインデックスを作成できます。
収集されたログを表示する
メトリックビートをデプロイする
sed -i 's#docker.elastic.co/beats/metricbeat:7.6.0#elastic/metricbeat:7.6.2#g' 3_metricbeat-kubernetes.yaml
作成されたポッドを表示する
[root@master01 beats]# kubectl -n beats get pods -l k8s-app=metricbeat
NAME READY STATUS RESTARTS AGE
metricbeat-6956d987bb-c96nq 1/1 Running 0 76s
metricbeat-6h42f 1/1 Running 0 76s
metricbeat-dzkxq 1/1 Running 0 76s
metricbeat-lffds 1/1 Running 0 76s
この時点で、kibana にアクセスすると、インデックスに metricbeat が追加されていることがわかります。