쿠버네티스 API 서버에 접근하는 세 가지 방법.
쿠버네티스 클러스터에 6443 포트 API 서버가 열려있다. 사용자가 이 곳으로 https 접근을 하려면 쿠버네티스 설치 시 kubeconfig 파일 안에 있는 인증서 내용을 가지고 접근할 수 있다.
kubeconfig 안에는 CA crt, Client crt, Client key가 있다.
CA crt
CA key (발급기관 개인키) -> CA csr (인증 요청서) -> CA crt (인증서)
Client crt
CA key + CA crt + (Client key (클라이언트 개인키) - > Client csr (인증요청서)) -> Client crt (인증서)
또 쿠버네티스를 설치할 때 kubectl도 같이 설치가 된다. 이 kubectl에는 kubeconfig가 들어있기 때문에 API 서버에 접근할 때 kubectl 로 접근이 가능하다.
kubectl에서 accept-hosts 옵션을 통해 8001 포트를 Proxy로 열었다고 가정하면, 사용자는 https가 아니라 http로 8001 포트로 요청을 보내 6443 포트의 API 서버로 접근할 수 있으며, kubectl에 인증서가 이미 있기 때문에 사용자가 인증서를 가지고 있지 않아도 접근할 수 있다.
kubectl Proxy 띄우기
$ nohup kubectl proxy --port=8001 --address=사용자 ip --accept-hosts='^*$' >/dev/null 2>&1 &
kubectl 설치 : https://kubernetes.io/docs/tasks/tools/install-kubectl/
외부 서버에 kubectl 설치해서 멀티 클러스터에 접근할 수도 있다. 이렇게 하기 위해서는 먼저 각 클러스터에 있는 kubeconfig 파일이 내 kubectl에도 있어야 하고, 사용자는 kubectl을 통해서 각 클러스터에 접근해 자원을 조회하고 생성할 수 있다.
kubeconfig
clusters
클러스터를 등록할 수 있다. name(이름), url(연결 정보), CA(인증서) 속성을 가진다.
users
사용자를 등록할 수 있다. name(이름), crt(인증서), key(개인키) 속성을 가진다.
contexts
contextx를 통해서 클러스터와 사용자를 연결할 수 있다. name(이름), cluster(클러스터 이름), user(사용자 이름) 속성을 가진다.
이렇게 kubeconfig가 잘 만들어져 있다면, 외부의 사용자는 다음과 같은 명령어로 context-A에 접근할 수 있다.
$ kubectl config user-context context-A
쿠버네티스 클러스터에 API 서버가 있고, 클러스터 안에 Namespace를 만들게 되면 Namespace 안에 디폴트 ServiceAccount가 자동으로 생성된다.
이 ServiceAccount에는 Secret이 달려 있는데, Secret에는 CA crt와 token값이 들어있다.
Namespace 안에 있는 ServiceAccount, Secret 조회하기
$ kubectl describe -n 네임스페이스이름 serviceaccounts
$ kubectl describe -n 네임스페이스이름 secrets
그 후 Pod를 생성하면 이 Pod는 ServiceAccount와 연결이 되고, Pod는 API 서버에 토큰 값을 통해 연결할 수 있게 된다. 결국 외부의 사용자도 이 토큰 값만 알면 API 서버에 접근할 수 있다.
토큰 값으로 접근하기 위해서는 Headers에 Authorization: Bearer 토큰값 을 추가해 요청을 보내면 된다.