監視コンポーネントのデプロイ
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_configs
で Pod
を指定し、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_configs
のpod
を指定し、各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のデプロイ
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でパラメータを指定する際の主なデバッグ方法
Prometheusの情報を参考に以下の情報を示します。
ドキュメントを参照する。取得するHelm Chartや、Chartが参照するGitHubの内容を確認します
デフォルトの設定でデプロイする
デプロイした内容を確認する。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
や 3. の内容を元に設定ファイルパラメータを記述する
で記述した内容が正しく反映されることを3. の手順を参考に確認する
-f
で指定することで、ファイルの形式でオプションパラメータを指定することができます--set
で、パラメータの値を個別に指定することができます--set-file
で、対象のパラメータに対し、ファイル形式で値を指定することができます
意図した動作となっていることを確認する
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のデフォルトの内容が表示されます