profile image

L o a d i n g . . .

동작 과정

쿠버네티스 API 서버는 클러스터 상태를 조회하고 변경하기 위해 RESTful API로 CRUD 인터페이스를 제공한다.
쿠버네티스 상태는 etcd 안에 저장된다.

API 서버의 클라이언트 중 하나는 kubectl 명령줄 도구이다. 예를 들어 yaml 파일에서 리소스를 생성할 때 kubectl은 파일의 내용을 API에 HTTP POST 요청으로 전달한다.

API 서버의 동작

api 서버 옵션 조회
kubeadm 툴을 이용했을 시, kube-apiserver 는 master 노드 kube-system 네임스페이스에서 Pod 로 존재함을 확인할 수 있다.

kubectl get pods -n kube-system
cat /etc/kubernetes/manifests/kube-apiserver.yaml

kubeadm 툴을 사용하지 않았다면, 다음 명령어를 통해 옵션을 볼 수 있다.

cat /etc/systemd/system/kube-apiserver.service

실행 중인 프로세스 목록에서 검색을 통해 확인할 수도 있다.

ps -aux | grep kube-apiserver

Authentication: 인증 플러그인으로 클라이언트 인증

먼저 API 서버는 요청을 보낸 클라이언트를 인증한다. 이 작업은 API 서버에 구성된 하나 이상의 플러그인에 의해 수행되며, API 서버는 누가 요청을 보낸 것인지 밝혀낼 수 있을 때까지 이들 플러그인을 차례로 호출한다. 요청에서 해당 정보를 처음으로 추출해낸 플러그인은 사용자 이름, 사용자 ID와 클라이언트가 속한 그룹을 API 서버 코어에 반환한다. API 서버는 나머지 인증 플러그인의 호출을 중지하고 계속해서 인가 단계를 진행한다.
인증 플러그인은 다음 방법을 사용해 클라이언트의 아이덴티티를 얻는다.

  • 클라이언트의 인증서
  • HTTP 헤더로 전달된 인증 토큰
  • 기본 HTTP 인증
  • 기타

Authorization: 인가 플러그인을 통한 클라이언트 인가

API 서버는 인증 플러그인 이외에도 하나 이상의 인가 플러그인을 사용하도록 설정돼 있다. 이 작업은 인증된 사용자가 요청한 작업이 요청한 리소스를 대상으로 수행할 수 있는지를 판별한다. 예를 들어 Pod를 생성할 때 API 서버는 모든 인가 플러그인을 차례로 호출해 사용자가 요청한 네임스페이스 안에 파드를 생성할 수 있는지 결정한다.


Admission controle plugin: 요청된 리소스 확인과 수정

리소스를 생성, 수정, 삭제하려는 요청인 경우에 해당 요청은 어드미션 컨트롤로 보내진다. 이 플러그인은 리소스를 여러가지로 수정할 수 있다. 예시는 다음과 같다.

  • AlwaysPullImages: 파드의 imagePullPolicy를 Always로 변경해 파드가 배포도리 때마다 이미지를 강제로 가져오도록 재정의한다.
  • ServiceAccount: 명시적으로 지정하지 않을 시, default 서비스 어카운트 적용
  • NamespaceLifecycle: 삭제되고 있는 혹은 존재하지 않는 네임스페이스 안에 파드가 생성되는 것 방지
  • ResourceQuota: 특정 네임스페이스 안에 있는 파드가 해당 네임스페이스에서 할당된 CPU와 메모리만을 사용하도록 강제

API 서버가 리소스 변경을 클라이언트에 통보하는 방법

오브젝트과 갱신되면, API 서버는 오브젝트를 감시하는 모든 관찰자에게 갱신된 오브젝트를 전달한다.

kubectl 툴은 리소스 변경을 감시할 수 있는 API 서버의 클라이언트 중 하나. 아래의 --watch 옵션을 통해 파드의 생성, 수정, 삭제 통보를 받을 수 있다.

kubectl get pods --watch

가용성 높이기 - 여러 API 서버 인스턴스 실행

API 서버는 상태를 저장하지 않는다.(stateless, 모든 데이터는 etcd에 저장돼 있고, API 서버는 캐시 데이터만 있음). 그래서 필요한만큼 API 서버를 실행할 수 있고, 서로 인지할 필요도 없다.

일반적으로 모든 etcd 인스턴스에 API 서버를 함꼐 띄운다. 그리고 앞에 로드 밸런서를 두어서 각각의 api 서버로 트래픽이 나눠지도록 한다.



참고
쿠버네티스 인 액션(마르코 룩샤) 11장

복사했습니다!