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

Crossplane 파드

원문 보기 위키 갱신

Crossplane 파드 (Crossplane Pods / Guides)

기본 Crossplane 설치는 두 개의 파드로 구성돼요: crossplane 파드와 crossplane-rbac-manager 파드. 두 파드는 기본적으로 crossplane-system 네임스페이스에 설치돼요.

출처: 문서

본문

Crossplane 파드

초기화 컨테이너 (Init container)

핵심 Crossplane 컨테이너가 시작되기 전에 초기화 컨테이너(init container)가 실행돼요. 이 초기화 컨테이너는 핵심 Crossplane 커스텀 리소스 정의(CRD)를 설치하고, Crossplane 웹훅을 구성하며, 제공된 Provider나 Configuration을 설치해요.

초기화 컨테이너가 설정하는 내용에는 Provider나 Configuration 패키지를 Crossplane으로 설치하는 일, Crossplane이 설치되는 네임스페이스 커스터마이징, 웹훅 구성 정의 등이 있어요. (Kubernetes 문서에 init container에 대한 더 자세한 정보가 있어요.)

초기화 컨테이너가 설치하는 핵심 CRD는 다음과 같아요.

  • CompositeResourceDefinitions, Compositions, Configurations, Providers
  • 패키지 의존성을 관리하는 Locks
  • 설치된 Providers와 Functions에 설정을 적용하는 DeploymentRuntimeConfigs

Crossplane 파드의 상태 Init는 초기화 컨테이너가 실행 중임을 의미해요.

kubectl get pods -n crossplane-system
NAME                                       READY   STATUS     RESTARTS   AGE
crossplane-9f6d5cd7b-r9j8w                 0/1     Init:0/1   0          6s

초기화 컨테이너가 완료되면 Crossplane 핵심 컨테이너가 자동으로 시작돼요.

kubectl get pods -n crossplane-system
NAME                                       READY   STATUS    RESTARTS   AGE
crossplane-9f6d5cd7b-r9j8w                 1/1     Running   0          15s

핵심 컨테이너 (Core container)

Crossplane 파드의 메인 컨테이너인 핵심 컨테이너는 Crossplane 리소스의 원하는 상태를 강제하고, 리더 선출(leader election)을 관리하며 웹훅을 처리해요.

참고로 Crossplane 파드는 컴포지트 리소스를 포함한 핵심 Crossplane 컴포넌트만 리컨사일(reconcile)해요. Provider는 자기 관리 리소스를 리컨사일할 책임이 있어요.

리컨사일 루프 (Reconcile loop)

핵심 컨테이너는 리컨사일 루프로 동작해요. 배포된 리소스의 상태를 계속 확인하고 "드리프트(drift)"를 바로잡는 방식이죠. 리소스를 확인한 Crossplane은 잠시 기다렸다가 다시 확인해요.

Crossplane은 Kubernetes watch를 통해 리소스를 모니터링하거나 주기적 폴링(polling)을 사용해요. 일부 리소스는 watch와 polling을 모두 할 수도 있어요.

Crossplane은 API 서버에 객체에 변경이 있을 때 알려달라고 요청하는데, 이 알림 도구가 watch예요. Watch 대상 객체에는 Providers, 관리 리소스, CompositeResourceDefinitions가 포함돼요.

Kubernetes가 watch를 제공할 수 없는 객체는 Crossplane이 주기적으로 폴링해서 상태를 확인해요. 기본 폴링 주기는 1분이에요. 폴링 주기는 --poll-interval 파드 인자로 변경할 수 있어요.

  • poll-interval 값을 줄이면 Crossplane이 리소스를 더 자주 폴링해요. 이는 Crossplane 파드의 부하를 늘리고 Provider API 호출을 더 자주 발생시켜요.
  • poll-interval 값을 늘리면 Crossplane이 리소스를 덜 자주 폴링해요. 이는 Crossplane이 클라우드 제공자의 변경을 발견하기까지 걸리는 최대 시간을 늘려요.

관리 리소스는 폴링을 사용해요. 관리 리소스는 삭제나 spec 변경 같은 Kubernetes 이벤트는 watch하지만, 외부 시스템의 변경을 감지하는 데는 폴링에 의존해요.

특정 리소스에 대해 전역 설정 대신 폴링 주기를 재정의하려면 crossplane.io/poll-interval 어노테이션을 쓰면 돼요. 즉시 리컨사일을 촉발하려면 crossplane.io/reconcile-requested-at 어노테이션을 사용해요. 자세한 내용은 관리 리소스 어노테이션 문서를 참고하세요.

Crossplane은 모든 리소스가 원하는 상태인지 이중 확인을 하는데, 기본적으로 1시간마다 실행해요. 이 간격은 --sync-interval Crossplane 파드 인자로 변경할 수 있어요.

--max-reconcile-rate는 Crossplane이 리소스를 리컨사일하는 초당 횟수를 정의해요.

  • --max-reconcile-rate를 줄이면 Crossplane이 사용하는 CPU 리소스가 줄어들지만, 변경된 리소스가 완전히 sync되기까지 걸리는 시간이 늘어나요.
  • --max-reconcile-rate를 늘리면 CPU 리소스는 더 쓰지만 모든 리소스를 더 빨리 리컨사일할 수 있어요.

대부분의 Provider는 자체 --max-reconcile-rate를 사용해요. 이는 Provider와 그 관리 리소스에 대해 같은 설정을 결정해요. --max-reconcile-rate를 Crossplane에 적용하면 핵심 Crossplane 리소스의 속도만 제어해요.

실시간 컴포지션 활성화 (Enable real time Compositions)

실시간 컴포지션을 활성화하면 Crossplane이 Kubernetes watch로 모든 컴포즈드 리소스를 감시해요. 컴포즈드 리소스가 변경되면(예: Provider가 Ready 조건을 true로 설정할 때) Crossplane은 Kubernetes API 서버에서 이벤트를 받아요.

실시간 컴포지션은 베타 기능이며, Crossplane은 베타 기능을 기본적으로 활성화해요. 실시간 컴포지션을 활성화하면 Crossplane은 --poll-interval 설정을 사용하지 않아요.

실시간 컴포지션 지원을 활성화하려면 Crossplane 파드 설정을 변경하고 --enable-realtime-compositions 인자를 켜면 돼요.

$ kubectl edit deployment crossplane --namespace crossplane-system
apiVersion: apps/v1
kind: Deployment
spec:
# Removed for brevity
  template:
    spec:
      containers:
      - args:
        - core
        - start
        - --enable-realtime-compositions

Crossplane 설치 가이드에서 --enable-realtime-compositions 같은 기능 플래그를 Helm으로 활성화하는 방법을 설명하고 있어요.

리컨사일 재시도 속도 (Reconcile retry rate)

--max-reconcile-rate 설정은 Crossplane이나 Provider가 리소스를 바로잡으려 시도하는 초당 횟수를 구성해요. 기본값은 초당 10회예요.

모든 핵심 Crossplane 컴포넌트는 리컨사일 속도를 공유해요. 각 Provider는 자체 최대 리컨사일 속도 설정을 구현해요.

리컨사일러 개수 (Number of reconcilers)

--max-reconcile-rate가 정의하는 두 번째 값은 Crossplane이 한 번에 리컨사일할 수 있는 리소스 수예요. 리소스가 설정된 --max-reconcile-rate보다 많으면 나머지 리소스는 Crossplane이 기존 리소스를 리컨사일할 때까지 기다려야 해요.

이 설정을 적용하는 방법은 Change Pod Settings 섹션을 참고하세요.

RBAC 매니저 파드

Crossplane RBAC 매니저 파드는 Crossplane과 Crossplane Provider에 필요한 Kubernetes RBAC 권한을 자동화해요.

Crossplane은 기본적으로 RBAC 매니저를 설치하고 활성화해요. RBAC 매니저를 비활성화하려면 Crossplane 운영에 필요한 Kubernetes 권한 정의를 수동으로 작성해야 해요. RBAC 매니저 디자인 문서에 Crossplane RBAC 요구사항에 대한 더 포괄적인 내용이 있어요.

RBAC 매니저 비활성화

설치 후 RBAC 매니저를 비활성화하려면 crossplane-system 네임스페이스에서 crossplane-rbac-manager deployment를 삭제하면 돼요. 설치 전에 비활성화하려면 Helm values.yaml 파일에서 rbacManager.deploy를 false로 설정해요.

RBAC 초기화 컨테이너

RBAC 매니저는 시작 전에 CompositeResourceDefinition과 ProviderRevision 리소스가 준비되어 있어야 해요. RBAC 매니저 초기화 컨테이너는 메인 RBAC 매니저 컨테이너를 시작하기 전에 이 리소스들을 기다려요.

RBAC 매니저 컨테이너

RBAC 매니저 컨테이너는 다음 작업을 수행해요.

  • Provider ServiceAccount에 RBAC 역할을 만들고 바인딩해, Provider가 자신의 관리 리소스를 제어할 수 있게 해줌
  • crossplane ServiceAccount가 관리 리소스를 만들 수 있게 허용
  • 모든 네임스페이스의 Crossplane 리소스에 접근하는 ClusterRoles 생성

이 ClusterRoles를 사용해 클러스터의 모든 Crossplane 리소스에 대한 접근을 부여해요.

Crossplane ClusterRoles

RBAC 매니저는 네 개의 Kubernetes ClusterRole을 만들어요. 이 역할들은 클러스터 전역의 Crossplane 리소스에 대한 권한을 부여해요.

crossplane-admin ClusterRole 권한:

  • 모든 Crossplane 타입에 대한 전체 접근
  • 모든 시크릿과 네임스페이스에 대한 전체 접근(Crossplane과 무관한 것 포함)
  • 모든 클러스터 RBAC 역할, CustomResourceDefinitions, 이벤트에 대한 읽기 전용 접근
  • RBAC 역할을 다른 엔티티에 바인딩하는 능력

전체 RBAC 정책 보기:

kubectl describe clusterrole crossplane-admin

crossplane-edit ClusterRole 권한:

  • 모든 Crossplane 타입에 대한 전체 접근
  • 모든 시크릿에 대한 전체 접근(Crossplane과 무관한 것 포함)
  • 모든 네임스페이스와 이벤트에 대한 읽기 전용 접근(Crossplane과 무관한 것 포함)

전체 RBAC 정책 보기:

kubectl describe clusterrole crossplane-edit

crossplane-view ClusterRole 권한:

  • 모든 Crossplane 타입에 대한 읽기 전용 접근
  • 모든 네임스페이스와 이벤트에 대한 읽기 전용 접근(Crossplane과 무관한 것 포함)

전체 RBAC 정책 보기:

kubectl describe clusterrole crossplane-view

리더 선출 (Leader election)

기본적으로 클러스터에는 단일 Crossplane 파드만 실행돼요. 두 개 이상의 Crossplane 파드가 실행되면 두 파드가 모두 Crossplane 리소스를 관리하려 해요. 충돌을 막기 위해 Crossplane은 리더 선출을 사용해 한 번에 하나의 파드만 제어권을 갖게 해요. 다른 Crossplane 파드들은 리더가 실패할 때까지 대기해요.

중복을 위해 Crossplane이나 RBAC 매니저 파드를 둘 이상 실행하는 것도 가능해요. Kubernetes는 실패한 Crossplane이나 RBAC 매니저 파드를 다시 시작해요. 대부분의 배포에서는 중복 파드가 필요하지 않아요.

Crossplane 파드와 RBAC 매니저 파드 모두 리더 선출을 지원해요. --leader-election 파드 인자로 리더 선출을 활성화할 수 있어요.

리더 선출 없이 여러 Crossplane 파드를 실행하는 것은 지원되지 않아요.

파드 설정 변경 (Change pod settings)

Crossplane 파드 설정은 Crossplane 설치 전에 Helm values.yml 파일을 편집하거나, 설치 후 Deployment를 편집해 변경할 수 있어요. 설정 옵션과 기능 플래그의 전체 목록은 Crossplane Install 섹션에서 확인할 수 있어요.

Deployment 편집

이 설정은 crossplane과 rbac-manager 파드, Deployments 모두에 적용돼요.

설치된 Crossplane 파드의 설정을 변경하려면 crossplane-system 네임스페이스의 crossplane deployment를 다음 명령으로 편집해요.

kubectl edit deployment crossplane --namespace crossplane-system

Crossplane deployment를 업데이트하면 Crossplane 파드가 재시작돼요. Crossplane 파드 인자는 deployment의 spec.template.spec.containers[].args 섹션에 추가해요.

예를 들어 sync-interval을 변경하려면 --sync-interval=30m을 추가해요.

kubectl edit deployment crossplane --namespace crossplane-system
apiVersion: apps/v1
kind: Deployment
spec:
# Removed for brevity
  template:
    spec:
      containers:
      - args:
        - core
        - start
        - --sync-interval=30m

환경 변수 사용

핵심 Crossplane 파드는 시작 시 기본 설정을 변경하기 위해 구성된 환경 변수를 확인해요. 구성 가능한 환경 변수 전체 목록은 Crossplane Install 섹션에서 확인할 수 있어요.

더 알아보기 (Learn more)