CentOS 7.6上のMicrok8s環境でEFKスタック(Elasticsearch,Fluentd,Kibana)を利用してコンテナログを取得・可視化【2】

microk8s環境にefkスタックをデプロイする


f:id:sota0113:20190529220225p:plain



以下の⑤-⑦を紹介する。⓪-④は【1】を参照。

ステップ⓪コンポーネント紹介
ステップ①dockerを導入する
ステップ②microk8sをCentOSに導入する
ステップ③dockerイメージを取得してmicrok8sのプライベートイメージリポジトリにプッシュする
ステップ④microk8sでビルドしたイメージを動かす。
====ここから====
ステップ⑤elasticsearchをデプロイする
ステップ⑥kibanaをデプロイする
ステップ⑦fluentdをデプロイする
====ここまで====



ステップ⑤elasticsearchをデプロイする

下準備として、k8sディレクトリ直下にefkディレクトリを作成する。

[nakanishi@elastic03 k8s]$ pwd
/home/nakanishi/k8s
[nakanishi@elastic03 k8s]$ mkdir efk
[nakanishi@elastic03 k8s]$ tree ./
./
├── efk
└── testapp
    ├── node-deployment.yaml
    └── sample-app
        ├── Dockerfile
        ├── fluentd-node-sample.tar
        ├── index.js
        ├── package.json
        └── package-lock.json

作成したディレクトリに移動し、各EFKコンポーネントディレクトリを作成する

[nakanishi@elastic03 k8s]$ cd efk/
[nakanishi@elastic03 efk]$ mkdir elasticsearch/
[nakanishi@elastic03 efk]$ mkdir kibana/
[nakanishi@elastic03 efk]$ mkdir fluentd/


EFKスタックのリソースはすべてネームスペースloggingにデプロイすることとする。
以下の通りネームスペースを作成する。

[nakanishi@elastic03 testapp]$ kubectl create ns logging
namespace/testing created

確認する

[nakanishi@elastic03 elasticsearch]$ kubectl get ns
NAME              STATUS   AGE
default           Active   3d3h
kube-node-lease   Active   3d3h
kube-public       Active   3d3h
kube-system       Active   3d3h
logging           Active   3d1h
[nakanishi@elastic03 elasticsearch]$


はじめにelasticsearchをデプロイする。elasticsearchディレクトリに移動する。

[nakanishi@elastic03 efk]$ cd elasticsearch/
[nakanishi@elastic03 elasticsearch]$

以下の内容でデプロイメントを作成する。

[nakanishi@elastic03 elasticsearch]$ cat esrch-deploy.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: elasticsearch
spec:
  selector:
    matchLabels:
      component: elasticsearch   #service側で同じlabelを設定
  template:
    metadata:
      labels:
        component: elasticsearch
    spec:
      containers:
      - name: elasticsearch
        image: docker.elastic.co/elasticsearch/elasticsearch:6.5.4
        env:
        - name: discovery.type  #※1
          value: single-node       #※2
        ports:
        - containerPort: 9200  #※3
          name: http
          protocol: TCP
        resources:
          limits:                          
            cpu: 500m
            memory: 2Gi
          requests:                
            cpu: 500m
            memory: 2Gi
[nakanishi@elastic03 elasticsearch]$

※1 参照Bootstrap Checks | Elasticsearch Reference [7.2] | Elastic
※2 自分自身をmasterとし、他のelasticsearchノードのクラスターに参加しない
※3 ElasticsearchへのデータのCRUD操作用のREST通信用port。9300はクラスター構成用のため今回不要。


fluentdがelasticsearchと通信する必要があるので、サービスリソースのyamlを作成する。

[nakanishi@elastic03 elasticsearch]$ cat esrch-svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: elasticsearch
  labels:
    service: elasticsearch #deployment側で同じlabelを設定
spec:
  type: ClusterIP
  selector:
    component: elasticsearch
  ports:
  - port: 9200      
    targetPort: 9200 
[nakanishi@elastic03 elasticsearch]$


elasticsearchのデプロイメントとサービスを作成する。

[nakanishi@elastic03 elasticsearch]$ kubectl apply -f esrch-deploy.yaml -n logging
[nakanishi@elastic03 elasticsearch]$ kubectl apply -f esrch-svc.yaml -n logging

pod確認

[nakanishi@elastic03 testapp]$ kubectl  get pod --all-namespaces   -w
NAMESPACE     NAME                                     READY   STATUS    RESTARTS   AGE
default       node-8684bdfccf-fnmps                    1/1     Running   0          32m
kube-system   kube-dns-6bfbdd666c-qrwlg                3/3     Running   0          3d
logging       elasticsearch-547ffbfdf-g7nwj            1/1     Running   0          3h30m
^C[nakanishi@elastic03 testapp]$

サービス確認

[nakanishi@elastic03 elasticsearch]$ kubectl  get svc --all-namespaces
NAMESPACE     NAME            TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
default       kubernetes      ClusterIP   10.152.183.1     <none>        443/TCP          3d3h
kube-system   kube-dns        ClusterIP   10.152.183.10    <none>        53/UDP,53/TCP    3d
logging       elasticsearch   ClusterIP   10.152.183.12    <none>        9200/TCP         3h22m

Elasticsearchのアクセス確認

[nakanishi@elastic03 efk]$ curl 10.152.183.12:9200
{
  "name" : "5mC6wtv",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "iitGV3QdSAS4hUK-ycitCA",
  "version" : {
    "number" : "6.5.4",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "d2ef93d",
    "build_date" : "2018-12-17T21:17:40.758843Z",
    "build_snapshot" : false,
    "lucene_version" : "7.5.0",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}


以上でElasticsearchのデプロイは完了。


ステップ⑥kibanaをデプロイする

続いてKibanaをデプロイする。


以下の内容でデプロイメントを作成する。

[nakanishi@elastic03 kibana]$ cat kibana-deploy.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: kibana
spec:
  selector:
    matchLabels:
      run: kibana
  template:
    metadata:
      labels:
        run: kibana
    spec:
      containers:
      - name: kibana
        image: docker.elastic.co/kibana/kibana:6.5.4
        env:
        - name: ELASTICSEARCH_URL  
          value: http://elasticsearch.logging:9200   #※4
        - name: XPACK_SECURITY_ENABLED        #※5


          value: "true"    #defaultでtrueとあるので設定しなくても良かったかも
        ports:
        - containerPort: 5601
          name: http
          protocol: TCP

※4 namespace名loggingのelasticsearch、portは9200で構成。
※5 Disableにするなとあるので。https://www.elastic.co/guide/en/kibana/6.7/security-settings-kb.html
Security Settings in Kibana | Kibana User Guide [6.7] | Elastic

以下の内容でサービスを作成する。

[nakanishi@elastic03 kibana]$ cat kibana-svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: kibana
  labels:
    service: kibana
spec:
  type: NodePort
  selector:
    run: kibana
  ports:
  - port: 5601
    targetPort: 5601

Kibanaのデプロイメントとサービスを作成する。

[nakanishi@elastic03 efk]$ kubectl apply -f kibana-deploy.yaml -n logging
deployment.extensions/kibana created
[nakanishi@elastic03 efk]$
[nakanishi@elastic03 efk]$ kubectl apply -f kibana-svc.yaml -n logging
service/kibana created
[nakanishi@elastic03 efk]$

確認する。

[nakanishi@elastic03 efk]$ kubectl get deploy --all-namespaces
NAMESPACE   NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
default     jpi-server-deployment   1/1     1            1           98m
logging     elasticsearch           1/1     1            1           12m
logging     kibana                  1/1     1            1           76s
[nakanishi@elastic03 efk]$
[nakanishi@elastic03 efk]$ kubectl get svc --all-namespaces
NAMESPACE   NAME            TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
default     jpi-service     ClusterIP   10.152.183.155   <none>        8080/TCP         92m
default     kubernetes      ClusterIP   10.152.183.1     <none>        443/TCP          105m
logging     elasticsearch   ClusterIP   10.152.183.95    <none>        9200/TCP         6m16s
logging     kibana          NodePort    10.152.183.167   <none>        5601:31713/TCP   22s
[nakanishi@elastic03 efk]$

デプロイ直後はコンソールにログインできないかもしれないが、このまま先の手順を実行する。(Kibanaの起動に暫く時間がかかるため)
以上でKibanaの導入は完了。

ステップ⑦fluentdをデプロイする

各ノードに対して(今回はシングルノード構成なので意識しなくて良い)DaemonSetとしてデプロイ。
今回はhelmでデプロイするので、helmを導入する。
helmはsnapで導入する。

[nakanishi@elastic03 fluentd]$ sudo snap install helm --classic
Warning: /var/lib/snapd/snap/bin was not found in your $PATH. If you've not restarted your session
         since you installed snapd, try doing that. Please see https://forum.snapcraft.io/t/9469
         for more details.

helm 2.14.0 from Snapcrafters installed
[nakanishi@elastic03 fluentd]$

[nakanishi@elastic03 fluentd]$ which helm
/var/lib/snapd/snap/bin/helm
[nakanishi@elastic03 fluentd]$

インストール完了。初期化。

https://helm.sh/docs/using_helm/#quickstart-guide

[nakanishi@elastic03 fluentd]$ helm init --history-max 200
Creating /home/nakanishi/.helm
Creating /home/nakanishi/.helm/repository
Creating /home/nakanishi/.helm/repository/cache
Creating /home/nakanishi/.helm/repository/local
Creating /home/nakanishi/.helm/plugins
Creating /home/nakanishi/.helm/starters
Creating /home/nakanishi/.helm/cache/archive
Creating /home/nakanishi/.helm/repository/repositories.yaml
Adding stable repo with URL: https://kubernetes-charts.storage.googleapis.com
Adding local repo with URL: http://127.0.0.1:8879/charts
$HELM_HOME has been configured at /home/nakanishi/.helm.

Tiller (the Helm server-side component) has been installed into your Kubernetes Cluster.

Please note: by default, Tiller is deployed with an insecure 'allow unauthenticated users' policy.
To prevent this, run `helm init` with the --tiller-tls-verify flag.
For more information on securing your installation see: https://docs.helm.sh/using_helm/#securing-your-helm-installation
[nakanishi@elastic03 fluentd]$

[nakanishi@elastic03 fluentd]$ helm version
Client: &version.Version{SemVer:"v2.14.0", GitCommit:"05811b84a3f93603dd6c2fcfe57944dfa7ab7fd0", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.14.0", GitCommit:"05811b84a3f93603dd6c2fcfe57944dfa7ab7fd0", GitTreeState:"clean"}
[nakanishi@elastic03 fluentd]$

デフォルトリポジトリの更新確認

[nakanishi@elastic03 fluentd]$ helm repo update			# Make sure we get the latest list of charts
Hang tight while we grab the latest from your chart repositories...
...Skip local chart repository
...Successfully got an update from the "stable" chart repository
Update Complete.
[nakanishi@elastic03 fluentd]$

今回fluentdは別デフォルトではない別のhelmリポジトリから利用する
https://github.com/kiwigrid/helm-charts
に従ってrepo追加。

[nakanishi@elastic03 ~]$ helm repo add kiwigrid https://kiwigrid.github.io
"kiwigrid" has been added to your repositories
[nakanishi@elastic03 ~]$


アップデート

[nakanishi@elastic03 ~]$ helm repo update
Hang tight while we grab the latest from your chart repositories...
...Skip local chart repository
...Successfully got an update from the "kiwigrid" chart repository
...Successfully got an update from the "stable" chart repository
Update Complete.
[nakanishi@elastic03 ~]$

デプロイ。
以下コマンド中の--setで、helmのパラメータを変更してデプロイしている。変更可能なパラメータは以下リンクを参照。
https://github.com/kiwigrid/helm-charts/tree/master/charts/fluentd-elasticsearch#configuration
以下コマンドの場合だと、ホスト名をelasticsearch.loggingに設定している。これはelasticsearchのサービスのサービス名.ネームスペース名で指定する。

[nakanishi@elastic03 ~]$ helm  --namespace logging install --name my-release kiwigrid/fluentd-elasticsearch --set elasticsearch.host=elasticsearch.logging
NAME:   my-release
LAST DEPLOYED: Tue May 28 05:57:54 2019
NAMESPACE: logging
STATUS: DEPLOYED

RESOURCES:
==> v1/ClusterRole
NAME                              AGE
my-release-fluentd-elasticsearch  1s

==> v1/ClusterRoleBinding
NAME                              AGE
my-release-fluentd-elasticsearch  1s

==> v1/ConfigMap
NAME                              DATA  AGE
my-release-fluentd-elasticsearch  6     1s

==> v1/DaemonSet
NAME                              DESIRED  CURRENT  READY  UP-TO-DATE  AVAILABLE  NODE SELECTOR  AGE
my-release-fluentd-elasticsearch  1        1        0      1           0          <none>         1s

==> v1/Pod(related)
NAME                                    READY  STATUS             RESTARTS  AGE
my-release-fluentd-elasticsearch-ztdvf  0/1    ContainerCreating  0         0s

==> v1/ServiceAccount
NAME                              SECRETS  AGE
my-release-fluentd-elasticsearch  1        1s


NOTES:
1. To verify that Fluentd has started, run:

  kubectl --namespace=logging get pods -l "app.kubernetes.io/name=fluentd-elasticsearch,app.kubernetes.io/instance=my-release"

THIS APPLICATION CAPTURES ALL CONSOLE OUTPUT AND FORWARDS IT TO elasticsearch . Anything that might be identifying,
including things like IP addresses, container images, and object names will NOT be anonymized.

[nakanishi@elastic03 ~]$

実行後に表示されたコマンドを実行してfluentdのpodの状態を確認する。

[nakanishi@elastic03 ~]$   kubectl --namespace=logging get pods -l "app.kubernetes.io/name=fluentd-elasticsearch,app.kubernetes.io/instance=my-release"
NAME                                     READY   STATUS    RESTARTS   AGE
my-release-fluentd-elasticsearch-ngf2b   1/1     Running   0          5h1m
[nakanishi@elastic03 ~]$


kibanaのエンドポイントにアクセスする。
Kibanaは以下の通りNodeportタイプでサービスを作成していたので、VMのIP:Nodeポート(以下の場合31713)でアクセスできる。

[nakanishi@elastic03 ~]$ kubectl  get svc --all-namespaces
NAMESPACE     NAME            TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
default       kubernetes      ClusterIP   10.152.183.1     <none>        443/TCP          3d5h
kube-system   kube-dns        ClusterIP   10.152.183.10    <none>        53/UDP,53/TCP    3d3h
kube-system   tiller-deploy   ClusterIP   10.152.183.229   <none>        44134/TCP        24h
logging       elasticsearch   ClusterIP   10.152.183.12    <none>        9200/TCP         6h7m
logging       kibana          NodePort    10.152.183.167   <none>        5601:31713/TCP   3d4h
[nakanishi@elastic03 ~]$

Kibanaコンソール画面の"Management"を選択する
f:id:sota0113:20190529201246p:plain

"Index Patterns"を選択する
f:id:sota0113:20190529201431p:plain

Index作成画面のindex patternsに"logstash-*"と入力し、"Next step"を選択する
f:id:sota0113:20190529201814p:plain

"Time Filter field name"から"@timestamp"を選択し、"Create index pattern"を選択する。
f:id:sota0113:20190529202302p:plain

Indexが作成された。
ログを確認する。画面左ペインの"Discover"を選択する。
f:id:sota0113:20190529202543p:plain


ログの収集状況が確認できる。
f:id:sota0113:20190529202746p:plain


テストアプリのログを確認。
f:id:sota0113:20190529202940p:plain


以上。