Skip to content

Latest commit

 

History

History
204 lines (159 loc) · 11.2 KB

3_CustomResource.md

File metadata and controls

204 lines (159 loc) · 11.2 KB

3. Custom Resource Definitionの設定

3-1. 諸注意

3-1-1. Prometheus OperatorのCRDについて

Serviceの可視化設定をするときは、以下の手順で設定を行います。

  1. Kind「Prometheus」を設定する
  2. PrometheusのGUIを確認する
  3. プロジェクト間通信を許可する
  4. Kind「ServiceMonitor」を設定する

3-1-2. 事前準備

  • OpenShiftのOperatorCatalogからPrometheus Opearatorをデプロイしておく。
  • 事前にJMX Exporterを用意しておく。
    JMX Prometheus ExporterのServiceのラベル名(図は「app=jboss-eap-prometheus」)を確認しておきましょう。
    [Networking]>[Services]から確認
    JMX Prometheus ExporterのServiceタグ

3-2. Custom Resource Definitionの設定

3-1-1. 「Kind: Prometheus」 を設定

作成したPrometheus Operatorを利用して、「Kind: Prometheus」を作成します。
以下のようなPrometheus.specを設定することで、Prometheusの設定が可能です。

Field Description Scheme Required
replicas Number of instances to deploy for a Prometheus deployment. *int32 false
version Version of Prometheus to be deployed. string false
serviceAccountName ServiceAccountName is the name of the ServiceAccount to use to run the Prometheus Pods. string false
securityContext SecurityContext holds pod-level security attributes and common container settings. This defaults to the default PodSecurityContext. *v1.PodSecurityContext false
serviceMonitorSelector ServiceMonitors to be selected for target discovery. *metav1.LabelSelector false
logLevel Log level for Prometheus to be configured with. string false
logFormat Log format for Prometheus to be configured with. string false
scrapeInterval Interval between consecutive scrapes. string false
ruleSelector A selector to select which PrometheusRules to mount for loading alerting rules from. Until (excluding) Prometheus Operator v0.24.0 Prometheus Operator will migrate any legacy rule ConfigMaps to PrometheusRule custom resources selected by RuleSelector. Make sure it does not match any config maps that you do not want to be migrated. *metav1.LabelSelector false
query QuerySpec defines the query command line flags when starting Prometheus. *QuerySpec false
alerting Define details regarding alerting. *AlertingSpec false
rules /--rules.*/ command-line arguments. Rules false

「jmx-monitor-<User_ID>」プロジェクトの[Operators]>[Intalled Operators]>[Prometheus Operator]を選択し、[Prometheus]タブの「Create Prometheus」から、以下の「Kind: Prometheus」を定義します。
※この際、Projectが「jmx-monitor-<User_ID>」であることを確認します。

Create Prometheus

[Kind: Prometheus]

「serviceMonitorSelector(key: k8s-app)」に記載されているServiceMonitorを監視するように設定します。

apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
  name: monitoring
  labels:
    prometheus: k8s
  namespace: jmx-monitor-<User_ID>
spec:
  replicas: 2
  version: v2.7.1
  serviceAccountName: prometheus-k8s
  securityContext: {}
  serviceMonitorSelector:
    matchExpressions:
      - key: k8s-app
        operator: Exists
  ruleSelector:
    matchLabels:
      role: prometheus-rulefiles
      prometheus: k8s
  query:
    timeout: 300s
  alerting:
    alertmanagers:
      - namespace: jmx-monitor-<User_ID>
        name: alertmanager-main
        port: web

「Kind: Prometheus」を設定すると、Prometheus Operatorが「replicas: 2」の数の分Prometheusに必要なContainerを起動します。
起動したPromethuesPodを確認しておきましょう。

$ oc get pod -n jmx-monitor-<User_ID>
NAME                                  READY   STATUS    RESTARTS   AGE
prometheus-monitoring-0               3/3     Running   1          51s
prometheus-monitoring-1               3/3     Running   1          51s
prometheus-operator-bd98985fd-vcnw6   1/1     Running   0          17m

3-1-2. PrometheusのGUIを確認

PrometheusのGUIを表示します。OperatorのServiceに対してRouterを接続します。

$ oc get svc -n jmx-monitor-<User_ID>
NAME                  TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE
prometheus-operated   ClusterIP   None         <none>        9090/TCP   5m39s


$ oc expose service prometheus-operated -n jmx-monitor-<User_ID>
route.route.openshift.io/prometheus-operated exposed


$ oc get route -n jmx-monitor-<User_ID>
NAME                  HOST/PORT                                                                           PATH   SERVICES              PORT   TERMINATION   WILDCARD
prometheus-operated   prometheus-operated-jmx-monitor-user11.apps.cluster-cc8c.cc8c.example.opentlc.com          prometheus-operated   web                  None

Routerが接続できたら、ブラウザより確認を行ってください。(例では、prometheus-operated-jmx-monitor-user11.apps.cluster-cc8c.cc8c.example.opentlc.com)
なお、この時点では何も監視登録設定されていないため、PrometheusのGUIに接続できるものの[Status]>[Targets]には何も監視対象が表示されません。

NoTargets

3-1-3. プロジェクト間通信を許可

Prometheus Operatorを配置した「JMX Monitor(jmx-monitor)」プロジェクトとアプリを配置した「JMX Exporter(jmx)」プロジェクト間のネットワークポリシーを設定します。

ここでは事前に、「JMX Monitor(jmx-monitor)」のPrometheus Operatorに設定したサービスアカウント(prometheus-k8s)に対して、「JMX Exporter(jmx)」プロジェクトに参照権限を付与しています。また、「JMX Exporter(jmx)」プロジェクトに対するPodネットワーク許可を追加しています。

$ oc adm policy add-role-to-user view system:serviceaccount:jmx-monitor-<User_ID>:prometheus-k8s -n jmx-<User_ID>
clusterrole.rbac.authorization.k8s.io/view added: "system:serviceaccount:jmx-monitor-<User_ID>:prometheus-k8s"

$ oc adm pod-network join-projects --to=jmx-<User_ID> jmx-monitor-<User_ID>
using plugin: "redhat/openshift-ovs-networkpolicy", managing pod network is only supported for openshift multitenant network plugin

3-1-4. 「Kind: ServiceMonitor」を設定

最後にServiceMonitorを設定してJMXの値をPrometheusから取得し、可視化します。
以下のような、値を設定することによって、監視対象を特定できます。

Field Description Scheme Required
jobLabel The label to use to retrieve the job name from. string false
targetLabels TargetLabels transfers labels on the Kubernetes Service onto the target. []string false
podTargetLabels PodTargetLabels transfers labels on the Kubernetes Pod onto the target. []string false
endpoints A list of endpoints allowed as part of this ServiceMonitor. []Endpoint true
selector Selector to select Endpoints objects. metav1.LabelSelector true
namespaceSelector Selector to select which namespaces the Endpoints objects are discovered from. NamespaceSelector false
sampleLimit SampleLimit defines per-scrape limit on number of scraped samples that will be accepted. uint64 false

「jmx-monitor」プロジェクトの[Operators]>[Intalled Operators]>[Prometheus Operator]を選択し、[ServiceMonitor]タブの「Create ServiceMonitor」から、以下の「Kind: ServiceMonitor」を定義します。 ※この際、Projectが「jmx-monitor-<User_ID>」であることを確認します。

Create ServiceMonitor

[Kind: ServiceMonitor]

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: jmx-monitor-<User_ID>
  labels:
    k8s-app: prometheus
  namespace: jmx-monitor-<User_ID>
spec:
  endpoints:
    - interval: 60s
      port: 9404-tcp
      scrapeTimeout: 55s
  namespaceSelector:
    matchNames:
      - jmx-<User_ID>
  selector:
    matchLabels:
      app: jboss-eap-prometheus

「Kind: ServiceMonitor」を設定すると、Prometheus Operatorが同一ラベルのPrometheus(k8s-app: prometheus)に対して、ExporterのService(app: jboss-eap-prometheus)から監視対象を特定します。
PrometheusのGUI(例では、http://prometheus-operated-jmx-monitor.apps.ocp4ws-00.k8show.net) の[Status]>[Targets]から、対象が表示されることを確認してみましょう。ただし、Prometheusの設定が読み込まれ、出力表示が切り替わるまでに少し時間がかかります。

Prometheus Target

Targetが正しく表示でき、StateがUP状態であれば、JMXの値も確認できます。[Graph]>[-insert metric at cursor-]から、「jvm_memory_bytes_used」などを確認してみましょう。
[Graph]のタブを押すと、可視化された値が表示できます。

JVM Memory Bytes Used

以上でPrometheus Operatorの基本利用は完了です。
同じ要領で、AlertManagerも設定してみましょう。
参考: https://sysdig.com/blog/kubernetes-monitoring-prometheus-operator-part3/

重要: Lab1で作成したプロジェクトをクリーンナップ

以下のocコマンドで2つのプロジェクトを削除しましょう。

$ oc delete project jmx-<User_ID>
$ oc delete project jmx-monitor-<User_ID>