클라우드/Docker & K8s

(2-1) - kube apiserver

게임이 더 좋아 2025. 4. 17. 22:35
반응형
728x170

kube-apiserver란?

kube-apiserver는 Kubernetes 클러스터의 중앙 관리 지점으로, 모든 API 요청을 처리하고 클러스터 상태를 관리함

다른 구성요소들은 API 서버를 통해 클러스터 정보를 업데이트하며, API 서버만이 etcd 데이터 저장소와 직접 상호작용함

 


 

 

아키텍처 및 구성요소

 

kube-apiserver는 다음과 같은 주요 구성요소로 이루어짐

  • 인터페이스 계층: RESTful API를 통해 클라이언트와 통신
  • 인증 및 권한 부여 계층: 요청의 인증과 권한을 검증
  • 어드미션 컨트롤러: 요청을 수락하거나 거부하는 정책을 적용
  • 데이터 저장소 계층: etcd와 상호작용하여 클러스터 상태를 저장하고 검색

 


기술

kube-apiserver는 Go 언어로 작성

  • Go 언어: 고성능의 병렬 처리를 지원하는 언어로, Kubernetes의 주요 컴포넌트들이 Go로 작성
  • etcd: 클러스터 상태를 저장하는 분산 키-값 저장소로, 고가용성과 일관성을 보장
  • TLS/SSL: 클러스터 내 통신의 보안을 위해 TLS를 사용
  • Admission Controllers: 클러스터에 대한 요청을 필터링하고 정책을 적용하는 플러그인 시스템

 

 

GitHub 구현

kube-apiserver의 구현은 Kubernetes 공식 리포지토리에서 확인​

  • 메인 구현: kubernetes/kubernetes 리포지토리의 cmd/kube-apiserver 디렉토리에서 확인 가능
  • API 서버 라이브러리: kubernetes/apiserver 리포지토리는 Kubernetes 스타일의 API 서버를 구축하기 위한 라이브러리를 제공

 

 


 

 

확장

  • 고가용성 구성: kube-apiserver는 수평 확장이 가능하므로, 여러 인스턴스를 배포하여 로드 밸런싱과 장애 조치가 가능함.
  • 모니터링: Prometheus와 같은 도구를 사용하여 API 서버의 메트릭을 수집하고, 성능을 모니터링함
  • 로그 관리: API 서버의 로그를 중앙 로그 시스템에 수집하여 문제 발생 시 빠르게 대응할 수 있음​
  • API 확장성: Custom Resource Definitions(CRDs)를 사용하여 Kubernetes API를 확장할 수 있음
  • 보안: RBAC(Role-Based Access Control)을 통해 세분화된 권한 관리를 구현
  • 자동화: CI/CD 파이프라인을 통해 kube-apiserver의 구성 변경을 자동화하고, 일관된 배포를 유지함
  • Webhook: API 서버의 동작 방식을 확장하기 위해 Webhook을 활용할 수 있음.
    • Admission Webhook을 통해 리소스 생성/수정/삭제 요청을 가로채어 사용자 정의 로직을 실행하거나 유효성 검사를 수행할 수 있음
  • Client-go: Go 언어로 개발된 Client-go 라이브러리를 사용하여 프로그래밍 방식으로 API 서버와 상호작용할 수 있음 이를 통해 쿠버네티스 컨트롤러, 오퍼레이터 등 다양한 자동화 도구를 개발할 수 있음.

 


 

Code 분석

 

 

apiserver.go
package main

import (
    "k8s.io/kubernetes/cmd/kube-apiserver/app"
    "k8s.io/kubernetes/cmd/kube-apiserver/app/options"
    "os"
)

func main() {
    s := options.NewServerRunOptions()
    command := app.NewAPIServerCommand(s)
    command.Execute()
}

main() 함수는 options.NewServerRunOptions()를 호출하여 기본 서버 옵션을 초기화하고,

app.NewAPIServerCommand()를 통해 Cobra 기반 CLI 명령어를 생성

command.Execute()는 서버 실행을 시작

이 파일은 단순히 진입점 역할을 하며, 실제 로직은 app 패키지에 위임함

 
주요 파일: server.go, options/options.go
 
 
server.go
 
func Run(runOptions *options.ServerRunOptions, stopCh <-chan struct{}) error {
    server, err := CreateServerChain(runOptions)
    if err != nil {
        return err
    }
    return server.PrepareRun().Run(stopCh)
}
 
CreateServerChain()은 API 서버, etcd 클라이언트, 인증/권한 부여 모듈을 초기화
PrepareRun()은 서버를 실행 준비 상태로 만들고, Run()은 HTTP 서버를 시작

 

 

 

options/options.go
type ServerRunOptions struct {
    GenericServerRunOptions *genericoptions.ServerRunOptions
    Etcd                    *genericoptions.EtcdOptions
    SecureServing           *genericoptions.SecureServingOptions
    // ... (다른 옵션들)
}
명령줄 플래그와 구성 파일을 통해 서버 설정(예: 포트, etcd 엔드포인트, TLS 인증서)을 처리

 

 
기타 파일:
  • config.go: 서버 구성 초기화와 검증 로직을 포함
  • plugins.go: 인증, 권한 부여, 입장 제어 플러그인을 등록

 

 

공유 라이브러리k8s.io/apiserver 패키지를 사용

주요 모듈:
  • 인증: k8s.io/apiserver/pkg/authentication
  • 권한 부여: k8s.io/apiserver/pkg/authorization
  • API 등록: k8s.io/apiserver/pkg/registry

 

  • API 처리:
    • RESTful API 요청을 처리하며, k8s.io/apiserver/pkg/endpoints 패키지를 통해 핸들러를 등록
    • 예: /api/v1/pods 엔드포인트는 파드 리소스를 조회/생성/업데이트/삭제
    • 변경 감시(watch) 기능은 클라이언트가 리소스 변경을 실시간으로 구독할 수 있도록 지원
  • 인증 및 권한 부여:
    • authentication 모듈은 X.509 인증서, Bearer 토큰, OpenID Connect 등을 지원
    • authorization 모듈은 RBAC(Role-Based Access Control)와 ABAC(Attribute-Based Access Control)을 구현
    • 플러그인 아키텍처를 사용하여 확장이 용이하며, 커스텀 인증/권한 부여 로직 추가가 가능
  • 입장 제어:
    • k8s.io/apiserver/pkg/admission 패키지를 통해 입장 제어 플러그인을 실행
    • 예: NamespaceLifecycle, ResourceQuota 플러그인은 리소스 생성 시 정책을 적용
  • etcd 통합:
    • k8s.io/client-go를 사용하여 etcd와 통신하며, 클러스터 상태를 저장/조회
    • etcd는 최종 일관성을 보장하며, kube-apiserver는 이를 통해 클러스터의 단일 진실 원천(Single Source of Truth)을 유지

 

 

샘플

https://github.com/kubernetes/sample-apiserver

 

 

 

https://arunprasad86.medium.com/want-to-understand-kubernetes-source-code-this-is-how-you-can-start-exploring-6eea25e50a69

 

 

 

728x90
반응형
그리드형

'클라우드 > Docker & K8s' 카테고리의 다른 글

(2) - 쿠버네티스 컴포넌트 개요  (0) 2025.04.17
(1) - 쿠버네티스란 무엇인가?  (0) 2025.04.17
Docker_Window  (0) 2023.01.21
구글 스터디잼  (0) 2022.10.21
K8s, Kubernetes - 기본 개념 (추가 중)  (0) 2022.10.06