반응형
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
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 |