클라우드 컨트롤러 매니저

클라우드 컨트롤러 매니저 (Cloud Controller Manager)

FEATURE STATE: Kubernetes v1.11 [beta]

클라우드 인프라 기술 덕분에 Kubernetes를 퍼블릭, 프라이빗, 하이브리드 클라우드에서 실행할 수 있어요. Kubernetes는 컴포넌트 사이에 타이트한 결합 없이 자동화되고 API 기반인 인프라를 지향해요.

cloud-controller-manager는 클라우드 특화 제어 로직을 포함하는 Kubernetes 컨트롤 플레인 컴포넌트예요. 클라우드 컨트롤러 매니저는 클러스터를 클라우드 제공자의 API에 연결해주고, 그 클라우드 플랫폼과 상호작용하는 컴포넌트를 클러스터와만 상호작용하는 컴포넌트에서 분리해줘요.

cloud-controller-manager는 Kubernetes와 그 아래의 클라우드 인프라 사이의 상호운용 로직을 분리함으로써, 클라우드 제공자가 메인 Kubernetes 프로젝트와 다른 속도로 기능을 릴리스할 수 있게 해줍니다.

cloud-controller-manager는 서로 다른 클라우드 제공자가 자신의 플랫폼을 Kubernetes와 통합할 수 있게 하는 플러그인 메커니즘으로 구조화되어 있어요.

출처: Kubernetes 공식 문서 — Cloud Controller Manager

설계 (Design)

클라우드 컨트롤러 매니저는 컨트롤 플레인에서 복제된 프로세스 집합으로 실행돼요(보통 Pod 안의 컨테이너). 각 cloud-controller-manager는 단일 프로세스에서 여러 컨트롤러를 구현합니다.

참고:

클라우드 컨트롤러 매니저를 컨트롤 플레인의 일부가 아니라 Kubernetes 애드온으로 실행할 수도 있어요.

클라우드 컨트롤러 매니저의 기능 (Cloud controller manager functions)

클라우드 컨트롤러 매니저 안의 컨트롤러는 다음과 같아요:

Node 컨트롤러

Node 컨트롤러는 클라우드 인프라에서 새 서버가 생성될 때 Node 객체를 업데이트하는 역할을 담당해요. Node 컨트롤러는 클라우드 제공자에서 자신의 테넌시(tenancy) 안에서 실행 중인 호스트에 대한 정보를 얻습니다. Node 컨트롤러는 다음 기능을 수행해요:

  1. 클라우드 제공자 API에서 얻은 서버의 고유 식별자로 Node 객체를 업데이트합니다.
  2. 노드가 배포된 리전(region)과 사용 가능한 리소스(CPU, 메모리 등) 같은 클라우드 특정 정보로 Node 객체에 어노테이션과 라벨을 답니다.
  3. 노드의 호스트 이름과 네트워크 주소를 가져옵니다.
  4. 노드의 상태(health)를 검증합니다. 노드가 응답하지 않게 되면 이 컨트롤러는 클라우드 제공자 API에 서버가 비활성화/삭제/종료됐는지 확인합니다. 노드가 클라우드에서 삭제됐다면 컨트롤러는 Kubernetes 클러스터에서 Node 객체를 삭제합니다.

일부 클라우드 제공자 구현은 이를 node 컨트롤러와 별도의 node lifecycle 컨트롤러로 나누기도 해요.

Route 컨트롤러

Route 컨트롤러는 Kubernetes 클러스터의 서로 다른 노드에 있는 컨테이너가 서로 통신할 수 있도록 클라우드에서 라우트를 적절히 구성하는 역할을 담당해요.

클라우드 제공자에 따라 Route 컨트롤러가 Pod 네트워크용 IP 주소 블록을 할당할 수도 있어요.

Service 컨트롤러

Service는 관리형 로드 밸런서, IP 주소, 네트워크 패킷 필터링, 타깃 상태 확인 같은 클라우드 인프라 컴포넌트와 통합돼요. Service 컨트롤러는 클라우드 제공자 API와 상호작용해서, 해당 컴포넌트가 필요한 Service 리소스를 선언할 때 로드 밸런서와 다른 인프라 컴포넌트를 설정합니다.

이 섹션은 cloud-controller-manager가 그 작업을 수행하기 위해 다양한 API 객체에 대해 요구하는 접근 권한을 나눠서 설명해줘요.

Node 컨트롤러는 Node 객체와만 작업해요. Node 객체를 읽고 수정할 완전한 권한이 필요합니다.

v1/Node:

  • get
  • list
  • create
  • update
  • patch
  • watch
  • delete

Route 컨트롤러는 Node 객체 생성을 감시하고 라우트를 적절히 구성해요. Node 객체에 대한 Get 접근 권한이 필요합니다.

v1/Node:

  • get

Service 컨트롤러는 Service 객체의 create, update, delete 이벤트를 감시하고 그 Service에 대해 로드 밸런서를 적절히 구성해요.

Service에 접근하려면 listwatch 권한이 필요해요. Service를 업데이트하려면 status 하위 리소스에 대한 patchupdate 권한이 필요합니다.

v1/Service:

  • list
  • get
  • watch
  • patch
  • update

cloud-controller-manager의 핵심 구현은 Event 객체를 생성할 권한이 필요하고, 안전한 운영을 위해 ServiceAccount를 생성할 권한이 필요해요.

v1/Event:

  • create
  • patch
  • update

v1/ServiceAccount:

  • create

cloud-controller-manager를 위한 RBAC ClusterRole은 다음과 같아요:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: cloud-controller-manager
rules:
- apiGroups:
  - ""
  resources:
  - events
  verbs:
  - create
  - patch
  - update
- apiGroups:
  - ""
  resources:
  - nodes
  verbs:
  - '*'
- apiGroups:
  - ""
  resources:
  - nodes/status
  verbs:
  - patch
- apiGroups:
  - ""
  resources:
  - services
  verbs:
  - list
  - watch
- apiGroups:
  - ""
  resources:
  - services/status
  verbs:
  - patch
  - update
- apiGroups:
  - ""
  resources:
  - serviceaccounts
  verbs:
  - create
- apiGroups:
  - ""
  resources:
  - persistentvolumes
  verbs:
  - get
  - list
  - update
  - watch

다음으로 볼 것 (What's next)

  • Cloud Controller Manager 관리에는 cloud-controller-manager를 실행하고 관리하는 방법이 나와요.
  • HA 컨트롤 플레인을 cloud-controller-manager를 사용하도록 업그레이드하려면 복제된 컨트롤 플레인을 Cloud Controller Manager 사용으로 마이그레이션을 참고하세요.
  • 자신의 cloud-controller-manager를 구현하거나 기존 프로젝트를 확장하고 싶나요?
    • cloud-controller-manager는 Go 인터페이스, 구체적으로는 kubernetes/cloud-providercloud.go에 정의된 CloudProvider 인터페이스를 사용해서 어떤 클라우드에서든 구현을 플러그인으로 꽂을 수 있게 해줘요.
    • 이 문서에서 강조한 공유 컨트롤러(Node, Route, Service) 구현과 스캐폴딩, 공유 cloudprovider 인터페이스는 Kubernetes 코어의 일부예요. 클라우드 제공자 특화 구현은 Kubernetes 코어 밖에 있으며 CloudProvider 인터페이스를 구현합니다.
    • 플러그인 개발에 대한 자세한 내용은 Cloud Controller Manager 개발을 참고하세요.

더 알아보기 (Learn more)