2.4. Server-Side Apply를 사용하여 Prometheus 리소스 사용자 정의
server-Side Apply는 Kubernetes 리소스를 공동으로 관리할 수 있는 기능입니다. 컨트롤 플레인은 다양한 사용자와 컨트롤러가 Kubernetes 오브젝트 내에서 필드를 관리하는 방법을 추적합니다. 필드 관리자의 개념을 소개하고 필드의 소유권을 추적합니다. 이 중앙 집중식 제어는 충돌 감지 및 해결을 제공하며 의도하지 않은 덮어쓰기의 위험을 줄입니다.
Client-Side Apply와 비교하면 더 선언적이며 마지막으로 적용된 상태가 아니라 필드 관리를 추적합니다.
- server-Side 적용
- 삭제하고 다시 생성할 필요 없이 리소스의 상태를 업데이트하여 선언적 구성 관리.
- 필드 관리
- 사용자는 다른 필드에 영향을 주지 않고 업데이트할 리소스의 필드를 지정할 수 있습니다.
- 관리형 필드
-
Kubernetes는 메타데이터 내의
managedFields
필드에 있는 각 오브젝트 필드를 관리하는 사용자에 대한 메타데이터를 저장합니다. - 충돌
- 여러 관리자가 동일한 필드를 수정하려고 하면 충돌이 발생합니다. applier는 관리를 덮어쓰거나, 리클립싱(relinquish)하거나, 관리하도록 선택할 수 있습니다.
- 병합 전략
- server-Side Apply는 작업자를 관리하는 작업자에 따라 병합 필드를 적용합니다.
프로세스
다음 구성을 사용하여
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
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
-
metadata.managedFields
값을 확인하고,메타데이터
및사양
의 일부 필드가MonitoringStack
리소스에서 관리되는지 확인합니다. MonitoringStack
리소스에서 제어하지 않는 필드를 수정합니다.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
다음 명령을 실행하여 YAML을 적용합니다.
$ oc apply -f ./prom-spec-edited.yaml --server-side
참고--server-side
플래그를 사용해야 합니다.변경된 Prometheus 오브젝트를 가져오고
managedFields
에spec.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
MonitoringStack
리소스에서 관리하는 필드를 수정합니다.다음 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
추가
다음 명령을 실행하여 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
-
spec.logLevel
필드는observability-operator
에서 이미 관리하므로 Server-Side Apply를 사용하여 변경할 수 없습니다. --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
사양
을 변경하여 변경할 수 있습니다.Prometheus 오브젝트에서
logLevel
을 변경하려면 다음 YAML을 적용하여MonitoringStack
리소스를 변경합니다.apiVersion: monitoring.rhobs/v1alpha1 kind: MonitoringStack metadata: name: sample-monitoring-stack labels: coo: example spec: logLevel: info
변경 사항이 수행되었는지 확인하려면 다음 명령을 실행하여 로그 수준을 쿼리합니다.
$ oc -n coo-demo get Prometheus.monitoring.rhobs -o=jsonpath='{.items[0].spec.logLevel}'
출력 예
info
새 버전의 Operator가 이전에 액터에 의해 생성 및 제어되는 필드를 생성하면 액터에 의해 설정된 값이 재정의됩니다.
예를 들어
MonitoringStack
리소스에서 생성하지 않는enforcedSampleLimit
필드를 관리하고 있습니다. Observability Operator가 업그레이드되고 새 버전의 Operator가enforcedSampleLimit
에 대한 값을 생성하는 경우 이전에 설정한 값을 덮어씁니다.-
MonitoringStack
리소스에서 생성한Prometheus
오브젝트에는 모니터링 스택에서 명시적으로 설정하지 않은 일부 필드가 포함될 수 있습니다. 이러한 필드는 기본값이 있기 때문에 나타납니다.