TimesTenメトリックの自動公開

TimesTenオペレータがTimesTenメトリックを自動的にエクスポートおよび公開する方法を示す例を順を追って説明します。この例では、TimesTenClassicオブジェクトを作成し、TimesTenオペレータが、TimesTenメトリックをPrometheusに自動的にエクスポートして公開するために必要なオブジェクトを自動的に作成する方法を確認します。

PrometheusオペレータがKubernetesクラスタにインストールされており、ネームスペースでPrometheusサーバーが実行されているとします。また、「TimesTenオペレータの概要」のステップに従ってTimesTenオペレータが起動しており、ネームスペースにTimesTenClassicまたはTimesTenScaleoutオブジェクトがデプロイされていないとします。

  1. TimesTenClassicオブジェクトを作成します。
    vi samplepublish.yaml
    
    apiVersion: timesten.oracle.com/v2
    kind: TimesTenClassic
    metadata:
      name: samplepublish
    spec:
      ttspec:
        storageClassName: oci
        storageSize: 250G
        image: container-registry.oracle.com/timesten/timesten:22.1.1.27.0
        imagePullSecret: sekret
        prometheus:
          port: 6666

    この例では、TimesTenエクスポータがリスニングするポートは6666です。

  2. TimesTenClassicオブジェクトをデプロイします。
    kubectl create -f samplepublish.yaml
    出力は次のようになります。
    timestenclassic.timesten.oracle.com/samplepublish created
  3. 数分待ってから、TimesTenClassicオブジェクトがNormal状態であることを確認します。
    kubectl get ttc samplepublish

    出力は、次のようになります。

    NAME            STATE    ACTIVE            AGE
    samplepublish   Normal   samplepublish-0   3m56s
  4. TimesTenオペレータが各TimesTenポッドにexporterコンテナをプロビジョニングしたことを確認します
    kubectl get pods
    出力は、次のようになります。
    NAME                                  READY   STATUS    RESTARTS   AGE
    ...
    samplepublish-0                       3/3     Running   0          7m33s
    samplepublish-1                       3/3     Running   0          7m33s
    ...

    TimesTenオペレータは、TimesTenポッドごとに3つのコンテナをプロビジョニングしました。これらのコンテナの1つは、TimesTenエクスポータを実行しているexporterコンテナです。

  5. TimesTenオペレータが適切なKubernetes Secretを自動的に作成したことを確認します。
    kubectl get secrets

    出力は、次のようになります。

    NAME                                             TYPE                             DATA   AGE
    ...
    samplepublish-metrics                            Opaque                           1      15m
    samplepublish-metrics-client                     Opaque                           3      15m

    デフォルトでは、TimesTenメトリックはhttpsを使用して処理されます。その結果、TimesTenオペレータは、httpsに必要なOracleウォレット、証明書およびKubernetes Secretを自動的に作成しました。詳細は、「TimesTenメトリックのトランスポート・レイヤー・セキュリティ(相互TLS)証明書について」を参照してください。

  6. 適切なファイルがsamplepublish-metrics-client Kubernetes Secretにあることを確認します。
    kubectl describe secret samplepublish-metrics-client

    出力は、次のようになります。

    Name:         samplepublish-metrics-client
    Namespace:    mynamespace
    Labels:       <none>
    Annotations:  <none>
    
    Type:  Opaque
    
    Data
    ====
    ca.crt:      1461 bytes
    client.crt:  1273 bytes
    client.key:  1675 bytes
    

    TimesTenオペレータにより、ca.crtclient.crtおよびclient.keyファイルが自動的に作成されました。samplepublish-metrics-client Kubernetes Secretには、これらのファイルが保持されます。「TimesTenメトリックのトランスポート・レイヤー・セキュリティ(相互TLS)証明書について」を参照してください。

  7. TimesTenオペレータによってsamplepublish PodMonitorオブジェクトが自動的に作成されたことを確認します。
    kubectl describe podmonitor samplepublish

    出力は、次のようになります。

    Name:         samplepublish
    Namespace:    mynamespace
    Labels:       app=samplepublish
                  database.timesten.oracle.com=samplepublish
    Annotations:  <none>
    API Version:  monitoring.coreos.com/v1
    Kind:         PodMonitor
    Metadata:
      Creation Timestamp:  2024-01-25T15:36:08Z
      Generation:          1
      Owner References:
        API Version:           timesten.oracle.com/v2
        Block Owner Deletion:  true
        Controller:            true
        Kind:                  TimesTenClassic
        Name:                  samplepublish
        UID:                   d0f46bf7-b1d8-4499-876c-51410a469772
      Resource Version:        284346942
      UID:                     5a61ec9e-df7d-4a98-be47-dce1e7c3d217
    Spec:
      Namespace Selector:
      Pod Metrics Endpoints:
        Bearer Token Secret:
          Key:
        Interval:  15s
        Path:      /metrics
        Port:      exporter
        Scheme:    https
        Tls Config:
          Ca:
            Secret:
              Key:   ca.crt
              Name:  samplepublish-metrics-client
          Cert:
            Secret:
              Key:   client.crt
              Name:  samplepublish-metrics-client
          Key Secret:
            Key:        client.key
            Name:       samplepublish-metrics-client
          Server Name:  samplepublish.samplepublish.mynamespace.svc.cluster.local
      Selector:
        Match Labels:
          database.timesten.oracle.com:  samplepublish
    Events:                              <none>

    このPodMonitorオブジェクトの重要な情報を見てみましょう。

    • app=samplepublishラベルがあります。app=samplepublishに一致するラベルの付いたポッドがある場合、Prometheusはそこからメトリックをスクレイプします。TimesTenポッドには、app=samplepublishラベルが含まれます。したがって、Prometheusはこれらのポッドからメトリックをスクレイプします。後で説明します。

    • Prometheusは、/metricsエンドポイントからメトリックをスクレイプします。
    • メトリックは、httpsを使用して公開されます。
    • TimesTenオペレータは、samplepublish-metricsおよびsamplepublish-metrics-client Kubernetes SecretをPodMonitorオブジェクトに配置しました。これらのシークレットとその内容はPrometheusオペレータによって使用されます。

    Prometheusオペレータは、このPodMonitorオブジェクトの情報に基づいてPrometheusサーバー構成ファイルを編集します。

  8. TimesTenオペレータが適切なKubernetesサービスを自動的に作成したことを確認します。
    kubectl describe service samplepublish

    出力は、次のようになります。

    Name:              samplepublish
    Namespace:         mynamespace
    Labels:            app=samplepublish
    Annotations:       <none>
    Selector:          app=samplepublish
    Type:              ClusterIP
    IP Family Policy:  SingleStack
    IP Families:       IPv4
    IP:                None
    IPs:               None
    Port:              cs  6625/TCP
    TargetPort:        6625/TCP
    Endpoints:         10.244.0.120:6625,10.244.1.144:6625
    Port:              exporter  6666/TCP
    TargetPort:        6666/TCP
    Endpoints:         10.244.0.120:6666,10.244.1.144:6666
    Session Affinity:  None
    Events:            <none>
    

    TimesTenエクスポータは、ポート6666でリスニングします。

  9. ネームスペースでPrometheusサーバーが実行されていることを確認します。
    kubectl get pods

    出力は、次のようになります。

    NAME                                  READY   STATUS    RESTARTS   AGE
    prometheus-sampleprometheusserver-0   2/2     Running   2          18d
    ...

    prometheus-sampleprometheusserver-0 Prometheusサーバーがネームスペースで実行されています。

  10. Prometheusオペレータがsamplepublish PodMonitorオブジェクトの情報に基づいてPrometheusサーバー構成ファイルを編集したことを確認します。
     kubectl exec prometheus-sampleprometheusserver-0 -c prometheus -- cat /etc/prometheus/config_out/prometheus.env.yaml
    出力は、次のようになります。
    global:
      evaluation_interval: 30s
      scrape_interval: 30s
      external_labels:
        prometheus: mynamespace/sampleprometheusserver
        prometheus_replica: prometheus-sampleprometheusserver-0
    scrape_configs:
    - job_name: podMonitor/mynamespace/samplepublish/0
      honor_labels: false
      kubernetes_sd_configs:
      - role: pod
        namespaces:
          names:
          - mynamespace
      scrape_interval: 15s
      metrics_path: /metrics
      scheme: https
      tls_config:
        insecure_skip_verify: false
        ca_file: /etc/prometheus/certs/secret_mynamespace_samplepublish-metrics-client_ca.crt
        cert_file: /etc/prometheus/certs/secret_mynamespace_samplepublish-metrics-client_client.crt
        key_file: /etc/prometheus/certs/secret_mynamespace_samplepublish-metrics-client_client.key
        server_name: samplepublish.samplepublish.mynamespace.svc.cluster.local
      relabel_configs:
      - source_labels:
        - job
        target_label: __tmp_prometheus_job_name
      - action: drop
        source_labels:
        - __meta_kubernetes_pod_phase
        regex: (Failed|Succeeded)
      - action: keep
        source_labels:
        - __meta_kubernetes_pod_label_database_timesten_oracle_com
        - __meta_kubernetes_pod_labelpresent_database_timesten_oracle_com
        regex: (samplepublish);true
      - action: keep
        source_labels:
        - __meta_kubernetes_pod_container_port_name
        regex: exporter
      - source_labels:
        - __meta_kubernetes_namespace
        target_label: namespace
      - source_labels:
        - __meta_kubernetes_pod_container_name
        target_label: container
      - source_labels:
        - __meta_kubernetes_pod_name
        target_label: pod
      - target_label: job
        replacement: mynamespace/samplepublish
      - target_label: endpoint
        replacement: exporter
      - source_labels:
        - __address__
        target_label: __tmp_hash
        modulus: 1
        action: hashmod
      - source_labels:
        - __tmp_hash
        regex: 0
        action: keep
      metric_relabel_configs: []

    Prometheusには、TimesTenメトリックをスクレイプするために必要な情報があります。

  11. TimesTenメトリックの一部を確認します。ブラウザで、Prometheusサーバーに移動します。
    1. Prometheusサーバー検索バーに、TimesTenメトリックを入力します。たとえば、timesten_databasesです。次に、「Execute」をクリックします。

      出力は、次のようになります。

      timesten_databases{container="exporter", endpoint="exporter", 
      instance="10.244.0.120:6666", instancename="instance1", job="mynamespace/samplepublish", 
      namespace="mynamespace", pod="samplepublish-0"} 1
      
      timesten_databases{container="exporter", endpoint="exporter", 
      instance="10.244.1.144:6666", instancename="instance1", job="mynamespace/samplepublish", 
      namespace="mynamespace", pod="samplepublish-1"} 1

      メトリックの値1が示すとおり、samplepublish-0ポッドに1つのTimesTenデータベース、samplepublish-1ポッドに1つのTimesTenデータベースがあります。

    2. Prometheusサーバー検索バーに、2番目のTimesTenメトリックを入力します。たとえば、timesten_database_loadedです。次に、「Execute」をクリックします。

      出力は、次のようになります。

      timesten_database_loaded{container="exporter", dsn="samplepublish", 
      endpoint="exporter", instance="10.244.0.120:6666", instancename="instance1", 
      job="mynamespace/samplepublish", namespace="mynamespace", 
      pod="samplepublish-0"} 1
      
      timesten_database_loaded{container="exporter", dsn="samplepublish", 
      endpoint="exporter", instance="10.244.1.144:6666", instancename="instance1", 
      job="mynamespace/samplepublish", namespace="mynamespace", 
      pod="samplepublish-1"} 1
      

      samplepublish-0ポッドのsamplepublishデータベースとsamplepublish-1ポッドのsamplepublishデータベースはどちらも、メトリックの値1が示すとおり、メモリーにロードされます。

おめでとうございます。Prometheusによってメトリックが収集されるTimesTenデータベースが正常に作成されました。