AOC55

Backend, Devops, Cloud, kubernetes

Cloud/kubernetes (k8s)

IT서적후기 :: 쿠버네티스 오퍼레이터

aoc55.soft@gmail.com 2024. 9. 4. 00:11

https://product.kyobobook.co.kr/detail/S000001804982

 


 

후기

CKA 취득 등을 통해 kubernetes에 입문한 이후, 잠시 다른 개발 업무에 전념하다가.... kubernetes 에 대해 업무상에서 좀 더 deep dive 해야되서 보게 된 책이다.
읽는 시점에는 golang 에 대해 경험이 없다보니, 책 내 Operator SDK 내 실습 소스 구조 등을 정확히 이해하지는 못했지만, 그래도 Operator가 어떤 역할을 하는지, 목적이 무엇인지, 어떻게 구현하는지 등에 대해 어느정도 이해할 수 있었던 책 인 것 같다.

 

 

 


주요 내용

Operator

  • kubernetes 추상화확장을 통해, 특정 상태가 있는 애플리케이션의 전체 라이프사이클 관리자동화
  • kubernetes Application 에 대해 패키징과 실행 및 유지 관리하는 수단
  • 클러스터에 소프트웨어를 배포하는 '일관된 방법' (애플리케이션 문제 식별하고 수정 등)
  • Operator 는 'Software SRE' 이다. (즉, 오퍼레이터는 소프트웨에 '전문 관리자'의 기술을 인코딩)

 

Operator 작동방식

  • kubernetes Control Plane 및 API 를 확장해서 동작
  • 단순히 말하면 -> 'CR Resource'를 모니터링하고 유지 관리할 'Control Plane 구성요소'를 kubernetes 에 추가하는 것

 

Operator 범위

  • (1) 네임스페이스 범위
    • 대부분의 경우에 적합, 여러 팀에서 사용하는 클러스터에서 적합
  • (2) 클러스터 범위
    • 클러스터 전체 봐야 할때 (ex. istio, cert-manager)
    • 이때 clusterrole 및 clusterRoleBinding 등 설정 부여 필요 (role, rolebinding 이 아닌)

 

Operator 를 만든다?

(1) CRD 를 작성하고, (2) 해당 종류의 CR을 모니터링하는 루프를 실행하는 프로그램 제공

오퍼레이터가 CR 의 변경에 따라 응답에 행하는 작업은, 오퍼레이터가 관리하는 애플리케이션에 맞춰 구성함

 

Operator 구축하기

 

일단 '최소한의 실행 가능한 제품'으로 시작하자

이후에 점차 다음 '라이프사이클 관리', '업그레이드 기능' 추가 .. 등 오퍼레이터를 확장하자

즉, 시간의 지남에 따라 애플리케이션의 '완벽하고 반복적인 자동화' 구축 (궁극적으로는 오토파일럿 수준까지!)

결론은 단순하게 시작해서 정교함 키워가기

 

Operator 성숙도 모델 

"Operator Maturity Model"

 

(1단계)

  • "기본 설치"
  • 자동화된 애플리케이션 프로비저닝 및 구성 관리

 

(2단계)

  • "원활한 (Seamless) 업그레이드"
  • 패치 및 마이너 버전 업그레이드 지원

 

(3단계)

  • "전체 라이프 사이클"
  • 앱 라이프사이클, 스토리지 라이프 사이클 (백업, 복구, 실패)

 

(4단계)

  • "깊은 통찰력"
  • 메트릭, Alert, 로그처리, 워크로드 분석

 

(5단계)

  • "오토파일럿"
  • 수직,수평 스케일링, 자동구성 튜닝, 비정상 감지, 스케쥴 튜닝 등

 

Operator 구현 시 7가지 지침

 

(1) 오퍼레이터 자체는 1개 Deployment(Manifest)로 실행되야 함

  • (OLM Bundle 등 생성해도), OLM 은 여전히 단일 매니페스트 사용해 오퍼레이터 배포

 

(2) 오퍼레이터는 Cluster 에 새로운 사용자 정의 리소스(CR) 타입 정의 필요

  • ex. etcd-operator => 'EtcdCluster' 정의

 

(3) 오퍼레이터는 가능할때마다, 적절하게 k8s 추상화 리소스 사용

  • 유용하다고 알려진 오퍼레이터들의 경우 실질적으로 애플리케이션에 적합한 방식으로 '표준 리소스'들의 일부 세트 조작하는 것 이외에 거의 하지 않음

 

(4) 오퍼레이터 종료가 => 오퍼랜드 영향을 미쳐서는 X

  • 오퍼레이터는 정지되어도, 애플리케이션(오퍼랜드)는 계속 동작되어야 함
  • 단, CRD 제거 시에는 CR 인스턴스가 제거됨

 

(5) 오퍼레이터는 "이전 버전"에서 생성된 리소스 타입 지원 필요

  • 이전 모델 구조와 역-호환 되어야 함

 

(6) 오퍼레이터 "애플리케이션 업그레이드" 에 대한 중재 필요

  • 롤링 업그레이드 및 롤백 기능 포함해서 오퍼랜드의 업그레이드 중재 필요
  • 업그레이드 자동화는 오퍼레이터의 이상적인 작업

 

(7) 오퍼레이터는 카오스 테스트를 포함하여 "철저한 테스트" 통과 필요

  • 오퍼레이터 신뢰하기 위해서 테스트 스위트를 구축해서 철저한 테스트가 필요함

 


 

Operator SDK

오퍼레이터를 개발 및 배포 하기 위한 도구세트 (Go 언어 기반)

이외에 helm or Ansible 플레이북용 "어댑터 아키텍처"로도 지원

 

Adapter 기반의 Operator

Operator-SDK CLI 통해 => 오퍼레이터에서 'Helm' or 'Ansible' 같은 기술을, '실행하는데 필요한 코드' 생성할 수 있음즉, 필요한 오퍼레이터 코드를 일일히 작성할 필요 없이, Helm or Ansible 기반의 인프라를 => '오퍼레이터 모델'로 신속하게 마이그레이션 가능

 

GO Base Operator

Helm or Ansible Base의 Operator 의 경우, 결국에는 제약이 있음
더 복잡한 기술 등을 사용 하려면, 결국 Go 기반으로 오퍼레이터 구축 필요

 

구현 단계 요약

  1. kubernetes 연결코드, Operator 를 컨트롤러로 동작하게 필요하는 코드 생성
  2. 하나 이상의 CRD 작성해서, 애플리케이션 기본 비즈니스 로직을 모델로 생성 및 해당 모델과 상호작용 위한 API 제공
  3. 각 리소스의 라이프사이클 관리할 수 있도록, CRD 에 대한 컨트롤러 개발
  4. 오퍼레이터를 이미지로 만들고, "오퍼레이터와 관련 RBAC 구성요소"에 대한 배포를 위한 manifest 작성

 


OLM

OLM이 필요한 이유

  • 오퍼레이터 개발 이후 '설치 및 관리' 는 어떻게?"
  • 오퍼레이터 사용을 위한 Deployment, CRD 추가, 권한 구성 포함해서 여러 과정이 있고 -> 해당 과정 용이하게 하기 위한 "관리 계층"필요
  • OLM 은 CRD 디스크립터 형태의 설치지침 및 API 힌트 포함해서,
    오퍼레이터 딜리버리 하기 위한 패키징 방법과 호환 UI 에서 사용할 시각화를 위한 메타데이터 도입 등등의 기능 제공
  • 관련 CRD 로 csv, catalogsource, subscription, installplan, operatorgroup 등이 있음