Slide 1

Slide 1 text

kube-prometheus を気軽に Kustomize OTSUKA, Motohiro / Yuanying Z Lab Corporation Prometheus Meetup Tokyo #4

Slide 2

Slide 2 text

Who am I ? ● OTSUKA, Motohiro / Yuanying ○ Z Lab Corporation ○ 技術 ■ Ruby (2007 - ) ■ Cloud Foundry (2012 -) ■ Docker (2013 - ) ■ Python (2014 - ) ■ Kubernetes / OpenStack (2014 - ) ■ Go (2017 - ) ○ 趣味 ■ ロードバイク (2009 - ) ■ トライアスロン (2010 - )

Slide 3

Slide 3 text

Currently I’m interested in... 自宅: (本番環境) 1. Control Plane: Raspberry Pi 4 4GB x3 2. Worker Node: ECS Liva Z N4200 x3 3. Storage Node: ASRock J3160-ITX 実家: (テスト環境) 1. VM 4GB x7 on NUC x2

Slide 4

Slide 4 text

Master Master Master Worker Worker Worker kubelet kubelet kubelet kubelet kubelet kubelet etcd etcd etcd kube-apiserver kube-apiserver kube-apiserver kube-proxy kube-proxy kube-proxy kube-cm kube-cm kube-scheduler kube-scheduler kube-proxy kube-proxy kube-proxy 凡例 Systemd Unit Static Pod DaemonSet Deployment Flannel Flannel Flannel Flannel Flannel Flannel metallb metallb metallb pod-checkpointer pod-checkpointer pod-checkpointer coredns metallb metallb metallb

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

Kubernetes クラスタ kubelet kubelet kubelet apiserver apiserver kube-apiserver keepalived クラスタ haproxy haproxy haproxy controller manager kube-controller manager scheduler kube-scheduler VIP DaemonSets DaemonSets Deployments Deployments Kubernetes Service Service etcd クラスタ etcd node etcd node etcd node

Slide 7

Slide 7 text

Kubernetes クラスタ etcd クラスタ etcd node etcd node etcd node kubelet kubelet kubelet apiserver apiserver kube-apiserver controller manager kube-controller manager scheduler kube-scheduler systemd sevice Deployments Deployments Kubernetes Service Service (MetalLB) Static Pod DaemonSets

Slide 8

Slide 8 text

自宅クラスタを労なく監視したい


Slide 9

Slide 9 text

Agenda 1. kube-prometheus とは?
 2. 問題点
 3. kustomize でカスタマイズしよう
 4. まとめ


Slide 10

Slide 10 text

kube-prometheus とは?

Slide 11

Slide 11 text

Prometheus で k8s および k8s 上のアプリケーションを監視 するための k8s Manifest を生成するライブラリ 1. Prometheus Operator 2. HA Prometheus 3. HA Alertmanager 4. Prometheus node-exporter 5. Prometheus Adapter for Kubernetes Metrics APIs 6. kube-state-metrics 7. Grafana + Dashboard https://github.com/coreos/kube-prometheus

Slide 12

Slide 12 text

No content

Slide 13

Slide 13 text

(適当に使う際の) 問題点

Slide 14

Slide 14 text

Prometheus で k8s および k8s 上のアプリケーションを監視 するための k8s Manifest を生成する jsonnet ライブラリ https://github.com/coreos/kube-prometheus

Slide 15

Slide 15 text

local kp = (import 'kube-prometheus/kube-prometheus.libsonnet' ) + // Uncomment the following imports to enable its patches // (import 'kube-prometheus/kube-prometheus-anti-affinity.libsonnet') + // (import 'kube-prometheus/kube-prometheus-managed-cluster.libsonnet') + // (import 'kube-prometheus/kube-prometheus-node-ports.libsonnet') + // (import 'kube-prometheus/kube-prometheus-static-etcd.libsonnet') + // (import 'kube-prometheus/kube-prometheus-thanos-sidecar.libsonnet') + // (import 'kube-prometheus/kube-prometheus-custom-metrics.libsonnet') + { _config+:: { namespace: 'monitoring', }, }; { ['setup/0namespace-' + name]: kp.kubePrometheus[name] for name in std.objectFields (kp.kubePrometheus) } + { ['setup/prometheus-operator-' + name]: kp.prometheusOperator[name] for name in std.filter((function(name) name != 'serviceMonitor' ), std.objectFields (kp.prometheusOperator)) } + // serviceMonitor is separated so that it can be created after the CRDs are ready { 'prometheus-operator-serviceMonitor' : kp.prometheusOperator.serviceMonitor } + { ['node-exporter-' + name]: kp.nodeExporter[name] for name in std.objectFields (kp.nodeExporter) } + { ['kube-state-metrics-' + name]: kp.kubeStateMetrics[name] for name in std.objectFields (kp.kubeStateMetrics) } + { ['alertmanager-' + name]: kp.alertmanager[name] for name in std.objectFields (kp.alertmanager) } + { ['prometheus-' + name]: kp.prometheus[name] for name in std.objectFields (kp.prometheus) } + { ['prometheus-adapter-' + name]: kp.prometheusAdapter[name] for name in std.objectFields (kp.prometheusAdapter) } + { ['grafana-' + name]: kp.grafana[name] for name in std.objectFields (kp.grafana) }

Slide 16

Slide 16 text

公式リポジトリに コンパイル済みのマニフェストが Quickstart 用に置いてある # Create the namespace and CRDs, and then wait for them to be availble before creating the remaining resources kubectl create -f manifests/setup until kubectl get servicemonitors --all-namespaces ; do date; sleep 1; echo ""; done kubectl create -f manifests/

Slide 17

Slide 17 text

Quickstart のマニフェストで、ど うにかならないものか

Slide 18

Slide 18 text

Quickstart のマニフェストで痒いところ 1. kube-rbac-proxy が arm64 に対応していない 2. Alertmanager の通知先を指定したい 3. Ingress がいない 4. Prometheus/Alertmanager の externalUrl がおかしい 5. 永続化されていない 6. 自作の textfile collector を使いたい

Slide 19

Slide 19 text

kustomize で カスタマイズしよう

Slide 20

Slide 20 text

kube-rbac-proxy が arm64 に対応していない

Slide 21

Slide 21 text

images: - name: quay.io/coreos/kube-rbac-proxy newName: quay.io/brancz/kube-rbac-proxy newTag: HEAD-2020-05-07-2fd48d73 kustomization.yaml

Slide 22

Slide 22 text

Alertmanager の通知先を設定したい

Slide 23

Slide 23 text

global: hipchat_api_url: 'https://hipchat.foobar.org/' … - name: 'team-X-hipchat' hipchat_configs: - auth_token: room_id: 85 message_format: html notify: true alertmanager.yaml

Slide 24

Slide 24 text

secretGenerator: - name: alertmanager-main namespace: monitoring behavior: merge files: - secrets/alertmanager.yaml kustomization.yaml 既存のSecretもsecretGeneratorで マージできる!

Slide 25

Slide 25 text

Ingress がいない

Slide 26

Slide 26 text

apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: grafana namespace: monitoring labels: app: grafana spec: rules: - host: grafana.$(DOMAIN) http: paths: - backend: serviceName: grafana servicePort: 3000 tls: - hosts: - grafana.$(DOMAIN) secretName: grafana-tls ingress.yaml

Slide 27

Slide 27 text

resources: - resources/ingress.yaml kustomization.yaml

Slide 28

Slide 28 text

spec: rules: - host: grafana.$(DOMAIN) http: ... tls: - hosts: - grafana.$(DOMAIN) secretName: grafana-tls ingress.yaml var/varReference を使うことで、 ingress のホスト部分のカスタマイズ が簡単に!

Slide 29

Slide 29 text

Prometheus/Alertmanager の externalUrl がおかしい

Slide 30

Slide 30 text

apiVersion: monitoring.coreos.com/v1 kind: Alertmanager metadata: name: main namespace: monitoring spec: externalUrl: https://alertmanager.$(DOMAIN)/ alertmanager.yaml

Slide 31

Slide 31 text

apiVersion: monitoring.coreos.com/v1 kind: Prometheus metadata: name: k8s namespace: monitoring spec: externalUrl: https://prometheus.$(DOMAIN)/ prometheus.yaml

Slide 32

Slide 32 text

patchesStrategicMerge: - patches/prometheus.yaml - patches/alertmanager.yaml kustomization.yaml CRD にもパッチできる!

Slide 33

Slide 33 text

永続化されていない (prometheus)

Slide 34

Slide 34 text

apiVersion: monitoring.coreos.com/v1 kind: Prometheus metadata: name: k8s namespace: monitoring spec: externalUrl: https://prometheus.$(DOMAIN)/ storage: volumeClaimTemplate: spec: storageClassName: "iscsi-targetd-vg-targetd" resources: requests: storage: 10Gi prometheus.yaml CRD にパッチするだけ。

Slide 35

Slide 35 text

永続化されていない (grafana)

Slide 36

Slide 36 text

永続化されていない (grafana) 1. pvc を追加。 2. grafana deployment にパッチ a. volumes に追加した pvc を設定 b. emptyDir の設定を削除

Slide 37

Slide 37 text

apiVersion: apps/v1 kind: Deployment metadata: name: grafana namespace: monitoring spec: template: spec: securityContext: fsGroup: 3111 volumes: - name: grafana-storage emptyDir: null persistentVolumeClaim: claimName: grafana-storage grafana.yaml $patch: delete できないので null を 指定。

Slide 38

Slide 38 text

spec: containers: - name: grafana volumeMounts: - mountPath: /grafana-dashboard-definitions/0/k8s-cluster-overview name: grafana-dashboard-k8s-cluster-overview readOnly: false volumes: - name: grafana-dashboard-k8s-cluster-overview configMap: name: grafana-dashboard-k8s-cluster-overview grafana.yaml ちなみに、ダッシュボードの追加はこ んな感じ。

Slide 39

Slide 39 text

textfile collector を使いたい

Slide 40

Slide 40 text

textfile collector を使いたい 1. textfile collector のディレクトリをマウント。 2. textfile collector のディレクトリを指定するフラグを追加。 1 は strategic merge patch が使えるが、2 には JSON 6902 patch が必要。

Slide 41

Slide 41 text

apiVersion: apps/v1 kind: DaemonSet metadata: name: node-exporter namespace: monitoring spec: template: spec: containers: - name: node-exporter volumeMounts: - mountPath: /srv/txt_collector name: textfile-dir readOnly: false volumes: - name: textfile-dir hostPath: path: /var/lib/node-exporter node-exporter.yaml

Slide 42

Slide 42 text

- op: add path: /spec/template/spec/containers/0/args/0 value: '--collector.textfile.directory=/srv/txt_collector' node-exporter.json.yaml

Slide 43

Slide 43 text

まとめ

Slide 44

Slide 44 text

jsonnet 知らなくても、 意外と kustomizeできるので オススメ!

Slide 45

Slide 45 text

参考 ● https://github.com/yuanying/k8s-base ● https://github.com/yuanying/k8s-manifests-staging ● https://github.com/yuanying/k8s-manifests-fraction 自宅クラスタの設定ファイルは全部 (kubelet 以外)、 k8s のマニフェストになっているので参考になれば。

Slide 46

Slide 46 text

Thanks!