Red Hat OpenShift on IBM Cloud에 Prometheus 추가 설치(내장 Operator)

Red Hat OpenShift on IBM Cloud에 Prometheus 추가 설치(내장 Operator)

2022-10-06 last update

11 minutes reading PrometheusOperator prometheus ibmcloud openshift

목적



OpenShift에는 표준으로 Prometheus가 내장되어 있지만 수집한 지표가 지속되지 않기 때문에 프로덕션에서 사용하기가 어려울 수 있습니다. 그래서 오히려 OpenShift에는 내장 Operator Hub가 있으므로 거기에서 추가로 Prometheus를 설치해 보겠습니다.

덧붙여 이 목적이라면 Prometheus가 아니라 IBM Cloud Monitoring with Sysdig를 사용하면 좋다고 IBM씨는 말할지도 모릅니다만, Prometheus의 PromQL가 가지는 유연한 표현력이나, 각종 Exporter와의 제휴로 다양한 메트릭스 을 수집할 수 있는 것은 역시 버리기 어렵습니다.

또, Prometheus Operator는 아직 거동 의심스러운 곳이나 정보 부족한 곳이 있기 때문에, 이용은 자기 책임으로 부탁합니다.

전제


  • 검증 환경: Red Hat OpenShift on IBM Cloud 4.3

  • 절차



    Operator 확인



    웹 콘솔에서 확인할 수 있습니다.



    Operator 구독



    여기에서 CLI로 진행합니다. Operator를 구독합니다.
    $ oc create -f - <<EOF
    apiVersion: operators.coreos.com/v1alpha1
    kind: Subscription
    metadata:
      name: prometheus
    spec:
      channel: beta
      installPlanApproval: Auto
      name: prometheus
      source: community-operators
      sourceNamespace: openshift-marketplace
      startingCSV: prometheusoperator.0.32.0
    EOF
    

    RBAC 설정


    prometheus-k8s라는 ServiceAccount가 만들어졌지만 어떤 이유로 ClusterRole도 할당되지 않았습니다. 그래서 수동으로 ClusterRole과 ClusterRoleBinding을 설정합니다.
    $ oc get sa prometheus-k8s
    NAME             SECRETS   AGE
    prometheus-k8s   2         3m29s
    
    $ oc create -f - <<EOF
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: ${ClusterRole名}
    rules:
    - apiGroups:
      - ""
      resources:
      - nodes
      - nodes/proxy
      - services
      - endpoints
      - pods
      - ingresses
      verbs:
      - get
      - list
      - watch
    - apiGroups:
      - ""
      resources:
      - configmaps
      verbs:
      - get
    - apiGroups:
      - "extensions"
      resources:
      - ingresses/status
      - ingresses
      verbs:
      - get
      - list
      - watch
    - nonResourceURLs:
      - "/metrics"
      verbs:
      - get
    
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: ${好きな名前}
    subjects:
    - kind: ServiceAccount
      name: prometheus-k8s
      namespace: ${サブスクライブしたネームスペース}
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: ${ClusterRole名}
    EOF
    

    Prometheus 인스턴스 만들기



    Prometheus의 인스턴스를 만듭니다. 이번에는 수집한 지표를 File Storage에 영속화합니다.
    $ oc create -f - <<EOF
    apiVersion: monitoring.coreos.com/v1
    kind: Prometheus
    metadata:
      name: server
      labels:
        prometheus: k8s
    spec:
      replicas: 1
      serviceAccountName: prometheus-k8s
      securityContext: {}
      serviceMonitorSelector: {}
      ruleSelector: {}
      alerting:
        alertmanagers: []
      retention: 400d # メトリクスの保存期間
      storage:
        volumeClaimTemplate:
          metadata:
            labels:
              billingType: hourly # またはmonthly
              region: jp-tok # リージョン名
              zone: tok02 # ゾーン名
          spec:
            accessModes:
            - ReadWriteOnce
            resources:
              requests:
                storage: 20Gi
            storageClassName: ibmc-file-bronze-gid # ストレージクラス名
    EOF
    

    영구 볼륨은 사전 정의된 PersistentVolumeClaim과 호환되지 않으며 동적 프로비저닝이 됩니다.

    Prometheus는 비루트 사용자로 실행되므로 스토리지 클래스는 -gid가 포함된 것을 사용해야 합니다. 또한 bronze라고 너무 느리기 때문에 실제 환경에서는 실버와 골드를 사용하는 것이 좋습니다.

    몇 분 정도 기다리면 Pod가 시작됩니다.
    $ oc get pods | grep ^prometheus-server
    prometheus-server-0                             3/3     Running     1          114s
    

    File Storage를 NFS v3화(선택 사항)



    File Storage 마운트를 NFS v3으로 만듭니다. 이것은 IBM Cloud에서 권장됩니다.
    $ _pv=$(oc get pv | grep prometheus-server-db-prometheus-server-0 | awk '{ print $1 }')
    $ oc patch pv/${_pv} -p '{"spec":{"mountOptions":["nfsvers=3","hard","intr","lookupcache=none"]}}'
    

    스크래핑 대상 추가



    이 단계에서는 아무것도 스크레이프하지 않으므로 스크레이프 대상을 추가합니다. 여기에는 두 가지 방법이 있습니다.
  • CRD로 정의
  • AdditionalScrapeConfigs에서 정의

  • CRD는 스크레이프 대상에 따라 PodMonitor, ServiceMonitor 등이 있으며 그것을 OpenShift 리소스로 정의합니다. AdditionalScrapeConfigs는 레거시 Prometheus 구성 파일을 Secret화하고 지정합니다.

    Opetator라면 CRD로 하고 싶은 곳입니다만, 정보가 적기 때문에 시행착오가 되기 쉽습니다. 한편 Prometheus의 설정 파일은 얼마든지 그물에 정보가 있어, 노하우가 풍부합니다. 이번에는 AdditionalScrapeConfigs를 사용합니다.

    간단하게 Prometheus 자신의 지표를 수집하는 샘플입니다.

    additional-scrape-config.yaml
    - job_name: prometheus
      static_configs:
      - targets:
        - localhost:9090
    

    이것을 Secret화합니다.
    $ oc create secret generic prometheus-scrape-config --from-file additional-scrape-config.yaml --dry-run -o yaml | oc replace --force -f -
    

    그런 다음 Prometheus 인스턴스 additionalScrapeConfigs에서 비밀 이름과 파일 이름을 지정합니다.
    $ oc edit prometheus/server
    
    spec:
      additionalScrapeConfigs: # 追加
        name: prometheus-scrape-config # 追加
        key: additional-scrape-config.yaml # 追加
    

    이제 잠시 기다리면 스크레이프가 시작됩니다.

    스크래핑 대상을 추가하는 경우 Secret을 다시 만들면 prometheus-config-reloader가 자동으로 가져옵니다 (최대 몇 분 기다리지만).