파드에서 쿠버네티스 API에 접근하기

파드에서 쿠버네티스 API에 접근하기 (Accessing the Kubernetes API from a Pod)

이 가이드는 파드 내부에서 쿠버네티스 API에 접근하는 방법을 보여드려요.

출처: 문서

본문

시작하기 전에 (Before you begin)

쿠버네티스 클러스터가 필요하고, kubectl 명령줄 도구가 클러스터와 통신하도록 구성돼 있어야 해요. 이 튜토리얼은 컨트롤 플레인 호스트가 아닌 노드가 두 개 이상 있는 클러스터에서 실행하는 것을 권장해요. 아직 클러스터가 없다면 minikube로 만들거나 다음 쿠버네티스 플레이그라운드 중 하나를 사용할 수 있어요.

  • iximiuz Labs
  • Killercoda
  • KodeKloud

파드 내부에서 API에 접근하기 (Accessing the API from within a Pod)

파드 내부에서 API에 접근할 때, API 서버를 찾고 인증하는 방식은 외부 클라이언트의 경우와는 조금 달라요.

파드에서 쿠버네티스 API를 사용하는 가장 쉬운 방법은 공식 클라이언트 라이브러리 중 하나를 사용하는 것이에요. 이 라이브러리들은 API 서버를 자동으로 발견하고 인증할 수 있어요.

공식 클라이언트 라이브러리 사용하기 (Using Official Client Libraries)

파드 내부에서 쿠버네티스 API에 연결하는 권장 방법은 다음과 같아요.

  • Go 클라이언트의 경우 공식 Go 클라이언트 라이브러리를 사용하세요. rest.InClusterConfig() 함수가 API 호스트 발견과 인증을 자동으로 처리해요. 예시를 여기서 볼 수 있어요.
  • Python 클라이언트의 경우 공식 Python 클라이언트 라이브러리를 사용하세요. config.load_incluster_config() 함수가 API 호스트 발견과 인증을 자동으로 처리해요. 예시를 여기서 볼 수 있어요.

다른 라이브러리도 많이 사용할 수 있으니 Client Libraries 페이지를 참고하세요.

각 경우에 파드의 서비스어카운트 자격 증명이 API 서버와 안전하게 통신하는 데 사용돼요.

REST API에 직접 접근하기 (Directly accessing the REST API)

파드에서 실행되는 동안 여러분의 컨테이너는 KUBERNETES_SERVICE_HOSTKUBERNETES_SERVICE_PORT_HTTPS 환경 변수를 가져와 쿠버네티스 API 서버용 HTTPS URL을 만들 수 있어요. API 서버의 클러스터 내부 주소는 default 네임스페이스의 kubernetes라는 Service에도 게시되어, 파드가 로컬 API 서버의 DNS 이름으로 kubernetes.default.svc를 참조할 수 있어요.

참고: 쿠버네티스는 API 서버가 kubernetes.default.svc 호스트 이름에 대한 유효한 인증서를 가진다고 보장하지는 않아요. 다만 컨트롤 플레인은 $KUBERNETES_SERVICE_HOST가 나타내는 호스트 이름이나 IP 주소에 대한 유효한 인증서를 제시할 것으로 기대돼요.

API 서버에 인증하는 권장 방법은 서비스어카운트 자격 증명을 사용하는 것이에요. 기본적으로 Pod는 서비스어카운트와 연결되고, 그 서비스어카운트의 자격 증명(토큰)이 각 컨테이너의 파일시스템 트리의 /var/run/secrets/kubernetes.io/serviceaccount/token에 배치돼요.

사용 가능하다면 인증서 번들도 각 컨테이너의 파일시스템 트리의 /var/run/secrets/kubernetes.io/serviceaccount/ca.crt에 배치되며, API 서버의 서빙 인증서를 검증하는 데 사용해야 해요.

마지막으로 네임스페이스가 있는 API 작업에 사용할 기본 네임스페이스는 각 컨테이너의 /var/run/secrets/kubernetes.io/serviceaccount/namespace 파일에 배치돼요.

kubectl proxy 사용하기 (Using kubectl proxy)

공식 클라이언트 라이브러리 없이 API를 조회하고 싶다면, Pod의 새 사이드카 컨테이너 명령으로 kubectl proxy를 실행할 수 있어요. 이렇게 하면 kubectl proxy가 API에 인증하고 Pod의 localhost 인터페이스에 노출해서, Pod의 다른 컨테이너들이 직접 사용할 수 있게 돼요.

프록시 없이 사용하기 (Without using a proxy)

kubectl proxy를 사용하지 않는 것도 가능해요. 인증 토큰을 API 서버에 직접 전달하면 되죠. 내부 인증서가 연결을 보호해요.

# 내부 API 서버 호스트네임을 가리킴
APISERVER=https://kubernetes.default.svc

# ServiceAccount 토큰 경로
SERVICEACCOUNT=/var/run/secrets/kubernetes.io/serviceaccount

# 이 Pod의 네임스페이스 읽기
NAMESPACE=$(cat ${SERVICEACCOUNT}/namespace)

# ServiceAccount bearer 토큰 읽기
TOKEN=$(cat ${SERVICEACCOUNT}/token)

# 내부 인증 기관(CA) 참조
CACERT=${SERVICEACCOUNT}/ca.crt

# TOKEN으로 API 탐색
curl --cacert ${CACERT} --header "Authorization: Bearer ${TOKEN}" -X GET ${APISERVER}/api

출력은 다음과 비슷해요.

{
  "kind": "APIVersions",
  "versions": ["v1"],
  "serverAddressByClientCIDRs": [
    {
      "clientCIDR": "0.0.0.0/0",
      "serverAddress": "10.0.1.149:443"
    }
  ]
}

더 알아보기 (Learn more)