본문 바로가기
WIKI 기술 지식 베이스

변경 로그

원문 보기 위키 갱신

변경 로그 (Change Logs)

이 기능은 v1.17에서 도입되었습니다. 자세한 내용은 Crossplane 기능 생명주기 문서를 참고하세요.

출처: 문서

본문

변경 로그(change logs) 기능은 Crossplane Provider 사용자가 provider가 관리하는 리소스에 어떤 변경을 하는지 이해하는 데 도움을 줍니다. provider가 관리 리소스를 만들거나, 업데이트하거나, 삭제할 때마다 provider는 변경 로그에 변경 내용의 세부 사항을 설명하는 항목을 기록합니다.

변경 로그는 provider가 관리 리소스에 가하는 변경에 대한 인식을 제공하므로 중요합니다. Crossplane의 능동적 조정(reconciliation) 특성상, 사용자 상호 작용 없이도 provider가 관리 리소스를 변경할 수 있습니다. 예를 들어 누군가 AWS 콘솔이나 gcloud CLI를 통해 Crossplane 밖에서 리소스를 업데이트하는 시나리오를 생각해 보세요. Crossplane이 이 구성 드리프트를 감지하면, 선언된 상태를 강제하고 사용자 상호 작용 없이 예기치 않은 변경을 수정합니다.

Crossplane이 중요한 인프라를 업데이트하기 위해 지속적이고 자율적으로 동작하기 때문에, 사용자가 provider가 수행하는 작업에 대한 통찰을 갖고 컨트롤 플레인에 대한 강한 신뢰감을 구축하고 유지하는 것이 중요합니다. 변경 로그는 provider가 하는 모든 변경에 대한 세부 정보를 제공하므로, 사용자는 명시적으로 기대하지 않더라도 모든 변경을 인지할 수 있습니다.

💡 Tip: 변경 로그는 provider가 리소스에 가하는 모든 변경을 이해하는 데 도움을 줍니다. 예를 들어 Crossplane의 구성 드리프트 자동 수정 때문에 명시적으로 요청하지 않은 변경도 포함해요.

변경 로그 활성화하기 (Enabling change logs)

⚠️ 중요: 변경 로그는 alpha 기능이며 DeploymentRuntimeConfig를 통해 각 provider에 대해 명시적으로 활성화해야 합니다.

provider에 변경 로그를 활성화하려면 DeploymentRuntimeConfig를 사용해 변경 로그를 생성해야 하는 각 provider 파드를 구성하세요. DeploymentRuntimeConfig에는 몇 가지 중요한 구성 세부 사항이 있습니다.

  • 변경 로그 기능을 활성화하는 provider 컨테이너의 명령줄 인자, 예: --enable-changelogs
  • 변경 이벤트를 수집하고 provider 파드 로그에 변경 로그 항목을 생성하는 사이드카 컨테이너
  • 두 컨테이너 간의 변경 이벤트 통신을 가능하게 하는 provider와 sidecar 컨테이너 모두에 마운트된 공유 볼륨

사전 요구 사항 (Prerequisites)

이 가이드는 Crossplane이 설치된 컨트롤 플레인이 있다고 가정합니다. 또한 변경 로그의 내용을 가볍게 쿼리하고 필터링하는 jq 도구가 설치되어 있다고 가정합니다. 변경 로그 활성화의 유일한 다른 사전 요구 사항은 변경 로그 기능에 대한 provider 지원입니다. 변경 로그 지원은 선택 사항이며, Crossplane 생태계의 모든 provider가 아직 추가한 것은 아닙니다.

💡 Tip: 모든 provider가 변경 로그 기능을 지원하는 것은 아닙니다. 원하는 provider가 변경 로그 지원을 추가했는지 확인하세요.

이 가이드는 provider-kubernetes로 변경 로그를 생성하는 전체 예제를 진행합니다.

DeploymentRuntimeConfig 만들기

다음 구성 단계를 수행해 provider가 설치될 때 변경 로그를 활성화하는 DeploymentRuntimeConfig를 만드세요.

  • provider에 --enable-changelogs 플래그 설정
  • provider 파드에 sidecar 컨테이너 추가
  • 공유 볼륨을 선언하고 provider 컨테이너와 sidecar 컨테이너에 마운트
apiVersion: pkg.crossplane.io/v1beta1
kind: DeploymentRuntimeConfig
metadata:
  name: enable-changelogs
spec:
  deploymentTemplate:
    spec:
      selector: {}
      template:
        spec:
          containers:
          - name: package-runtime
            args:
            - --enable-changelogs
            volumeMounts:
            - name: changelogs-vol
              mountPath: /var/run/changelogs
          - name: changelogs-sidecar
            image: xpkg.crossplane.io/crossplane/changelogs-sidecar:v0.0.1
            volumeMounts:
            - name: changelogs-vol
              mountPath: /var/run/changelogs
          volumes:
          - name: changelogs-vol
            emptyDir: {}
  serviceAccountTemplate:
    metadata:
      name: provider-kubernetes
$ kubectl apply -f https://docs.crossplane.io/latest/manifests/guides/change-logs/deploymentruntimeconfig-enable-changelogs.yaml

Provider 설치하기

provider를 설치하고 방금 만든 DeploymentRuntimeConfig를 사용하도록 지시하세요.

apiVersion: pkg.crossplane.io/v1
kind: Provider
metadata:
  name: provider-kubernetes
spec:
  package: xpkg.crossplane.io/crossplane-contrib/provider-kubernetes:v0.18.0
  runtimeConfigRef:
    apiVersion: pkg.crossplane.io/v1beta1
    kind: DeploymentRuntimeConfig
    name: enable-changelogs
$ kubectl apply -f https://docs.crossplane.io/latest/manifests/guides/change-logs/provider-kubernetes.yaml

권한 구성하기

provider가 컨트롤 플레인에서 Kubernetes 리소스를 만들 수 있게 하려면 적절한 권한을 부여하세요. 이 가이드는 ConfigMap만 만들므로 해당 리소스 유형에 대한 권한만 필요합니다.

⚠️ 중요: 이 가이드는 예시 목적으로 provider에 특정 권한을 부여합니다. 이 접근 방식은 프로덕션 환경을 대표할 의도가 아닙니다. provider-kubernetes 구성에 대한 더 많은 예제는 examples 디렉터리에서 확인하세요.

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: configmap-edit
rules:
  - apiGroups:
      - ""
    resources:
      - configmaps
    verbs:
      - "*"
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: provider-kubernetes-configmap-edit
subjects:
  - kind: ServiceAccount
    name: provider-kubernetes
    namespace: crossplane-system
roleRef:
  kind: ClusterRole
  name: configmap-edit
  apiGroup: rbac.authorization.k8s.io
---
apiVersion: kubernetes.crossplane.io/v1alpha1
kind: ProviderConfig
metadata:
  name: default
spec:
  credentials:
    source: InjectedIdentity
$ kubectl apply -f https://docs.crossplane.io/latest/manifests/guides/change-logs/rbac.yaml

리소스 만들기

변경 로그가 활성화된 provider를 설치하고 구성한 후, 컨트롤 플레인이 취하는 동작을 반영하는 변경 로그 항목을 생성하는 리소스를 만드세요.

apiVersion: kubernetes.crossplane.io/v1alpha2
kind: Object
metadata:
  name: configmap-for-changelogs
spec:
  forProvider:
    manifest:
      apiVersion: v1
      kind: ConfigMap
      metadata:
        namespace: default
        name: configmap-for-changelogs
      data:
        key-1: cool-value-1
$ kubectl apply -f https://docs.crossplane.io/latest/manifests/guides/change-logs/object-configmap-for-changelogs.yaml

변경 로그 검사하기

변경 로그에 리소스 생성 작업이 포함되는지 확인하세요. provider-kubernetes의 파드 로그, 특히 changelogs-sidecar 컨테이너를 검사합니다.

$ kubectl -n crossplane-system logs -l pkg.crossplane.io/provider=provider-kubernetes -c changelogs-sidecar | jq
{
  "timestamp": "2025-04-25T08:23:34Z",
  "provider": "provider-kubernetes:v0.18.0",
  "apiVersion": "kubernetes.crossplane.io/v1alpha2",
  "kind": "Object",
  "name": "configmap-for-changelogs",
  "externalName": "configmap-for-changelogs",
  "operation": "OPERATION_TYPE_CREATE",
  "snapshot": {
  ...(omitted for brevity)...

각 변경 로그 항목은 변경 작업이 발생했을 때 리소스 상태에 대한 풍부한 정보를 포함합니다. 각 항목은 구조화된 JSON 객체이므로 필터링하고 쿼리하여 관심 있는 정보의 부분 집합을 찾을 수 있습니다.

$ kubectl -n crossplane-system logs -l pkg.crossplane.io/provider=provider-kubernetes -c changelogs-sidecar \
  | jq '.timestamp + " " + .provider + " " + .kind + " " + .name + " " + .operation'
"2025-04-25T08:23:34Z provider-kubernetes:v0.18.0 Object configmap-for-changelogs OPERATION_TYPE_CREATE"

전체 생명주기 작업

업데이트와 삭제 작업도 해당하는 변경 로그 항목을 생성합니다. 데이터 필드 key-1을 새 값 cooler-value-2로 패치해 리소스를 업데이트하세요.

$ kubectl patch object configmap-for-changelogs --type=json \
  -p='[{"op": "replace", "path": "/spec/forProvider/manifest/data/key-1", "value": "cooler-value-2"}]'
object.kubernetes.crossplane.io/configmap-for-changelogs patched

그런 다음 객체를 완전히 삭제하세요.

$ kubectl delete object configmap-for-changelogs
object.kubernetes.crossplane.io "configmap-for-changelogs" deleted

변경 로그를 다시 확인해 업데이트와 삭제 작업이 모두 포함되고 객체의 전체 생명주기를 캡처하는지 검증하세요.

$ kubectl -n crossplane-system logs -l pkg.crossplane.io/provider=provider-kubernetes -c changelogs-sidecar \
  | jq '.timestamp + " " + .provider + " " + .kind + " " + .name + " " + .operation'
"2025-04-25T08:23:34Z provider-kubernetes:v0.18.0 Object configmap-for-changelogs OPERATION_TYPE_CREATE"
"2025-04-25T08:24:21Z provider-kubernetes:v0.18.0 Object configmap-for-changelogs OPERATION_TYPE_UPDATE"
"2025-04-25T08:24:25Z provider-kubernetes:v0.18.0 Object configmap-for-changelogs OPERATION_TYPE_DELETE"

더 알아보기 (Learn more)