[CKS] 1-11. API Groups

쿠버네티스 API는 기능별 그룹으로 구성되어 체계적인 리소스 관리와 확장을 지원합니다.

[CKS] 1-11. API Groups
Photo by Husna Miskandar / Unsplash

개요

권한 부여를 이해하기 위해선 k8s API Groups를 이해하는게 좋습니다.

k8s api란 api server와 상호작용하기 위한 방법으로 kubectl, REST API 등을 수행했습니다.

Kubernetes API

k8s api는 목적에 따라 여러 그룹으로 나뉩니다.

metrics, health, logs, api, apis 등이 존재하지만, 해당 문서에서는 클러스터 기능을 담당하는 api, apis를 중심으로 정리하였습니다.

  • core group
    • 핵심 리소스:
    • 쿠버네티스를 사용한다면 반드시 알아야 할 필수 리소스들이 모두 이 그룹에 포함되어 있습니다.
      • Pod: 컨테이너가 배포되는 가장 작은 단위
      • Service: Pod 집합에 대한 안정적인 네트워크 엔드포인트 제공
      • Namespace: 클러스터 내의 리소스를 논리적으로 격리
      • Node: 클러스터의 워커 머신
      • ConfigMap / Secret: 설정값 및 민감 정보를 관리
    • 쿠버네티스 시스템의 근간을 이루기 때문에 매우 안정적으로 유지되며, 새로운 기능이 이 그룹에 추가되는 경우는 거의 없습니다.
  • named group
    • 쿠버네티스의 확장성을 책임지는 그룹으로 기능이 필요할 때마다 기존 시스템에 영향을 주지 않고 새로운 그룹을 추가하여 기능을 확장할 수 있습니다.
    • 연관된 리소스들이 같은 그룹에 속해 있어 이해하고 관리하기 쉽습니다.
      • apps
        • 애플리케이션 배포와 관련된 리소스 (Deployment, StatefulSet, DaemonSet)
      • batch
        • 배치(batch) 작업이나 스케줄링된 작업 관련 리소스 (Job, CronJob)
      • networking.k8s.io
        • 클러스터 네트워크 정책 관련 리소스 (Ingress, NetworkPolicy)
      • rbac.authorization.k8s.io
        • 역할 기반 접근 제어(RBAC) 관련 리소스 (Role, RoleBinding)

자세한 내용은 k8s api 공식 문서에서 확인 가능합니다.


경로 없이 접근되면 사용 가능한 api 확인 가능하며 더 들어가 각 api로 접근하면 리소스 그룹 확인 가능

$ curl http://localhost:6443 -k
{
  "paths": [
    "/api",
    "/api/v1",
    "/apis",
    "/apis/",
    "/healthz",
    "/logs",
    "/metrics",
    "/openapi/v2",
    "/swagger-2.0.0.json"
  ]
}

$ kubectl api-versions

위에서 확인할 수 있듯 k8s api server로 접근하기 위해선 kubectl 혹은 REST API 형식의 호출이 필요합니다. kubectl의 경우 8001번에서 실행되는 프록시를 통해 접근하게 됩니다.

kubectl proxy는 개발자나 관리자의 로컬 머신에서 실행하는 HTTP 프록시 서버입니다.

  • 목적: Kubernetes API 서버에 대한 안전하고 간편한 접근을 제공합니다.
  • 작동 방식:
    1. 사용자가 kubectl proxy 명령을 실행하면 로컬 머신(기본값: localhost:8001)에 프록시 서버가 생성됩니다.
    2. 이 프록시는 사용자의 kubeconfig 파일을 참조하여 API 서버 인증을 자동으로 처리합니다.
    3. 사용자는 curl과 같은 일반 HTTP 클라이언트를 사용해 localhost:8001로 API 요청을 보내면, kubectl proxy가 이를 API 서버로 안전하게 전달하고 응답을 받아옵니다.
  • 주요 용도: 개발 및 디버깅 시 인증 과정을 신경 쓰지 않고 API 서버와 직접 통신할 때 유용합니다.

이것은 k8s 내부에서 실행되는 kube-proxy와는 다릅니다.

kube-proxy는 Kubernetes 클러스터의 모든 노드에서 실행되는 파드(Pod) 또는 데몬입니다.

  • 목적: 클러스터 내에서 파드와 서비스 간의 네트워크 연결을 관리합니다.
  • 작동 방식:
    1. kube-proxy는 API 서버를 감시하며 ServiceEndpoint 객체의 변경 사항을 추적합니다.
    2. 변경이 감지되면 각 노드의 네트워크 규칙(예: iptables, IPVS)을 업데이트하여 특정 서비스의 IP 주소(ClusterIP)로 들어온 트래픽을 실제 파드로 전달(로드 밸런싱)합니다.
  • 주요 용도: Service 리소스를 통해 파드 그룹에 안정적인 엔드포인트를 제공하고, 클러스터 내부의 서비스 디스커버리와 통신을 가능하게 하는 핵심적인 역할을 합니다.

정리하면 다음과 같습니다.

Kubernetes의 모든 리소스는 기능별 API 그룹으로 체계화되며, 각 그룹은 특정 리소스와 이를 제어하는 작업(verbs)의 집합을 정의합니다.

Hands-on

kubectl proxy --port=8090