kube-prometheusを気軽にKustomize

 kube-prometheusを気軽にKustomize

Prometheus Operator を気軽にインストールして使うために、kube-prometheusをKustomize して使います。

203e5cc4766b6b4d2360f8329b8e7559?s=128

O. Yuanying

May 28, 2020
Tweet

Transcript

  1. kube-prometheus を気軽に Kustomize OTSUKA, Motohiro / Yuanying Z Lab Corporation

    Prometheus Meetup Tokyo #4
  2. 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 - )
  3. 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
  4. 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
  5. None
  6. 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
  7. 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
  8. 自宅クラスタを労なく監視したい


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

    まとめ

  10. kube-prometheus とは?

  11. 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
  12. None
  13. (適当に使う際の) 問題点

  14. Prometheus で k8s および k8s 上のアプリケーションを監視 するための k8s Manifest を生成する

    jsonnet ライブラリ https://github.com/coreos/kube-prometheus
  15. 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) }
  16. 公式リポジトリに コンパイル済みのマニフェストが 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/
  17. Quickstart のマニフェストで、ど うにかならないものか

  18. Quickstart のマニフェストで痒いところ 1. kube-rbac-proxy が arm64 に対応していない 2. Alertmanager の通知先を指定したい

    3. Ingress がいない 4. Prometheus/Alertmanager の externalUrl がおかしい 5. 永続化されていない 6. 自作の textfile collector を使いたい
  19. kustomize で カスタマイズしよう

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

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

  22. Alertmanager の通知先を設定したい

  23. global: hipchat_api_url: 'https://hipchat.foobar.org/' … - name: 'team-X-hipchat' hipchat_configs: - auth_token:

    <auth_token> room_id: 85 message_format: html notify: true alertmanager.yaml
  24. secretGenerator: - name: alertmanager-main namespace: monitoring behavior: merge files: -

    secrets/alertmanager.yaml kustomization.yaml 既存のSecretもsecretGeneratorで マージできる!
  25. Ingress がいない

  26. 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
  27. resources: - resources/ingress.yaml kustomization.yaml

  28. spec: rules: - host: grafana.$(DOMAIN) http: ... tls: - hosts:

    - grafana.$(DOMAIN) secretName: grafana-tls ingress.yaml var/varReference を使うことで、 ingress のホスト部分のカスタマイズ が簡単に!
  29. Prometheus/Alertmanager の externalUrl がおかしい

  30. apiVersion: monitoring.coreos.com/v1 kind: Alertmanager metadata: name: main namespace: monitoring spec:

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

    externalUrl: https://prometheus.$(DOMAIN)/ prometheus.yaml
  32. patchesStrategicMerge: - patches/prometheus.yaml - patches/alertmanager.yaml kustomization.yaml CRD にもパッチできる!

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

  34. 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 にパッチするだけ。
  35. 永続化されていない (grafana)

  36. 永続化されていない (grafana) 1. pvc を追加。 2. grafana deployment にパッチ a.

    volumes に追加した pvc を設定 b. emptyDir の設定を削除
  37. 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 を 指定。
  38. 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 ちなみに、ダッシュボードの追加はこ んな感じ。
  39. textfile collector を使いたい

  40. textfile collector を使いたい 1. textfile collector のディレクトリをマウント。 2. textfile collector

    のディレクトリを指定するフラグを追加。 1 は strategic merge patch が使えるが、2 には JSON 6902 patch が必要。
  41. 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
  42. - op: add path: /spec/template/spec/containers/0/args/0 value: '--collector.textfile.directory=/srv/txt_collector' node-exporter.json.yaml

  43. まとめ

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

  45. 参考 • https://github.com/yuanying/k8s-base • https://github.com/yuanying/k8s-manifests-staging • https://github.com/yuanying/k8s-manifests-fraction 自宅クラスタの設定ファイルは全部 (kubelet 以外)、

    k8s のマニフェストになっているので参考になれば。
  46. Thanks!