🧠 Pod 안에서 kubectl 대신 API 호출하기

2026. 2. 22. 12:10k8s

📌 핵심 개념

kubectl get pods가 하는 일은 결국:

Kubernetes API Server에 HTTP 요청

을 보내는 것이다.

즉, Pod 안에서도:

  • API Server 주소
  • 인증 토큰
  • CA 인증서

이 3가지만 있으면 동일한 결과를 받을 수 있다.


📦 1️⃣ Pod 안에 이미 있는 것들

Pod 내부에는 자동으로 아래 파일들이 마운트된다.

/var/run/secrets/kubernetes.io/serviceaccount/token
/var/run/secrets/kubernetes.io/serviceaccount/ca.crt
/var/run/secrets/kubernetes.io/serviceaccount/namespace

이게 바로 ServiceAccount 인증 정보다.


🌐 2️⃣ API Server 주소

Pod 안에서 API Server는 다음 환경변수로 접근 가능하다.

echo $KUBERNETES_SERVICE_HOST
echo $KUBERNETES_SERVICE_PORT

보통 이렇게 호출한다:

https://kubernetes.default.svc

🚀 3️⃣ curl로 직접 API 호출하기

Pod 안에서:

TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)

curl -s \
  --cacert /var/run/secrets/kubernetes.io/serviceaccount/ca.crt \
  -H "Authorization: Bearer $TOKEN" \
  https://kubernetes.default.svc/api/v1/namespaces/test/pods

👉 이 결과는:

kubectl get pods -n test -o json

과 동일한 JSON 응답이다.


📌 네임스페이스 현재 값 가져오기

NAMESPACE=$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace)

🔐 4️⃣ 중요한 점: RBAC 권한 필요

기본 ServiceAccount는 대부분 권한이 없다.

그래서 아래 같은 에러가 날 수 있다:

Forbidden: User "system:serviceaccount:test:default" cannot list resource "pods"

이 경우:

  • Role 생성
  • RoleBinding으로 ServiceAccount에 연결

해야 한다.


📄 예시: Pod 조회 권한 부여

Role

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: pod-reader
  namespace: test
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "list"]

RoleBinding

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: pod-reader-binding
  namespace: test
subjects:
- kind: ServiceAccount
  name: default
  namespace: test
roleRef:
  kind: Role
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io

🏗️ 전체 구조 이해

Pod
  ↓
ServiceAccount 토큰
  ↓
API Server 호출
  ↓
RBAC 검사
  ↓
JSON 응답

🎯 kubectl과 API의 관계

kubectl 실제 동작
kubectl get pods GET /api/v1/pods
kubectl get ns GET /api/v1/namespaces
kubectl create POST 요청

즉 kubectl은 단순히 API 클라이언트일 뿐이다.


🔥 실제 운영에서 사용하는 경우

  • Operator 개발
  • Controller 개발
  • CI/CD Job
  • Custom Scheduler
  • 내부 자동화 Pod

📌 요약

Pod 안에서 kubectl 대신 API를 직접 호출하면 된다.
단, ServiceAccount + RBAC 권한이 필요하다.