Kubernetes 인 액션 8장 애플리케이션에서 파드 메타데이터와 그 외 리소스에 액세스하기
Devops/Kubernetes

Kubernetes 인 액션 8장 애플리케이션에서 파드 메타데이터와 그 외 리소스에 액세스하기

뉴비뉴 2023. 6. 20.

다루는 내용

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

특정 파드와 컨테이너 메타데이터를 컨테이너로 전달하는 방법과 컨테이너 내에서 실행 중인 애플리케이션이 쿠버네티스 API 서버와 통신해 클러스터에 배포된 리소스의 정보를 얻는 것이 얼마나 쉬운지를, 더 나아가 이런 리소스를 생성하거나 수정하는 방법을 다룰 것이다.

8.1 Downward API 로 메타데이터 전달

파드의 IP, 호스트 노드 이름 또는 파드 자체의 이름과 같이 실행 시점까지 알려지지 않은 데이터의 경우는 어떨까?

파드의 레이블이나 어노테이션과 같이 어딘가에 이미 설정된 데이터라면 어떨까?

아마도 동일한 정보를 여러 곳에 반복해서 설정하고 싶지는 않을 것이다.

이 문제는 Kubernetes의 Downward API 로 해결된다.

Kubernetes의 Downward API는 Pod 안의 컨테이너에서 Pod 또는 컨테이너와 관련된 정보를 ‘환경 변수 또는 볼륨’으로 노출하는 기능을 제공하는 API입니다. 이를 통해 컨테이너에서 Pod의 메타데이터, 레이블, 어노테이션 등의 정보를 쉽게 접근할 수 있습니다.

Downward API는 환경 변수와 볼륨 두 가지 형태로 정보를 제공합니다:

  1. 환경 변수: Pod의 메타데이터, 레이블, 어노테이션, 컨테이너의 이름, IP 주소 등을 환경 변수로 노출할 수 있습니다. 컨테이너 내에서 이러한 환경 변수를 사용하여 해당 정보에 접근할 수 있습니다.
  2. 볼륨: Downward API를 사용하여 Pod의 메타데이터, 레이블, 어노테이션 등을 파일로 생성하여 컨테이너 내에서 읽을 수 있는 볼륨으로 마운트할 수 있습니다. 이를 통해 컨테이너는 파일 시스템을 통해 해당 정보에 접근할 수 있습니다.

Downward API는 컨테이너가 Pod 또는 클러스터 환경에 대한 추가적인 정보를 알아야 할 때 유용합니다. 예를 들어, 컨테이너가 Pod의 이름이나 IP 주소, 레이블, 어노테이션 등을 알아야 하는 경우 Downward API를 사용하여 이러한 정보를 쉽게 얻을 수 있습니다.

주의할 점은 Downward API는 Pod가 생성될 때 정보를 가져오기 때문에 업데이트된 정보를 실시간으로 반영하지는 않는다는 점입니다.

LET ME) 한마디로 Pod 의 정보를 컨테이너 내부에서 확인 가능하다.

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

Downward API 를 사용하면 파드 자체의 메타데이터를 해당 파드 내에서 실행 중인 프로세스에 노출할 수 있다.

  • 파드의 이름
  • 파드의 IP 주소
  • 파드가 속한 네임스페이스
  • 파드가 실행 중인 노드의 이름
  • 파드가 실행 중인 서비스 어카운트 이름 (API 서버와 통신할 때 인증하는 계정)
  • 각 컨테이너의 CPU와 메모리 요청
  • 각 컨테이너의 CPU와 메모리 제한
  • 파드의 레이블
  • 파드의 어노테이션

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

환경변수

프로세스가 실행되면 파드 스펙에 정의한 모든 환경변수를 조회할 수 있다.

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

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

환경변수 그리고 볼륨으로 마운트 할 수 있다.

labels과 annotations 으로 지정한 값이 볼륨 마운트 된 파일 labels, annotations 를 확인하면 보인다.

볼륨 마운트를 /etc/downward 로 했기 때문에 파드의 정보를 확인할 수 있다.

각 파일은 볼륨 정의의 항목(item) 에 해당한다.

Downward API 사용 시기 이해

Kubernetes에 독립적으로 유지할수 있게 한다. 환경변수의 특정 데이터를 활용하는 기존 애플리케이션을 처리할 때 특히 유용하다. Downward API를 사용하면 애플리케이션을 다시 짜거나 데이터를 가져와서 환경변수에 노출하는 셸 스크립트를 사용하지 않고도 데이터를 애플리케이션에 노출할 수 있다. 그러나 Downward API 로 사용 가능한 메타데이터는 상당히 제한적이다.

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

서비스와 파드에 관한 정보는 서비스 관련 환경변수나 DNS 로 얻을 수 있다. 그러나 애플리케이션이 다른 리소스의 정보가 필요하거나 가능한 최신 정보에 접근해야 하는 경우 API 서버와 직접 통신해야 한다.

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

서버는 HTTPS를 사용하고 인증이 필요하기 때문에 직접 통신하는 것은 간단하지 않다.

다행히도 인증을 직접 처리하는 대신 kubectl proxy 명령을 실행해 프록시로 서버와 통신할 수 있다.

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

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

$ kubectl proxy
Starting to serve on 127.0.0.1:8001

8.2.2 파드 내에서 API 서버와 통신

kubectl이 없는 파드 내에서 통신하는 방법을 알아보겠다. 파드 내부에서 API 서버와 통신하려면 다음 세 가지를 처리해야 한다.

  • API 서버의 위치를 찾아야한다.
  • API 서버와 통신하고 있는지 확인해야 한다.
  • API 서버로 인증해야 한다. 그렇지 않으면 볼 수도 없고, 아무것도 할 수 없다.

API 서버와의 통신을 시도하기 위해 파드 실행

API 서버와 통신할 파드다. 아무것도 하지 않는 파드를 실행한 다음, 컨테이너의 셸에서 kubectl exec를 시행한다.

$ kubectl exec -it curl bash
root@curl:/#

tutum/curl 도커 이미지가 없어 armbuild/tutum-curl 로 대신했다.

이제 API 서버와 통신할 준비가 됐다.

API 서버 주소 찾기

쿠버네티스 API 서버의 IP와 포트를 찾아야 한다. Kubernetes 라는 서비스가 디폴트 네임스페이스에 자동으로 노출되고 API 서버를 가리키도록 구성되기 때문에 쉽다.

각 서비스마다 DNS 엔트리가 있다는 것을 기억할 것이므로 환경변수를 조회할 필요도 없이,

단순히 curl에서 https://kubernetes 를 가리키기만 하면 된다.

-k 옵션을 사용하는 것이다.

8.2.3 앰배서더 컨테이너를 이용한 API 서버 통신 간소화

HTTPS, 인증서, 인증 토큰을 다루는 일은 때때로 개발자에게 너무 복잡해 보일 때가 있다. 다행히 보안을 유지하면서 통신을 훨씬 간단하게 만들 수 있는 방법이 있다.

앰배서더 컨테이너 패턴 소개

API 서버와 직접 통신하는 대신 메인 컨테이너의 애플리케이션은 HTTPS 대신 HTTP 로 앰배서더에 연결하고 앰배서더 프록시가 API 서버에 대한 HTTPS 연결을 처리하도록 해 보안을 투명하게 관리할 수 있다.

추가적인 앰배서더 컨테이너를 사용한 curl 파드 실행

앰새서더 컨테이너 패턴을 실제로 보려면 앞에서 만든 curl 파드와 같은 파드를 새로 생성해야 하지만, 이번에는 파드에서 단일 컨테이너를 실행하는 대신 저자가 이미 만들어서 도커 허브에 푸시해놓은 다목적 kubectl-proxy 컨테이너 이미지를 기반으로 추가적인 앰배서더 컨테이너를 실행한다.

8.3 요약

  • 파드의 이름, 네임스페이스 및 기타 메타데이터가 환경변수 또는 downward API 볼륨의 파일로 컨테이너 내부의 프로세스에 노출되는 방법
  • CPU와 메모리의 요청 및 제한이 필요한 단위로 애플리케이션에 전달되는 방법
  • 파드에서 downward API 볼륨을 사용해 파드가 살아 있는 동안 변경될 수 있는 최신 메타데이터를 얻는 방법(레이블과 어노테이션 등)
  • kubectl proxy 로 쿠버네티스 REST API를 탐색하는 방법
    • apis/ …
  • 쿠버네티스에 정의된 다른 서비스와 같은 방식으로 파드가 환경변수 또는 DNS로 API 서버의 위치를 찾는 방법
  • 파드에서 실행되는 애플리케이션이 API 서버와 통신하는지 검증하고, 자신을 인증하는 방법
  • 앰배서더 컨테이너를 사용해 애플리케이션 내에서 API 서버와 훨씬 간단하게 통신 하는 방법
  • 클라이언트 라이브러리로 쉽게 쿠버네티스와 상호작용할 수 있는 방법
더보기

Kubernetes의 Downward API는 파드 내부에서 파드 자체의 정보를 쿠버네티스 환경변수 또는 볼륨 파일로 노출하는 기능을 제공합니다. 이를 통해 파드가 실행되는 호스트, 파드의 이름, 네임스페이스, 레이블, 어노테이션 등과 같은 메타데이터를 쉽게 액세스할 수 있습니다.

Downward API의 필요성은 다음과 같은 상황에서 발생할 수 있습니다:

파드 자체의 정보 활용: 파드 내부에서 실행 중인 애플리케이션이나 프로세스가 파드의 이름, 네임스페이스, 레이블 등과 같은 파드 메타데이터에 접근해야 할 경우가 있습니다. 이러한 정보를 활용하여 애플리케이션의 동작을 조정하거나 로깅, 모니터링 등의 용도로 활용할 수 있습니다.

환경변수로의 메타데이터 전달: 다른 컨테이너나 스크립트에서 파드의 메타데이터에 접근해야 할 경우, 환경 변수로 이를 전달하여 사용할 수 있습니다. 이는 컨테이너 간 통신이나 설정 파일 생성 등에 활용될 수 있습니다.

볼륨 파일로의 메타데이터 전달: 애플리케이션에서 메타데이터를 직접 활용하기보다는 파일로 저장하여 사용해야 할 경우, Downward API를 사용하여 메타데이터를 볼륨 파일에 작성할 수 있습니다. 이를 통해 파일을 읽어 사용할 수 있으며, 예를 들어 설정 파일에 동적으로 파드 정보를 반영하는 등의 용도로 활용할 수 있습니다.

Downward API는 파드의 메타데이터뿐만 아니라 리소스 사용량, 환경변수, 애플리케이션의 버전 정보 등 다양한 정보를 노출할 수 있어 유연하고 편리한 컨테이너 환경 구성을 가능하게 합니다.

댓글

💲 추천 글