CentOS 7.6上のMicrok8s環境でEFKスタック(Elasticsearch,Fluentd,Kibana)を利用してコンテナログを取得・可視化【2】
microk8s環境にefkスタックをデプロイする
以下の⑤-⑦を紹介する。⓪-④は【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"を選択する
"Index Patterns"を選択する
Index作成画面のindex patternsに"logstash-*"と入力し、"Next step"を選択する
"Time Filter field name"から"@timestamp"を選択し、"Create index pattern"を選択する。
Indexが作成された。
ログを確認する。画面左ペインの"Discover"を選択する。
ログの収集状況が確認できる。
テストアプリのログを確認。
以上。