Today I Learned

[쿠버네티스 인 액션] 8. 애플리케이션에서 파드 메타데이터와 그 외의 리소스에 액세스하기 (1) 본문

쿠버네티스

[쿠버네티스 인 액션] 8. 애플리케이션에서 파드 메타데이터와 그 외의 리소스에 액세스하기 (1)

하이라이터 2022. 11. 17. 20:56
728x90

8장에서 다루는 내용

  • 컨테이너에 정보를 전달하기 위해 Downward API 사용
  • 쿠버네티스 REST API 살펴보기
  • 인증과 서버 검증을 kubectl proxy에 맡기기
  • 컨테이너 내에서 API 서버에 접근하기
  • 앰배서터 컨테이너 패턴의 이해
  • 쿠버네티스 클라이언트 라이브러리 사용

8.1 Downward API로 메타데이터 전달

  • 파드의 IP, 호스트 노드 이름 또는 파드의 자체 이름과 같이 실행시점까지 알수 없는 데이터 혹은 파드의 레이블이나 어노테이션과 같이 어디간에 이미 설정되어있는 데이터라면 Downward API를 통해 환경변수 또는 (downwardAPI 볼륨 내에 있는)파일로 파드와 해당 환경의 메타데이터를 전달할 수 있다.
  • Downward API는 애플리케이션이 호출해서 데이터를 가져오는 REST 앤드포인트와 다르며, 환경변수 또는 파일에 파드의 스팩 또는 상태값이 채워지도록 하는 방식이다.


8.1.1 사용 가능한 메타데이터 이해

  • Downward API를 사용하면 다음과 같은 파드 자체의 메타데이터를 해당 파드 내에서 실행 중인 프로세스에 노출할 수 있다.
    • 파드의 이름
    • 파드의 IP 주소
    • 파드가 속한 네임스페이스
    • 파드가 실행 중인 노드의 이름
    • 파드가 실행 중인 서비스 어카운트 이름
    • 각 컨테이너의 CPU와 메모리 요청
    • 각 컨테이너의 CPU와 메모리 제한
    • 파드의 레이블
    • 파드의 어노테이션

8.1.2 환경변수로 메타데이터 노출하기

  • 환경 변수로 파드와 컨테이너의 메타데이터를 전달하는 방법을 살펴보기 위해 매니페스를 이용해 컨테이너가 하나인 간단한 파드를 만들자.

  • 프로세스가 실행되면 파드 스펙에 정의한 모든 환경변수를 조회할 수 있다.
  • 파드의 이름(POD_NAME), IP(POD_IP), 네임스페이스(POD_NAMESPACE), 컨테이너가 실행 중인 노드(NODE_NAME), 서비스 어카운트 이름(SERVICE_ACCOUNT) 환경변수를 확인할 수 있다.
  • 자원 제한 또는 요청을 노출시키는 환경변수의 경우 제수(divisor)를 지정하며, 제한 또는 요청에 설정한 값을 제수로 나눈 결과값이 환경변수로 노출된다.
  • 이 예제에서는 CPU 요청을 15m, 제수를 1m으로 설정했기 때문에 환경변수 CONTAINER_CPU_REQUEST_MILLICORES는 15로 설정된다.
  • CPU 제한/요청의 제수는 1(전체 코어 또는 하나) 또는 1m(1밀리코어)로 설정한다.
  • 메모리 제한/요청의 제수는 1(바이트), 1k(킬로바이트), 1Ki(키비바이트), 1M(메가바이트), 1Mi(메비바이트)등이 될 수 있다.

  • 파드를 만든 후에는 kubectl exec를 사용해 다음 예제와 같이 컨테이너에 있는 모든 환경변수를 볼 수 있다.

  • 컨테이너 내부에서 실행되는 모든 프로세스는 해당 변수를 읽고 사용할 수 있다.

8.1.3 downwardAPI 볼륨에 파일로 메타데이터 전달

  • 환경변수 대신 파일로 메타데이터를 노출하려는 경우 downwardAPI 볼륨을 정의해 컨테이너에 마운트할 수 있다.
  • 파드의 레이블이나 어노테이션은 환경변수로 노출할 수 없기 때문에 downwardAPI 볼륨을 사용해야 한다.
  • 환경변수와 마찬가지로 메타데이터를 프로세스에 노출시키려면 각 메타데이터 필드를 명시적으로 지정해야 한다.

  • 환경변수로 메타데이터를 전달하는 대신 downward라는 볼륨을 정의하고 컨테이너의 /etc/downward 아래에 마운트한다.
  • 이 볼륨에 포함된 파일은 볼륨 스펙의 downwardAPI.items 속성 아래에 설정된다.
  • 각 항목은 메타데이터를 기록할 경로와 파일에 저장할 값의 파드 수준의 필드나 컨테이너 리소스 필드에 대한 참조를 지정한다.

  • 이전에 만든 파르를 삭제하고 이전 예제의 매니페스를 사용해 새로운 파드를 만들어서 마운트된 downwardAPI 볼륨 디렉터리의 내용을 살펴보자.

  • 각 파일은 볼륨 정의의 항목에 해당한다.
  • 환경변수로는 노출할 수 없었던 레이블과 어노테이션이 저장돼있는지 확인해보자.

  • 각 레이블/어노테이션은 별도의 줄에 키=값 형식으로 저장되며, 값이 여러 줄인 경우 바꾸기 문자가 \n으로 표시돼 한 줄로 기록된다.

레이블과 어노테이션 업데이트

  • 파드가 실행되는 동안 레이블이나 어노테이션이 변경되면 쿠버네티스가 이 값을 가지고 있는 파일을 업데이트해서 파드가 항상 최신 데이터를 볼 수 있도록 한다.
  • 레이블과 어노테이션이 환경변수로 노출될 수 없는 이유는 환경변수 값은 나중에 업데이트 할 수 없기 때문이다.

볼륨 스펙에서 컨테이너 수준의 메타데이터 참조

  • 리소스 제한 또는 요청과 같은 컨테이너 수준의 메타데이터를 노출하는 경우 다음 예제와 같이 리소스 필드를 참조하는 컨테이너의 이름을 지정해야 한다.

  • 볼륨이 컨테이너가 아닌 파드 수준에서 정의됐다고 생각하면 그 이유가 분명해지는데, 볼륨 스펙 내에서 컨테이너의 리소스 필드를 참조할 때는 참조하는 컨테이너의 이름을 명시적으로 지정해야 한다.
  • 볼륨을 사용해 컨테너의 리소스 요청/제한을 노출하는 것은 환경변수보다 복잡하지만 컨테이너의 리소스 필드를 다른 컨테이너에 전달할 수 있다는 장점이 있다.

DownwardAPI 사용 시기 이해

  • DownwardAPI는 애플리케이션을 쿠버네티스에 독립적으로 유지할 수 있게 하며, 환경 변수의 특정 데이터를 활용하는 기존 애플리케이션을 처리할 때 유용하다.
  • 하지만 DownwardAPI로 사용 가능한 메타데이터는 제한적이며, 더 많은 정보가 필요할 경우 쿠버네티스 API에서 직접 가져와야 한다.

8.2 쿠버네티스 API 서버와 통신하기

  • 서비스와 파드에 관한 정보 외의 다른 정보가 필요하거나 최신 정보에 접근해야하는 경우 API 서버와 직접 통신해야 한다.


8.2.1 쿠버네티스 REST API 살펴보기

  • 쿠버네티스 API 서버에 직접 접속해서 API에 관해 알아볼 수 있다.
$kubectl cluster-info

  • 서버는 HTTPS를 사용하고 인증이 필요하기 때문에 직접 통신하는 것은 어렵고 kubectl proxy 명령을 실행해 프록시로 서버와 통신할 수 있다.

kubectl 프록시로 API 서버 액세스하기

  • kubectl proxy 명령은 프록시 서버를 실행해 로컬 컴퓨터에서 HTTP 연결을 수신하고, 인증을 관리하면서 API 서버로 전달하기 때문에 요청할 때마다 인증 토큰을 전달할 필요가 없다.

  • 연결을 위한 다른 인자는 없으며, 시작하자마자 프록시는 로컬 포트 8001에서 연결을 수신하기 시작한다.

 

kubectl proxy로 쿠버네티스 API 살펴보기

  • http://localhost:8001로 접속하면 서버는 다음과 같이 경로 목록을 반환한다.

  • 이러한 경로는 파드, 서비스 등과 같은 리소스를 생성할 때 리소스 정의에 지정한 API 그룹과 버전에 해당한다.
  • 초기의 쿠버네티스는 API 그룹 개념을 사용하지 않았기 때문에 초기 버전의 쿠버네티스에 도입된 가장 일반적인 리소스 유형들은 특정 그룹에 속하지 않는다.

 

배치 API 그룹의 REST 엔드포인트 살펴보기

  • 잡 리소스 API를 살펴보기 위해 /apis/batch 경로 뒤에 무엇이 있는지 확인해보자.

  • 응답에는 사용 가능한 버전과 클라이언트가 사용해야하는 선호 버전에 관한 정보와 batch API 그룹에 관한 설명이 표시된다.
  • 다음으로 /apis/batch/v1 경로 뒤에 무멋이 있는지 살펴보자.

  • API 서버는 batch/v1 API 그룹에서 리소스 유형 및 REST 엔드포인트 목록을 반환한다.
  • 그 중 하나가 잡 리소스이며, 리소스 이름과 관련 kind 외에도 리소스에 네임스페이스가 지정됐는지 여부, 짧은 이름과 해당 리소스에 사용할 수 있는 동사 목록도 갖고 있다.

클러스터에 있는 모든 잡 인스턴스 나열하기

  • /api/batch/v1/jobs 경로에서 GET 요청을 수행하면 잡 목록을 얻을 수 있다.

 

이름 별로 특정 잡 인스턴스 검색

  • 하나의 특정 잡을 반환하려면 URL에 이름과 네임스페이스를 지정해야 한다. (name : my-job; namespace: default)를 검색하려면 다음과 같이 요청하면 된다.

  • 다음 명령을 실행한 것과 정확히 동일하게 my-job 잡 리소스에 관한 전체 JSON 정보를 얻을 수 있다.

 

728x90
Comments