監視コンポーネントのデプロイ

1. Prometheusのデプロイ

Helmを使って設定されるDefault設定と、NIC、NSMのステータスを取得するために必要となるPrometheusの設定を追加します。

Prometheusについては以下のページを参照してください。

Prometheusの設定を確認します。

cat ~/f5j-nginx-observability-lab/prep/helm/prometheus-nginx-mesh-and-ingress-scrape-config.yaml
実行結果サンプル
 1- job_name: 'nginx-mesh-sidecars'
 2  kubernetes_sd_configs:
 3    - role: pod
 4  relabel_configs:
 5    - source_labels: [__meta_kubernetes_pod_container_name]
 6      action: keep
 7      regex: nginx-mesh-sidecar
 8    - action: labelmap
 9      regex: __meta_kubernetes_pod_label_nsm_nginx_com_(.+)
10    - action: labeldrop
11      regex: __meta_kubernetes_pod_label_nsm_nginx_com_(.+)
12    - action: labelmap
13      regex: __meta_kubernetes_pod_label_(.+)
14    - source_labels: [__meta_kubernetes_namespace]
15      action: replace
16      target_label: namespace
17    - source_labels: [__meta_kubernetes_pod_name]
18      action: replace
19      target_label: pod
20- job_name: 'nginx-plus-ingress'
21  kubernetes_sd_configs:
22    - role: pod
23  relabel_configs:
24    - source_labels: [__meta_kubernetes_pod_container_name]
25      action: keep
26      regex: nginx-plus-ingress
27    - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
28      action: keep
29      regex: true
30    - source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port]
31      action: replace
32      target_label: __address__
33      regex: (.+)(?::\d+);(\d+)
34      replacement: $1:$2
35    - source_labels: [__meta_kubernetes_namespace]
36      action: replace
37      target_label: namespace
38    - source_labels: [__meta_kubernetes_pod_name]
39      action: replace
40      target_label: pod
41    - action: labelmap
42      regex: __meta_kubernetes_pod_label_nsm_nginx_com_(.+)
43    - action: labeldrop
44      regex: __meta_kubernetes_pod_label_nsm_nginx_com_(.+)
45    - action: labelmap
46      regex: __meta_kubernetes_pod_label_(.+)
47    - action: labelmap
48      regex: __meta_kubernetes_pod_annotation_nsm_nginx_com_enable_(.+)
49  metric_relabel_configs:
50    - source_labels: [__name__]
51      regex: 'nginx_ingress_controller_upstream_server_response_latency_ms(.+)'
52      target_label: __name__
53      replacement: 'nginxplus_upstream_server_response_latency_ms$1'
54    - source_labels: [__name__]
55      regex: 'nginx_ingress_nginxplus(.+)'
56      target_label: __name__
57      replacement: 'nginxplus$1'
58    - source_labels: [service]
59      target_label: dst_service
60    - source_labels: [resource_namespace]
61      target_label: dst_namespace
62    - source_labels: [pod_owner]
63      regex: '(.+)\/(.+)'
64      target_label: dst_$1
65      replacement: $2
66    - action: labeldrop
67      regex: pod_owner
68    - source_labels: [pod_name]
69      target_label: dst_pod
  • 1行目がNGINX Service Meshの設定の設定です

  • 20行目がNGINX Ingress Controllerの設定です

この設定を --set-file extraScrapeConfigs のオプションで指定します。
kubernetes_sd_configsPod を指定し、PrometheusがPodのMetricsをScarpeします。詳細は以下のページを参照してください。

今回はテスト用途でPersistentVolumeを利用しないため、設定を無効にします

cat ~/f5j-nginx-observability-lab/prep/helm/prometheus-addvalue.yaml
実行結果サンプル
1alertmanager:
2  persistentVolume:
3    enabled: false
4  persistence:
5    enabled: false
6server:
7  persistentVolume:
8    enabled: false

Prometheusをデプロイします

cd ~/f5j-nginx-observability-lab/prep/helm/
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm upgrade --install prometheus prometheus-community/prometheus \
-f prometheus-addvalue.yaml \
 --set-file extraScrapeConfigs=prometheus-nginx-mesh-and-ingress-scrape-config.yaml \
 --namespace monitor \
 --create-namespace
実行結果サンプル
 1Release "prometheus" does not exist. Installing it now.
 2NAME: prometheus
 3LAST DEPLOYED: Thu Jun 30 08:29:17 2022
 4NAMESPACE: monitor
 5STATUS: deployed
 6REVISION: 1
 7TEST SUITE: None
 8NOTES:
 9The Prometheus server can be accessed via port 80 on the following DNS name from within your cluster:
10prometheus-server.monitor.svc.cluster.local
11
12
13Get the Prometheus server URL by running these commands in the same shell:
14  export POD_NAME=$(kubectl get pods --namespace monitor -l "app=prometheus,component=server" -o jsonpath="{.items[0].metadata.name}")
15  kubectl --namespace monitor port-forward $POD_NAME 9090
16#################################################################################
17######   WARNING: Persistence is disabled!!! You will lose your data when   #####
18######            the Server pod is terminated.                             #####
19#################################################################################
20
21
22The Prometheus alertmanager can be accessed via port 80 on the following DNS name from within your cluster:
23prometheus-alertmanager.monitor.svc.cluster.local
24
25
26Get the Alertmanager URL by running these commands in the same shell:
27  export POD_NAME=$(kubectl get pods --namespace monitor -l "app=prometheus,component=alertmanager" -o jsonpath="{.items[0].metadata.name}")
28  kubectl --namespace monitor port-forward $POD_NAME 9093
29#################################################################################
30######   WARNING: Persistence is disabled!!! You will lose your data when   #####
31######            the AlertManager pod is terminated.                       #####
32#################################################################################
33#################################################################################
34######   WARNING: Pod Security Policy has been moved to a global property.  #####
35######            use .Values.podSecurityPolicy.enabled with pod-based      #####
36######            annotations                                               #####
37######            (e.g. .Values.nodeExporter.podSecurityPolicy.annotations) #####
38#################################################################################
39
40
41The Prometheus PushGateway can be accessed via port 9091 on the following DNS name from within your cluster:
42prometheus-pushgateway.monitor.svc.cluster.local
43
44
45Get the PushGateway URL by running these commands in the same shell:
46  export POD_NAME=$(kubectl get pods --namespace monitor -l "app=prometheus,component=pushgateway" -o jsonpath="{.items[0].metadata.name}")
47  kubectl --namespace monitor port-forward $POD_NAME 9091
48
49For more information on running Prometheus, visit:
50https://prometheus.io/

デプロイした結果を確認します

helm list -n monitor | grep prometheus
実行結果サンプル
1prometheus      monitor         1               2022-06-30 08:29:17.059609279 +0000 UTC deployed        prometheus-15.10.1      2.34.0

Podが正しく作成されていることを確認します

kubectl get pod -n monitor | grep prometheus
実行結果サンプル
1prometheus-alertmanager-0                            1/1     Running   0          12m
2prometheus-kube-state-metrics-5bc9f6d676-t2bqj       1/1     Running   0          12m
3prometheus-prometheus-node-exporter-ckmps            1/1     Running   0          12m
4prometheus-prometheus-node-exporter-fdx7v            1/1     Running   0          12m
5prometheus-prometheus-pushgateway-7ff8445d6f-z9ltt   1/1     Running   0          12m
6prometheus-server-74b7fcc9fc-5dfg9                   2/2     Running   0          12m

2. Grafana Lokiのデプロイ

Helmを使って設定されるDefault設定では、LokiをデプロイするとKubernets Nodeに保存されているPodのログを取得します。 取得したログに対し、運用でログの調査が容易となるよう設定を追加します

またこのデプロイでは、Lokiの他、Promtail、Grafanaをデプロイします。

Lokiの設定パラメータについては以下のページを参照してください。

HelmでデプロイするLokiの設定を確認します。

cat ~/f5j-nginx-observability-lab/prep/helm/loki-scrape.yaml
実行結果サンプル
  1- job_name: kubernetes-pods
  2  pipeline_stages:
  3    - cri: {}
  4    - json:
  5        expressions:
  6          log:
  7    - labels:
  8        log:
  9
 10    - match:
 11        pipeline_name: "accesslog"
 12        selector: '{namespace="nginx-ingress"}  |~ "logtype##: ##accesslog"'
 13        stages:
 14        - json:
 15            expressions:
 16              log:
 17        - replace:
 18            expression: "(\"+)"
 19            replace: "%22"
 20            source: log
 21        - replace:
 22            expression: "(##)"
 23            replace: "\""
 24            source: log
 25        - output:
 26            source: log
 27
 28    - match:
 29        pipeline_name: "securitylog"
 30        selector: '{namespace="nginx-ingress"}  |~ "logtype##: ##securitylog"'
 31        stages:
 32        - json:
 33            expressions:
 34              log:
 35        - replace:
 36            expression: "(N/A)"
 37            replace: "-"
 38            source: log
 39        - replace:
 40            expression: "(\"+)"
 41            replace: "%22"
 42            source: log
 43        - replace:
 44            expression: "(##)"
 45            replace: "\""
 46            source: log
 47        - output:
 48            source: log
 49
 50  kubernetes_sd_configs:
 51    - role: pod
 52  relabel_configs:
 53    - source_labels:
 54        - __meta_kubernetes_pod_controller_name
 55      regex: ([0-9a-z-.]+?)(-[0-9a-f]{8,10})?
 56      action: replace
 57      target_label: __tmp_controller_name
 58    - source_labels:
 59        - __meta_kubernetes_pod_label_app_kubernetes_io_name
 60        - __meta_kubernetes_pod_label_app
 61        - __tmp_controller_name
 62        - __meta_kubernetes_pod_name
 63      regex: ^;*([^;]+)(;.*)?$
 64      action: replace
 65      target_label: app
 66    - source_labels:
 67        - __meta_kubernetes_pod_label_app_kubernetes_io_component
 68        - __meta_kubernetes_pod_label_component
 69      regex: ^;*([^;]+)(;.*)?$
 70      action: replace
 71      target_label: component
 72    - action: replace
 73      source_labels:
 74      - __meta_kubernetes_pod_node_name
 75      target_label: node_name
 76    - action: replace
 77      source_labels:
 78      - __meta_kubernetes_namespace
 79      target_label: namespace
 80    - action: replace
 81      replacement: $1
 82      separator: /
 83      source_labels:
 84      - namespace
 85      - app
 86      target_label: job
 87    - action: replace
 88      source_labels:
 89      - __meta_kubernetes_pod_name
 90      target_label: pod
 91    - action: replace
 92      source_labels:
 93      - __meta_kubernetes_pod_container_name
 94      target_label: container
 95    - action: replace
 96      replacement: /var/log/pods/*$1/*.log
 97      separator: /
 98      source_labels:
 99      - __meta_kubernetes_pod_uid
100      - __meta_kubernetes_pod_container_name
101      target_label: __path__
102    - action: replace
103      regex: true/(.*)
104      replacement: /var/log/pods/*$1/*.log
105      separator: /
106      source_labels:
107      - __meta_kubernetes_pod_annotationpresent_kubernetes_io_config_hash
108      - __meta_kubernetes_pod_annotation_kubernetes_io_config_hash
109      - __meta_kubernetes_pod_container_name
110      target_label: __path__
  • 50-51行目で kubernetes_sd_configspod を指定し、各Nodeに記録されているPodのログを取得する設定となっています。50行目以降がHelmでデプロイする際のデフォルトの設定となります

  • 2行目の cri で取得したログを、3-8行目で json でパースし、log 部分を抽出します

  • 10-26行目は、8行目までで抽出した log の内容に対し、 match ステージでNGINXの accesslog の条件を指定しログを抽出します

  • 28-48行目は、10-26行目同様に match ステージでNAP WAFの securitylog の条件を指定しログを抽出します

参考の追加設定としてSyslog Serverの設定を追加します

cat ~/f5j-nginx-observability-lab/prep/helm/loki-scrape-addvalue.yaml
実行結果サンプル
1# this is extraScrapeCOnfig
2- job_name: syslog
3  syslog:
4    listen_address: 0.0.0.0:1514
5    labels:
6      job: "syslog"
7  relabel_configs:
8    - source_labels: ['__syslog_message_hostname']
9      target_label: 'host'

その他Lokiの設定パラメータは以下を参照してください

Lokiをデプロイします

## cd ~/f5j-nginx-observability-lab/prep/helm/
helm repo add grafana https://grafana.github.io/helm-charts
helm upgrade --install loki grafana/loki-stack -n monitor \
 --set grafana.enabled=true \
 --set-file promtail.config.snippets.extraScrapeConfigs=loki-scrape-addvalue.yaml \
 --set-file promtail.config.snippets.scrapeConfigs=loki-scrape.yaml
実行結果サンプル
 1Release "loki" does not exist. Installing it now.
 2W0630 10:11:21.164451  201978 warnings.go:70] policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+
 3W0630 10:11:21.167201  201978 warnings.go:70] policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+
 4W0630 10:11:21.169425  201978 warnings.go:70] policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+
 5W0630 10:11:21.345337  201978 warnings.go:70] policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+
 6W0630 10:11:21.346284  201978 warnings.go:70] policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+
 7W0630 10:11:21.346657  201978 warnings.go:70] policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+
 8NAME: loki
 9LAST DEPLOYED: Thu Jun 30 10:11:19 2022
10NAMESPACE: monitor
11STATUS: deployed
12REVISION: 1
13NOTES:
14The Loki stack has been deployed to your cluster. Loki can now be added as a datasource in Grafana.
15
16See http://docs.grafana.org/features/datasources/loki/ for more detail.

デプロイした結果を確認します

helm list -n monitor | grep loki
実行結果サンプル
1loki            monitor         1               2022-06-30 10:11:19.749832951 +0000 UTC deployed        loki-stack-2.6.5        v2.4.2

Podが正しく作成されていることを確認します

kubectl get pod -n monitor | grep loki
実行結果サンプル
1loki-0                                          1/1     Running   0          2m19s
2loki-grafana-668cc48b7f-4t5cq                   2/2     Running   0          2m19s
3loki-promtail-gcqck                             1/1     Running   0          2m19s
4loki-promtail-xfznr                             1/1     Running   0          2m19s

3. Jaegerのデプロイ

動作確認のため、all-in-one のJaegerをデプロイします。
HelmでデプロイするJaegerの設定を確認します。

Jaegerについては以下を参照してください。

cat ~/f5j-nginx-observability-lab/prep/helm/jaeger-addvalues.yaml
実行結果サンプル
 1provisionDataStore:
 2  cassandra: false
 3  elasticsearch: false
 4  kafka: false
 5
 6allInOne:
 7  enabled: true
 8#  image: jaegertracing/all-in-one
 9#  tag: 1.29.0
10  ingress:
11    enabled: false
12
13collector:
14  enabled: false
15query:
16  enabled: false
17agent:
18  enabled: false
19storage:
20  type: memory
  • 6-7行目で allInOne の形式でデプロイすることを指定し、その他パラメータで不要な設定を解除します

Jaegerの設定パラメータについては以下のページを参照してください。

Jaegerをデプロイします

## cd ~/f5j-nginx-observability-lab/prep/helm/
helm repo add jaegertracing https://jaegertracing.github.io/helm-charts
helm upgrade --install jaeger jaegertracing/jaeger -n monitor -f jaeger-addvalues.yaml
実行結果サンプル
 1Release "jaeger" does not exist. Installing it now.
 2NAME: jaeger
 3LAST DEPLOYED: Thu Jun 30 10:37:49 2022
 4NAMESPACE: monitor
 5STATUS: deployed
 6REVISION: 1
 7TEST SUITE: None
 8NOTES:
 9###################################################################
10### IMPORTANT: Ensure that storage is explicitly configured     ###
11### Default storage options are subject to change.              ###
12###                                                             ###
13### IMPORTANT: The use of <component>.env: {...} is deprecated. ###
14### Please use <component>.extraEnv: [] instead.                ###
15###################################################################
16
17You can log into the Jaeger Query UI here:
18
19  export POD_NAME=$(kubectl get pods --namespace monitor -l "app.kubernetes.io/instance=jaeger,app.kubernetes.io/com                                    ponent=query" -o jsonpath="{.items[0].metadata.name}")
20  echo http://127.0.0.1:8080/
21  kubectl port-forward --namespace monitor $POD_NAME 8080:16686

デプロイした結果を確認します

helm list -n monitor | grep jaeger
実行結果サンプル
1jaeger          monitor         1               2022-06-30 10:37:49.835438814 +0000 UTC deployed        jaeger-0.56.8           1.30.0

Podが正しく作成されていることを確認します

kubectl get pod,svc -n monitor | grep jaeger
実行結果サンプル
1pod/jaeger-7896dffdb6-gmlp8                         1/1     Running   0          77s
2service/jaeger-agent                    ClusterIP   None             <none>        5775/UDP,5778/TCP,6831/UDP,6832/UDP      82s
3service/jaeger-collector                ClusterIP   None             <none>        9411/TCP,14250/TCP,14267/TCP,14268/TCP   82s
4service/jaeger-query                    ClusterIP   None             <none>        16686/TCP,16685/TCP                      82s

Tips1. Helmでパラメータを指定する際の主なデバッグ方法

Tips2で紹介の通り、デプロイしたHelmの状態を確認することができます。
パラメータの指定方法については、以下のような手順に沿って調査することが有効です。

Prometheusの情報を参考に以下の情報を示します。

    1. ドキュメントを参照する。取得するHelm Chartや、Chartが参照するGitHubの内容を確認します

    1. デフォルトの設定でデプロイする

    1. デプロイした内容を確認する。helm get コマンドを用いて状態を確認できます

    $ helm get -h
    
    This command consists of multiple subcommands which can be used to
    get extended information about the release, including:
    
    - The values used to generate the release
    - The generated manifest file
    - The notes provided by the chart of the release
    - The hooks associated with the release
    
    Usage:
      helm get [command]
    
    Available Commands:
      all         download all information for a named release
      hooks       download all hooks for a named release
      manifest    download the manifest for a named release
      notes       download the notes for a named release
      values      download the values file for a named release
    
      1. や 3. の内容を元に設定ファイルパラメータを記述する

      1. で記述した内容が正しく反映されることを3. の手順を参考に確認する

    • -f で指定することで、ファイルの形式でオプションパラメータを指定することができます

    • --set で、パラメータの値を個別に指定することができます

    • --set-file で、対象のパラメータに対し、ファイル形式で値を指定することができます

    1. 意図した動作となっていることを確認する

Tips2. Helmでデプロイするリソースの詳細

Helmを使ってデプロイしたPrometheusについて、どのようなステータスとなっている確認する方法紹介します

以下コマンドを実行し、出力結果を確認します

helm get all prometheus -n monitor | less
実行結果サンプル
 1NAME: prometheus
 2LAST DEPLOYED: Thu Jun 30 08:38:08 2022
 3NAMESPACE: monitor
 4STATUS: deployed
 5REVISION: 1
 6TEST SUITE: None
 7USER-SUPPLIED VALUES:
 8alertmanager:
 9  persistentVolume:
10    enabled: false
11extraScrapeConfigs: |+
12  - job_name: 'nginx-mesh-sidecars'
13    kubernetes_sd_configs:
14      - role: pod
15**省略**
16
17COMPUTED VALUES:
18alertRelabelConfigs: null
19alertmanager:
20**省略**
21
22  persistentVolume:
23    accessModes:
24    - ReadWriteOnce
25    annotations: {}
26    enabled: false
27**省略**
28
29extraScrapeConfigs: |+
30  - job_name: 'nginx-mesh-sidecars'
31    kubernetes_sd_configs:
32      - role: pod
33    relabel_configs:
34**省略**
35
36HOOKS:
37MANIFEST:
38---
39# Source: prometheus/charts/kube-state-metrics/templates/serviceaccount.yaml
40apiVersion: v1
41kind: ServiceAccount
  • helm get all を指定すると全ての情報を確認することができます

  • helm 実行時に入力した情報は USER-SUPPLIED VALUES に表示されます

  • COMPUTED VALUES に適用される値が表示されます。実行時に値の指定がない場合には、Templateのデフォルトの内容が表示されます