개요
- Pod 내부에서 Kubernetes API에 접근하여 Secret 자원 조회하기
- ServiceAccount를 사용하는 Pod에서 Kubernetes API 서버에 curl로 직접 요청
- Token 및 인증서를 통해 인증 처리
- 응답 JSON을 적절히 저장하여 결과 확인
- 문서 참고
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
Pod 내부에서 API 접근 테스트
- Pod에 접속하여 Kubernetes API 접속
# k -n app-space exec -it access-api -- sh
$ 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\" ..."
}
토큰을 이용한 인증
- Pod 내부에 자동 마운트된 ServiceAccount 토큰 경로 확인
$ cat /var/run/secrets/kubernetes.io/serviceaccount/token
eyJhbGciOiJSUzI1...
$ 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"
}
}
]
}
인증서 기반 접근
- 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}"
결과 파일 저장
- 결과를 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
관련 항목