CKA SimA 09 Pod 내부에서 Kubernetes API 접속

(CKA SimA - Q9 Pod 내부에서 Kubernetes API 접속에서 넘어옴)

1 개요[ | ]

Pod 내부에서 Kubernetes API에 접근하여 Secret 자원 조회하기

2 Pod 생성 및 ServiceAccount 설정[ | ]

  • 특정 네임스페이스에서 ServiceAccount를 사용하는 Pod을 생성
  • --serviceaccount 플래그 또는 매니페스트의 serviceAccountName 필드 지정
# k run access-api --image=nginx:1-alpine \
  --restart=Never --namespace=app-space \
  --serviceaccount=reader --dry-run=client -o yaml > /tmp/access-api.yaml
  • 매니페스트 확인 및 적용
# k apply -f /tmp/access-api.yaml
pod/access-api created

3 Pod 내부에서 API 접근 테스트[ | ]

  • Pod에 접속하여 Kubernetes API 접속
# k -n app-space exec -it access-api -- sh
  • API 서버 기본 주소로 curl 요청
$ curl https://kubernetes.default
curl: (60) SSL peer certificate or SSH remote key was not OK
$ curl -k https://kubernetes.default
{
  "kind": "Status",
  "message": "forbidden: User \"system:anonymous\" cannot get path \"/\"",
  ...
}
  • 인증 없이 Secret 조회 시도 → 403 Forbidden
$ curl -k https://kubernetes.default/api/v1/secrets
{
  "message": "secrets is forbidden: User \"system:anonymous\" cannot list resource \"secrets\" ..."
}

4 토큰을 이용한 인증[ | ]

  • Pod 내부에 자동 마운트된 ServiceAccount 토큰 경로 확인
$ cat /var/run/secrets/kubernetes.io/serviceaccount/token
eyJhbGciOiJSUzI1...
  • curl 명령에 인증 헤더 추가하여 재요청
$ TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
$ curl -k https://kubernetes.default/api/v1/secrets -H "Authorization: Bearer ${TOKEN}"
{
  "kind": "SecretList",
  "items": [
    {
      "metadata": {
        "name": "example-token-abcde",
        "namespace": "app-space"
      },
      "data": {
        "token": "ZGVtb3Rva2Vu"
      }
    }
  ]
}

5 인증서 기반 접근[ | ]

  • insecure 옵션 -k 대신 CA 인증서 명시
$ CACERT=/var/run/secrets/kubernetes.io/serviceaccount/ca.crt
$ curl --cacert ${CACERT} https://kubernetes.default/api/v1/secrets \
    -H "Authorization: Bearer ${TOKEN}"

6 결과 파일 저장[ | ]

  • 결과를 JSON 파일로 저장한 후 호스트로 복사
$ curl -k https://kubernetes.default/api/v1/secrets \
    -H "Authorization: Bearer ${TOKEN}" > result.json
  • 호스트로 복사
$ exit
# k -n app-space exec access-api -- cat result.json > /opt/course/9/result.json

7 관련 항목[ | ]

문서 댓글 ({{ doc_comments.length }})
{{ comment.name }} {{ comment.created | snstime }}