プロメテウス関連サービスは、この名前空間の監視に配備されています
サービス展開プロメテウス
-
名前空間を作成します。
$ cd /opt/k8s/prometheus $ cat>1-namespace.yml<<EOF apiVersion: v1 kind: Namespace metadata: name: monitoring EOF
-
プロメテウス対応するコンフィギュレーションファイル、ConfigMapの使用kubernetesを作成します
$ cd /opt/k8s/prometheus $ cat>2-prom-cnfig.yml<<EOF apiVersion: v1 kind: ConfigMap metadata: name: prom-config namespace: monitoring data: prometheus.yml: | global: scrape_interval: 15s scrape_timeout: 15s scrape_configs: - job_name: 'prometheus' static_configs: - targets: ['localhost:9090'] EOF
-
データを格納するために作成されたPVのプロメテウスは、PVC(ローカルストレージを使用してはGlusterFs等、分散ファイルシステムNFSを構築することによって置き換えることができます)
$ cd /opt/k8s/prometheus $ cat>3-prom-pv.yml<<EOF kind: PersistentVolume apiVersion: v1 metadata: namespace: monitoring name: prometheus labels: type: local app: prometheus spec: capacity: storage: 10Gi accessModes: - ReadWriteOnce hostPath: path: /opt/k8s/prometheus/data --- kind: PersistentVolumeClaim apiVersion: v1 metadata: namespace: monitoring name: prometheus-claim spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi EOF
-
プロメテウスは、サービスNodePortの種類によって展開、外部アクセスの展開フォームにブートファイルを作成します
$ cd /opt/k8s/prometheus $ cat>4-prometheus.yml<<EOF apiVersion: apps/v1 kind: Deployment metadata: name: prometheus namespace: monitoring labels: app: prometheus spec: selector: matchLabels: app: prometheus replicas: 1 template: metadata: labels: app: prometheus spec: containers: - name: prometheus image: prom/prometheus:v2.16.0 args: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.path=/prometheus' - "--storage.tsdb.retention=7d" - "--web.enable-lifecycle" ports: - containerPort: 9090 volumeMounts: - mountPath: "/prometheus" subPath: prometheus name: data - mountPath: "/etc/prometheus" name: config resources: requests: cpu: 500m memory: 2Gi limits: cpu: 500m memory: 2Gi volumes: - name: config configMap: name: prom-config - name: data persistentVolumeClaim: claimName: prometheus-claim --- apiVersion: v1 kind: Service metadata: namespace: monitoring name: prometheus spec: type: NodePort ports: - port: 9090 targetPort: 9090 nodePort: 9090 selector: app: prometheus EOF
- プロメテウスにパラメータstorage.tsdb.pathを渡し、コマンドを起動し、storage.tsdb.retentionプロメテウスは、経路データ記憶、蓄積時間を指定します
- web.enable・ライフサイクルの構成情報の後ときに変更することによって/ - /リロードサービスを再起動することなく、新しい設定内容をリロードします
-
スタートプロメテウスサービス
$ cd /opt/k8s/prometheus $ mkdir data & chmod -R 777 data $ kubectl create -f 1-namespace.yml -f 2-prom-cnfig.yml -f 3-prom-pv.yml -f 4-prometheus.yml
-
すべてのサービスが正常に起動することを確実にするために、コンポーネントのステータスを表示します
$ kubectl get all -n monitoring NAME READY STATUS RESTARTS AGE pod/prometheus-57cf64764d-xqnvl 1/1 Running 0 51s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/prometheus NodePort 10.254.209.164 <none> 9090:9090/TCP 51s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/prometheus 1/1 1 1 51s NAME DESIRED CURRENT READY AGE replicaset.apps/prometheus-57cf64764d 1 1 1 51s
-
インターフェイスのアクセス
監視Kubernetesおよび関連技術
- cAdvisor Googleのオープンソース容器モニタリングプログラム、resutful APIのの外形に提供されるリソース、パフォーマンス関連のさまざまな情報を使用して、コンテナ自体を集めます。外部コールのポッドの単位でkubeletに対応する機能に統合cAdvisorのでない直接kubeletから、別々が展開され、さらに容器kubelet要約情報を、kubernetes。
- メトリックサーバは、プロセスを監視コア成分kubernetesあるHeapster代替で、インターフェースkubelet指標から情報を得るために、主にCPU、メモリ、およびその後APIサーバーによって露出されます。主にkubectlトップのために、HPAおよびその他のkubernetesコンポーネントが使用しています。最後買収インデックス情報を格納するためのメモリでは、データストレージのための責任を負いません
- KUBE-状態メトリック Serverは、このような展開として、状態指標のリソースオブジェクト、レプリカセットなどについて生成APIを聴くこともできます。最後買収インデックス情報を格納するためのメモリでは、データストレージのための責任を負いません
- ノードエクスポータ公式コレクションプロメテウス* NIXシステム自体、ならびに対応するハードウェアを提供するように設計されたインデックス情報、
- KUBE-プロメテウスプログラムの監視を停止kubernetesは、ノード・輸出、プロメテウス、kube-状態メトリック、Grafana、メトリック・サーバーおよびその他のコンポーネントはすぐに完全な監視プラットフォームを構築するためのユーザーのためのより便利なスクリプトを提供し、収集しました。
kubernetesは、コンテンツを監視します
- そのようなノード自身のCPU、メモリ、IO、ネットワークおよびその他の情報として、クラスタ自体の状態を監視
- このような自己組織化kubernetes KUBEスケジュールマネージャ、KUBEプロキシ、kubelet等のモニターシステム
- クラスタの動作CPUユニット、メモリ情報として、容器、コンテナ、ポッドを監視
- など展開、Daemonsetとしてオーケストレーション構成要素に対応するクラスタ索引を監視
本論文では、配備するコンポーネントの独自の形式は、監視プラットフォームをセットアップする方法をステップバイステップを参照してください。すぐに参照することができ、構築することが必要であるKUBE-プロメテウス
ノード・輸出国の展開
各ノードを監視するために、コントローラが使用するDaemonsetノード-輸出を展開するように、ポッド内の各ノードで実行
-
スタートアップファイル
$ cd /opt/k8s/prometheus $ cat>5-node-exporter.yml<<EOF apiVersion: apps/v1 kind: DaemonSet metadata: labels: app: node-exporter name: node-exporter namespace: monitoring spec: selector: matchLabels: app: node-exporter template: metadata: labels: app: node-exporter spec: containers: - name: node-exporter image: 192.168.0.107/prometheus/node-exporter:v0.18.1 args: - --web.listen-address=:9100 - --path.procfs=/host/proc - --path.sysfs=/host/sys - --path.sysfs=/host/sys - --path.rootfs=/host/root - --no-collector.hwmon - --collector.filesystem.ignored-mount-points=^/(dev|proc|sys|var/lib/docker/.+)($|/) - --collector.filesystem.ignored-fs-types=^(autofs|binfmt_misc|cgroup|configfs|debugfs|devpts|devtmpfs|fusectl|hugetlbfs|mqueue|overlay|proc|procfs|pstore|rpc_pipefs|securityfs|sysfs|tracefs)$ resources: limits: cpu: 250m memory: 180Mi requests: cpu: 102m memory: 180Mi ports: - containerPort: 9100 volumeMounts: - mountPath: /host/proc name: proc readOnly: false - mountPath: /host/sys name: sys readOnly: false - mountPath: /host/root mountPropagation: HostToContainer name: root readOnly: true hostNetwork: true hostPID: true nodeSelector: kubernetes.io/os: linux securityContext: runAsNonRoot: true runAsUser: 65534 tolerations: - operator: Exists volumes: - hostPath: path: /proc name: proc - hostPath: path: /sys name: sys - hostPath: path: / name: root EOF
-
開始ノード、輸出国
$ cd /opt/k8s/prometheus $ kubectl create -f 5-node-exporter.yml $ kubectl -n monitoring get pod | grep node node-exporter-854vr 1/1 Running 6 50m node-exporter-lv9pv 1/1 Running 0 50m
-
プロメテウスによってインジケータ情報ノード輸出を収集します
動的拡張理由と静的構成の形で不都合は、プロメテウスは、私たちはサービス発見機能はKubernetesの動的監視を可能にする対応Kubernetes提供するように、後にノードクラスタを低減することができます。前記ノード発見モードによって監視サービス・ノード、さらにプロメテウス設定ファイルを次の(2-PROM-cnfig.ymlに対応し、またそうでなければ再構成Configmap情報が失われることになる、追加する必要があります)
$ kubectl -n monitoring edit configmaps prom-config
- job_name: "kubernetes-nodes" kubernetes_sd_configs: - role: node relabel_configs: - source_labels: [__address__] regex: '(.*):10250' replacement: '${1}:9100' target_label: __address__ action: replace - action: labelmap regex: __meta_kubernetes_node_label_(.+)
追加の完了がなぜこのような構成のように、設定項目を再ロードするには、次のコマンドを実行した後、後部の構成原理は特定を説明します
$ curl -XPOST http://192.168.0.107:9090/-/reload
この時点では、プロメテウスのクラスタノードでは、次のエラーメッセージが表示されています、promethesログ情報を参照して、情報を取得しようとします
level=error ts=2020-03-22T10:37:13.856Z caller=klog.go:94 component=k8s_client_runtime func=ErrorDepth msg="/app/discovery/kubernetes/kubernetes.go:333: Failed to list *v1.Node: nodes is forbidden: User \"system:serviceaccount:monitoring:default\" cannot list resource \"nodes\" in API group \"\" at the cluster scope"
リストは、デフォルトのserviceaccount * v1.Nodeを使用することはできませんので、私たちはプロメテウスに再作成serviceaccountする必要があり、適切な権限を与えられたことを意味
-
プロメテウス対応serviceaccountを作成し、適切な権限を与えられました
$ cd /opt/k8s/prometheus $ cat>6-prometheus-serivceaccount-role.yaml<<EOF apiVersion: v1 kind: ServiceAccount metadata: name: prometheus-k8s namespace: monitoring --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: prometheus-k8s rules: - apiGroups: [""] resources: - nodes/proxy - nodes - namespaces - endpoints - pods - services verbs: ["get","list","watch"] - apiGroups: [""] resources: - nodes/metrics verbs: ["get"] - nonResourceURLs: - /metrics verbs: ["get"] - apiGroups: - extensions resources: - ingresses verbs: ["get", "list", "watch"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: prometheus-k8s roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: prometheus-k8s subjects: - kind: ServiceAccount name: prometheus-k8s namespace: monitoring EOF
$ cd /opt/k8s/prometheus $ kubectl create -f 6-prometheus-serivceaccount-role.yaml
プロメテウスは、スタートYAML、追加のserivceaccount構成を変更、プロメテウスを再起動します
... spec: serviceAccountName: prometheus-k8s containers: - name: prometheus ...
オブジェクトリストを監視ビュープロメテウス
詳細な構成原則kubernetes_sd_config
-
送信先アドレスを探します
ロールkubernetes_sd_configノードの構成である場合、プロメテウス後LISTノードAPI呼び出しのkubernetes取得したノード情報を開始し、監視アドレスを構成するノードオブジェクトからIPとポートを得ます。
ここで、次の順序InternalIP、ExternalIP、LegacyHostIP、ホスト名でIPのルックアップを取得
ポート値のデフォルトは、HTTPポートをKubelet。
情報リストノードインタフェースを表示することができますIPとポートは、次のコマンドを返さ
$ kubectl get node -o=jsonpath='{range .items[*]}{.status.addresses}{"\t"}{.status.daemonEndpoints}{"\n"}{end}' [map[address:192.168.0.107 type:InternalIP] map[address:master type:Hostname]] map[kubeletEndpoint:map[Port:10250]] [map[address:192.168.0.114 type:InternalIP] map[address:slave type:Hostname]] map[kubeletEndpoint:map[Port:10250]]
クラスタ内の戻り結果は、それぞれのアドレスを構成する2つのノード、tagetあります
192.168.0.107:10250 192.168.0.114:10250
-
relabe_configs
再ラベルは、データをクロールする前に、プロメテウスのラベルの値を動的に変更することができます。プロメテウスは、デフォルトタグの数を持っており、私たちのいくつかは、次のように対処します
__address__
:初期化に対応するターゲットアドレスとして設定されます<host>:<port>
instance
:__address__
再ラベル付け段階の後にタグの値は、タグに設定されinstance
、instance
ある__address__
再ラベル付け後のラベルの値__scheme__
デフォルト:HTTP__metrics_path__
デフォルト/メトリック
宛先アドレス情報のプロメテウスプル指数は、接続するには、いくつかのラベルをつけています
__scheme__://instance/__metrics_path__
-
我々は、各ノードに、ノードexpeorterを開始
:9100/metrics
露出ノードのインデックス情報に、次にセグメントプロメテウスの構成に加え- job_name: "kubernetes-nodes" kubernetes_sd_configs: - role: node relabel_configs: - source_labels: [__address__] regex: '(.*):10250' replacement: '${1}:9100' target_label: __address__ action: replace - action: labelmap regex: __meta_kubernetes_node_label_(.+)
前記第一のプロファイルセグメントrelabel_configs
- source_labels: [__address__] regex: '(.*):10250' replacement: '${1}:9100' target_label: __address__ action: replace
- 正規表現からによる
__address__
IPアドレスと一致します - 交換:に対応する値に設定
${IP}:9100
- target_label:
__address__
値、すなわち、置換に置き換え、${IP}:9100
これらのステップの後、インデックスアドレスにスプライスを取得
[http://192.168.0.107:9100/metrics, http://192.168.0.114:9100/metrics]
し、Googleのインデックスノード-輸出暴露試合に取り組むには、ノードのインデックス情報を引き出すことができますまた、タグプロメテウスに対応するノードになるであろうので
__meta_kubernetes_node_label_<labelname>
、これを添加labelmapの操作、これらのタグの名前は、それらを復元します - 正規表現からによる
-
基準の完全な構成例プロメテウス-kubernetes
追加の指標が提供さkubeleteを収集します
収集特定の情報指標APIサーバー、etcdやその他のサービスをkubelet、次のコマンドで表示することができます
$ kubectl get --raw https://192.168.0.107:10250/metrics
- どこ10250はkubeletのデフォルトのリスニングポートです
promehteusがこの情報を引っ張るようにすることを、promehteusで追加設定が続きます
- job_name: "kubernetes-kubelet"
scheme: https
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
kubernetes_sd_configs:
- role: node
relabel_configs:
- action: labelmap
regex: __meta_kubernetes_node_label_(.+)
クラスタコンテナの制御を達成するために追加の収集cAdvisor指標
kubeletは、クラスタ情報収集容器に、cAdvisorデフォルト集積Kubernetes 1.7.3バージョン、その後、インデックス情報は、対応するKubeletからcAdvisor(開始container_)を収集/メトリックはそう除去しましたジョブcAdvisorコレクションの追加設定が必要です。コマンド呼び出しcAdvisor指標
$ kubectl get --raw https://192.168.0.107:6443/api/v1/nodes/master/proxy/metrics/cadvisor
- どこ10250はkubeletのデフォルトのリスニングポートです
promehteusがこの情報を引っ張るようにすることを、promehteusで追加設定が続きます
- job_name: "kubernetes-cadvisor"
scheme: https
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
kubernetes_sd_configs:
- role: node
relabel_configs:
- action: labelmap
regex: __meta_kubernetes_node_label_(.+)
- target_label: __address__
replacement: kubernetes.default.svc:443
- source_labels: [__meta_kubernetes_node_name]
regex: (.+)
target_label: __metrics_path__
replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor
添加が完了した後、設定ファイルを再読み込み、モニタプロメテウスにオブジェクトのリストを表示
完全な設定ファイルは以下の
$ cd /opt/k8s/prometheus
$ cat 2-prom-cnfig.yml
apiVersion: v1
kind: ConfigMap
metadata:
name: prom-config
namespace: monitoring
data:
level=info ts=2020-03-22T12:15:02.551Z caller=head.go:625 component=tsdb msg="WAL segment loaded" segment=10 maxSegment=15
prometheus.yml: |
global:
scrape_interval: 15s
scrape_timeout: 15s
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: "kubernetes-nodes"
kubernetes_sd_configs:
- role: node
relabel_configs:
- source_labels: [__address__]
regex: '(.*):10250'
replacement: '${1}:9100'
target_label: __address__
action: replace
- action: labelmap
regex: __meta_kubernetes_node_label_(.+)
- job_name: "kubernetes-kubelet"
scheme: https
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
kubernetes_sd_configs:
- role: node
relabel_configs:
- action: labelmap
regex: __meta_kubernetes_node_label_(.+)
- job_name: "kubernetes-cadvisor"
scheme: https
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
kubernetes_sd_configs:
- role: node
relabel_configs:
- action: labelmap
regex: __meta_kubernetes_node_label_(.+)
- target_label: __address__
replacement: kubernetes.default.svc:443
- source_labels: [__meta_kubernetes_node_name]
regex: (.+)
target_label: __metrics_path__
replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor
部署grafana
-
データを格納するためのPV grafanaを作成し、PVC(ローカルストレージを使用してはGlusterFs等、分散ファイルシステムNFSを構築することによって置き換えることができます)
$ cd /opt/k8s/prometheus $ cat>7-grafana-pv.yml<<EOF kind: PersistentVolume apiVersion: v1 metadata: namespace: monitoring name: grafana labels: type: local app: grafana spec: capacity: storage: 10Gi accessModes: - ReadWriteOnce hostPath: path: /opt/k8s/prometheus/grafana-pvc --- kind: PersistentVolumeClaim apiVersion: v1 metadata: namespace: monitoring name: grafana-claim spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi EOF
-
grafanaデプロイメントファイル
$ cd /opt/k8s/prometheus $ cat>8-grafana.yml<<EOF apiVersion: apps/v1 kind: Deployment metadata: labels: app: grafana name: grafana namespace: monitoring spec: replicas: 1 selector: matchLabels: app: grafana template: metadata: labels: app: grafana spec: containers: - image: grafana/grafana:6.6.2 name: grafana ports: - containerPort: 3000 name: http readinessProbe: httpGet: path: /api/health port: http resources: limits: cpu: 200m memory: 400Mi requests: cpu: 100m memory: 200Mi volumeMounts: - mountPath: /var/lib/grafana name: grafana-pvc readOnly: false subPath: data - mountPath: /etc/grafana/provisioning/datasources name: grafana-pvc readOnly: false subPath: datasources - mountPath: /etc/grafana/provisioning/dashboards name: grafana-pvc readOnly: false subPath: dashboards-pro - mountPath: /grafana-dashboard-definitions/0 name: grafana-pvc readOnly: false subPath: dashboards nodeSelector: beta.kubernetes.io/os: linux securityContext: runAsNonRoot: true runAsUser: 65534 volumes: - name: grafana-pvc persistentVolumeClaim: claimName: grafana-claim --- apiVersion: v1 kind: Service metadata: namespace: monitoring name: grafana spec: type: NodePort ports: - port: 3000 targetPort: 3000 nodePort: 3000 selector: app: grafana EOF
-
スタートgrafana
-
grafanaをマウントするディレクトリを作成します。
$ cd /opt/k8s/prometheus $ mkdir -p grafana-pvc/data $ mkdir -p grafana-pvc/datasources $ mkdir -p grafana-pvc/dashboards-pro $ mkdir -p grafana-pvc/dashboards $ chmod -R 777 grafana-pvc
- データディレクトリデータ保存grafana
- 事前定義されたデータ・ソースを格納するデータソース
- grafana-PVC /ダッシュボード容器のダッシュボードへの設定ファイルアドレスポイントはアドレス/ grafana-ダッシュボード定義/ 0に装着され、前記ダッシュボードを、格納されたダッシュボードプロ管理ファイル
- ダッシュボードのストレージ実際のダッシュボード定義ファイル(JSON)
-
デフォルトのデータソースファイルを作成します。
$ cd /opt/k8s/prometheus/grafana-pvc/datasources $ cat > datasource.yaml<<EOF apiVersion: 1 datasources: - name: Prometheus type: prometheus access: proxy url: http://prometheus.monitoring.svc:9090 EOF
-
デフォルトのファイル管理ダッシュボードを作成します。
$ cd /opt/k8s/prometheus/grafana-pvc/dashboards-pro $ cat >dashboards.yaml<<EOF apiVersion: 1 providers: - name: '0' orgId: 1 folder: '' type: file editable: true updateIntervalSeconds: 10 allowUiUpdates: false options: path: /grafana-dashboard-definitions/0 EOF
-
デフォルトのダッシュボードの定義ファイルを作成します。
して共有ダッシュボードのA集、彼らが必要とするダッシュボードテンプレートを見つけ、は/ opt / K8S /プロメテウス/ grafanaに保存されたファイルに対応する対応するJSONファイルダウンロード -pvc /ダッシュボード)を、 ここでは一例として、ダウンロードプロメテウスダッシュボードのために1ノード輸出をv20191102 CN、対応するIDは8919です。
$ cd /opt/k8s/prometheus/grafana-pvc/dashboards $ wget https://grafana.com/api/dashboards/8919/revisions/11/download -o node-exporter-k8s.json
デフォルトのテンプレートのデータソースが使用されているので
${DS_PROMETHEUS_111}
、インタフェースからの輸入代替設定項目があり、我々は、直接私達にファイル、データソースを変更することで、ファイルをダウンロードし、JSON/opt/k8s/prometheus/grafana-pvc/datasources
データソースに設定$ cd /opt/k8s/prometheus/grafana-pvc/dashboards $ sed -i "s/\${DS_PROMETHEUS_111}/Prometheus/g" node-exporter-k8s.json
変更タイトル
... "timezone": "browser", "title": "k8s-node-monitoring", ...
-
スタート
$ cd /opt/k8s/prometheus/ $ kubectl create -f 7-grafana-pv.yml 8-grafana.yml
-
-
ビューへのインターフェイスにより、我々は、デフォルトの設定を超えるデータソース、ダッシュボードやその他の情報を持っているので、あなたが直接対応するダッシュボードを表示することができます
grafanaを展開するとき、私たちは主に監視指標が直接システムの導入後に観察することができ、これらのデフォルトを達成するために、デフォルトのデータソース、ダッシュボードやその他の情報を設定し、実装は、オンサイトの構成を必要としません。
例えばKUBEステートメトリックおよびクラスタ展開、StatefulSet、コンテナを達成cAdvisorメトリックを使用して、他の監視、ポッドモニタリングもこの形で実施することができます。使用できません。1. Kubernetes展開Statefulset Daemonsetメトリックをもはや特定の手順が表示され、少し私たちの監視のニーズを満たすように変更、テンプレートとして、読者は自分で試すことができます。