[쿠버네티스 패턴] 14장.self-awareness

bocopile·2025년 11월 8일

쿠버네티스 패턴

목록 보기
12/28

1. 왜 ’Self Awareness’가 필요한가?

클라우드 네이티브 애플리케이션은 보통 무상태(stateless)로 설계되지만, 자신의 실행 맥락(Context)을 알아야 하는 경우가 있습니다.

예를 들어 다음과 같은 상황을 생각해볼 수 있습니다.

  • Pod 이름, 네임스페이스, 노드 이름, IP 주소 등 메타데이터를 로그나 메트릭에 기록해야 하는 경우
  • 특정 노드의 자원 상태나 지역(zone)에 따라 애플리케이션의 동작을 조정해야 하는 경우
  • Prometheus, OpenTelemetry Collector 등 외부 모니터링 시스템에 자신을 식별할 필요가 있는 경우

이때 사용하는 핵심 메커니즘이 Kubernetes의 Downward API입니다.

이는 Pod가 자신에 대한 정보를 환경 변수나 파일 형태로 주입받아 활용할 수 있게 합니다.

2. Self Awareness 패턴의 개요

문제 (Problem)

Pod 내의 애플리케이션은 기본적으로 자신이 실행 중인 클러스터의 메타데이터(예: Pod 이름, 네임스페이스, 노드 정보)에 접근할 수 없습니다.

이 정보가 없으면 다음과 같은 문제가 발생합니다.

  • 장애 발생 시 로그만으로 어느 Pod에서 발생했는지 식별이 어려움
  • 동적 설정 변경이나 스케일링 시, Pod 개별 인스턴스 구분이 불가능
  • Observability 스택(Grafana, Prometheus, Jaeger 등)에서 태깅이 일관되지 않음

해결 (Solution)

Kubernetes는 Pod 자신에 대한 정보를 Downward API 형태로 제공합니다.

이 API를 통해 Pod는 자신의 메타데이터를 두 가지 방식으로 접근할 수 있습니다.

(1) 환경 변수 방식

apiVersion: v1
kind: Pod
metadata:
  name: downward-env-demo
  labels:
    app: demo
spec:
  containers:
  - name: main
    image: busybox
    command: ["sh", "-c", "env | grep MY_"]
    env:
      - name: MY_POD_NAME
        valueFrom:
          fieldRef:
            fieldPath: metadata.name
      - name: MY_NODE_NAME
        valueFrom:
          fieldRef:
            fieldPath: spec.nodeName
      - name: MY_NAMESPACE
        valueFrom:
          fieldRef:
            fieldPath: metadata.namespace

이렇게 하면 Pod 내에서 다음과 같은 환경 변수를 조회할 수 있습니다:

$ echo $MY_POD_NAME
downward-env-demo
$ echo $MY_NAMESPACE
default

(2) 파일(Volume) 방식

apiVersion: v1
kind: Pod
metadata:
  name: downward-volume-demo
spec:
  containers:
  - name: main
    image: busybox
    command: ["sh", "-c", "cat /etc/podinfo/*"]
    volumeMounts:
    - name: podinfo
      mountPath: /etc/podinfo
  volumes:
  - name: podinfo
    downwardAPI:
      items:
        - path: "name"
          fieldRef:
            fieldPath: metadata.name
        - path: "namespace"
          fieldRef:
            fieldPath: metadata.namespace
        - path: "labels"
          fieldRef:
            fieldPath: metadata.labels

Pod 내부에서 /etc/podinfo/ 디렉터리를 통해 자신에 대한 정보를 파일로 확인할 수 있습니다.

주의: subPath 옵션을 사용하여 마운트한 경우 Downward API의 값은 자동 업데이트되지 않습니다.


3. Kubernetes 1.34의 확장 기능: EnvFiles(alpha)

Kubernetes 1.34에서는 Downward API 확장 기능으로 EnvFiles(alpha) 기능이 추가되었습니다.

이 기능은 환경 변수 세트를 파일 형태로 주입할 수 있도록 하며, 기존 env: 정의의 복잡성을 줄여줍니다.

예시:

envFrom:
  - envFileRef:
      name: app-meta

이를 통해 Pod가 실행 중인 환경 정보를 한 번에 로드할 수 있으며, Downward API의 관리성을 향상시킵니다.


4. 보안 고려사항 (API Server 접근 시)

Self Awareness를 구현하는 또 다른 방법은 Pod 내부에서 API Server에 직접 질의하여 자신의 정보를 가져오는 것입니다.

curl -sSk -H "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)"   https://kubernetes.default.svc/api/v1/namespaces/default/pods/$(hostname)

그러나 이 방법은 다음 보안상 주의가 필요합니다:

  • ServiceAccount에 필요 최소 권한(RBAC) 만 부여해야 합니다.
  • API Server 접근은 네트워크 부하를 증가시킬 수 있으며, Downward API를 대체할 수 있는 수준은 아닙니다.
  • 단, Pod가 스스로 상태를 API Server에 보고(report)해야 하는 경우에는 유용할 수 있습니다.

5. Observability 통합: OpenTelemetry 연계

Self Awareness 패턴은 단순한 “Pod 자기 인식”을 넘어 Observability의 기반으로 활용됩니다.

예를 들어 OpenTelemetry Agent가 Pod 메타데이터를 수집할 때 Downward API를 활용할 수 있습니다.

env:
  - name: OTEL_RESOURCE_ATTRIBUTES
    value: "service.name=$(POD_NAME),k8s.namespace=$(POD_NAMESPACE),k8s.node=$(NODE_NAME

이 값은 Grafana Tempo, Jaeger, Prometheus와 연동되어 각 Pod 단위의 트레이스 식별에 사용됩니다.

6. 트러블슈팅

문제원인해결
Downward API 값이 갱신되지 않음subPath 사용 시 값이 고정됨subPath 제거 후 직접 마운트
환경 변수 값이 비어 있음Pod 생성 시점에 필드 정보가 없었음재시작 또는 spec.restartPolicy: Always 설정
API Server 접근 시 403 오류ServiceAccount 권한 부족Role/RoleBinding으로 최소 권한 추가

7. 마무리

Self Awareness 패턴은 애플리케이션이 자신이 “어디서 실행되고 있는지”를 알 수 있도록 하는 핵심 설계입니다.

이 패턴은 로그와 메트릭 태깅, 장애 추적, 자동화된 모니터링 구성의 기반이 되며,

Pod → Cluster → Observability 로 이어지는 클라우드 네이티브 아키텍처의 출발점이 됩니다.


출처

profile
DevOps Engineer

0개의 댓글