2.4. Server-Side Apply를 사용하여 Prometheus 리소스 사용자 정의


server-Side Apply는 Kubernetes 리소스를 공동으로 관리할 수 있는 기능입니다. 컨트롤 플레인은 다양한 사용자와 컨트롤러가 Kubernetes 오브젝트 내에서 필드를 관리하는 방법을 추적합니다. 필드 관리자의 개념을 소개하고 필드의 소유권을 추적합니다. 이 중앙 집중식 제어는 충돌 감지 및 해결을 제공하며 의도하지 않은 덮어쓰기의 위험을 줄입니다.

Client-Side Apply와 비교하면 더 선언적이며 마지막으로 적용된 상태가 아니라 필드 관리를 추적합니다.

server-Side 적용
삭제하고 다시 생성할 필요 없이 리소스의 상태를 업데이트하여 선언적 구성 관리.
필드 관리
사용자는 다른 필드에 영향을 주지 않고 업데이트할 리소스의 필드를 지정할 수 있습니다.
관리형 필드
Kubernetes는 메타데이터 내의 managedFields 필드에 있는 각 오브젝트 필드를 관리하는 사용자에 대한 메타데이터를 저장합니다.
충돌
여러 관리자가 동일한 필드를 수정하려고 하면 충돌이 발생합니다. applier는 관리를 덮어쓰거나, 리클립싱(relinquish)하거나, 관리하도록 선택할 수 있습니다.
병합 전략
server-Side Apply는 작업자를 관리하는 작업자에 따라 병합 필드를 적용합니다.

프로세스

  1. 다음 구성을 사용하여 MonitoringStack 리소스를 추가합니다.

    MonitoringStack 오브젝트의 예

    apiVersion: monitoring.rhobs/v1alpha1
    kind: MonitoringStack
    metadata:
      labels:
        coo: example
      name: sample-monitoring-stack
      namespace: coo-demo
    spec:
      logLevel: debug
      retention: 1d
      resourceSelector:
        matchLabels:
          app: demo

  2. sample-monitoring-stack 이라는 Prometheus 리소스는 coo-demo 네임스페이스에 생성됩니다. 다음 명령을 실행하여 생성된 Prometheus 리소스의 관리형 필드를 검색합니다.

    $ oc -n coo-demo get Prometheus.monitoring.rhobs -oyaml --show-managed-fields

    출력 예

    managedFields:
    - apiVersion: monitoring.rhobs/v1
      fieldsType: FieldsV1
      fieldsV1:
        f:metadata:
          f:labels:
            f:app.kubernetes.io/managed-by: {}
            f:app.kubernetes.io/name: {}
            f:app.kubernetes.io/part-of: {}
          f:ownerReferences:
            k:{"uid":"81da0d9a-61aa-4df3-affc-71015bcbde5a"}: {}
        f:spec:
          f:additionalScrapeConfigs: {}
          f:affinity:
            f:podAntiAffinity:
              f:requiredDuringSchedulingIgnoredDuringExecution: {}
          f:alerting:
            f:alertmanagers: {}
          f:arbitraryFSAccessThroughSMs: {}
          f:logLevel: {}
          f:podMetadata:
            f:labels:
              f:app.kubernetes.io/component: {}
              f:app.kubernetes.io/part-of: {}
          f:podMonitorSelector: {}
          f:replicas: {}
          f:resources:
            f:limits:
              f:cpu: {}
              f:memory: {}
            f:requests:
              f:cpu: {}
              f:memory: {}
          f:retention: {}
          f:ruleSelector: {}
          f:rules:
            f:alert: {}
          f:securityContext:
            f:fsGroup: {}
            f:runAsNonRoot: {}
            f:runAsUser: {}
          f:serviceAccountName: {}
          f:serviceMonitorSelector: {}
          f:thanos:
            f:baseImage: {}
            f:resources: {}
            f:version: {}
          f:tsdb: {}
      manager: observability-operator
      operation: Apply
    - apiVersion: monitoring.rhobs/v1
      fieldsType: FieldsV1
      fieldsV1:
        f:status:
          .: {}
          f:availableReplicas: {}
          f:conditions:
            .: {}
            k:{"type":"Available"}:
              .: {}
              f:lastTransitionTime: {}
              f:observedGeneration: {}
              f:status: {}
              f:type: {}
            k:{"type":"Reconciled"}:
              .: {}
              f:lastTransitionTime: {}
              f:observedGeneration: {}
              f:status: {}
              f:type: {}
          f:paused: {}
          f:replicas: {}
          f:shardStatuses:
            .: {}
            k:{"shardID":"0"}:
              .: {}
              f:availableReplicas: {}
              f:replicas: {}
              f:shardID: {}
              f:unavailableReplicas: {}
              f:updatedReplicas: {}
          f:unavailableReplicas: {}
          f:updatedReplicas: {}
      manager: PrometheusOperator
      operation: Update
      subresource: status

  3. metadata.managedFields 값을 확인하고, 메타데이터사양 의 일부 필드가 MonitoringStack 리소스에서 관리되는지 확인합니다.
  4. MonitoringStack 리소스에서 제어하지 않는 필드를 수정합니다.

    1. MonitoringStack 리소스에서 설정하지 않은 필드인 spec.enforcedSampleLimit 를 변경합니다. prom-spec-edited.yaml 파일을 생성합니다.

      prom-spec-edited.yaml

      apiVersion: monitoring.rhobs/v1
      kind: Prometheus
      metadata:
        name: sample-monitoring-stack
        namespace: coo-demo
      spec:
        enforcedSampleLimit: 1000

    2. 다음 명령을 실행하여 YAML을 적용합니다.

      $ oc apply -f ./prom-spec-edited.yaml --server-side
      참고

      --server-side 플래그를 사용해야 합니다.

    3. 변경된 Prometheus 오브젝트를 가져오고 managedFieldsspec.enforcedSampleLimit 이 있는 섹션이 하나 더 있음을 확인합니다.

      $ oc get prometheus -n coo-demo

      출력 예

      managedFields: 1
      - apiVersion: monitoring.rhobs/v1
        fieldsType: FieldsV1
        fieldsV1:
          f:metadata:
            f:labels:
              f:app.kubernetes.io/managed-by: {}
              f:app.kubernetes.io/name: {}
              f:app.kubernetes.io/part-of: {}
          f:spec:
            f:enforcedSampleLimit: {} 2
        manager: kubectl
        operation: Apply

      1
      managedFields
      2
      spec.enforcedSampleLimit
  5. MonitoringStack 리소스에서 관리하는 필드를 수정합니다.

    1. 다음 YAML 구성을 사용하여 MonitoringStack 리소스에서 관리하는 필드인 spec.LogLevel 을 변경합니다.

      # changing the logLevel from debug to info
      apiVersion: monitoring.rhobs/v1
      kind: Prometheus
      metadata:
        name: sample-monitoring-stack
        namespace: coo-demo
      spec:
        logLevel: info 1
      1
      spec.logLevel 추가
    2. 다음 명령을 실행하여 YAML을 적용합니다.

      $ oc apply -f ./prom-spec-edited.yaml --server-side

      출력 예

      error: Apply failed with 1 conflict: conflict with "observability-operator": .spec.logLevel
      Please review the fields above--they currently have other managers. Here
      are the ways you can resolve this warning:
      * If you intend to manage all of these fields, please re-run the apply
        command with the `--force-conflicts` flag.
      * If you do not intend to manage all of the fields, please edit your
        manifest to remove references to the fields that should keep their
        current managers.
      * You may co-own fields by updating your manifest to match the existing
        value; in this case, you'll become the manager if the other manager(s)
        stop managing the field (remove it from their configuration).
      See https://kubernetes.io/docs/reference/using-api/server-side-apply/#conflicts

    3. spec.logLevel 필드는 observability-operator 에서 이미 관리하므로 Server-Side Apply를 사용하여 변경할 수 없습니다.
    4. --force-conflicts 플래그를 사용하여 변경 사항을 강제 적용합니다.

      $ oc apply -f ./prom-spec-edited.yaml --server-side --force-conflicts

      출력 예

      prometheus.monitoring.rhobs/sample-monitoring-stack serverside-applied

      --force-conflicts 플래그를 사용하면 필드를 강제로 변경할 수 있지만 동일한 필드가 MonitoringStack 리소스에서도 관리되므로 Observability Operator는 변경 사항을 감지하고 MonitoringStack 리소스에서 설정한 값으로 되돌립니다.

      참고

      MonitoringStack 리소스에서 생성한 일부 Prometheus 필드는 MonitoringStack 사양 스탠자의 필드(예: logLevel )의 영향을 받습니다. 이는 MonitoringStack 사양 을 변경하여 변경할 수 있습니다.

    5. Prometheus 오브젝트에서 logLevel 을 변경하려면 다음 YAML을 적용하여 MonitoringStack 리소스를 변경합니다.

      apiVersion: monitoring.rhobs/v1alpha1
      kind: MonitoringStack
      metadata:
        name: sample-monitoring-stack
        labels:
          coo: example
      spec:
        logLevel: info
    6. 변경 사항이 수행되었는지 확인하려면 다음 명령을 실행하여 로그 수준을 쿼리합니다.

      $ oc -n coo-demo get Prometheus.monitoring.rhobs -o=jsonpath='{.items[0].spec.logLevel}'

      출력 예

      info

참고
  1. 새 버전의 Operator가 이전에 액터에 의해 생성 및 제어되는 필드를 생성하면 액터에 의해 설정된 값이 재정의됩니다.

    예를 들어 MonitoringStack 리소스에서 생성하지 않는 enforcedSampleLimit 필드를 관리하고 있습니다. Observability Operator가 업그레이드되고 새 버전의 Operator가 enforcedSampleLimit 에 대한 값을 생성하는 경우 이전에 설정한 값을 덮어씁니다.

  2. MonitoringStack 리소스에서 생성한 Prometheus 오브젝트에는 모니터링 스택에서 명시적으로 설정하지 않은 일부 필드가 포함될 수 있습니다. 이러한 필드는 기본값이 있기 때문에 나타납니다.
Red Hat logoGithubRedditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다. 최신 업데이트를 확인하세요.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

© 2024 Red Hat, Inc.