[Kubernetes] Security - Context, KubeConfig
kube 커맨드를 실행하기 위해 Kube API Server에 명령어를 Query해주어야한다.
API Server에 Query하기 위해서는 User 인증을 위해 매번 User Certificate를 함께 보내주어야한다.
kubectl get pods --server kubernetes.docker.internal:6443 \
--client-key admin.key \
--client-certificate admin.crt \
--certificate-authority ca.crt
매번 이렇게 커맨드를 실행할 수는 없지 않은가? 이 과정을 간소화시키기 위해 Context와 KubeConfig 파일이 존재한다.
KubeConfig
클러스터에 접근하고 상호작용하기 위해 필요한 설정을 포함하는 파일
kubectl을 사용해 Kube API Server에 명령을 내리기 위해 필요한 인증정보를 담고있다.
User 인증을 위해 필요한 값 등을 KubeConfig에 담고 API를 호출할 때마다 kubeconfig파일만 같이 호출해주는 방식이다. 이를 통해 비로소 간단하게 API Server에 커맨드를 실행할 수 있게 된다.
기본적으로 `$HOME/.kube` 경로에 config라는 이름의 KubeConfig 파일이 위치한다.
(kubectl은 기본적으로 이 경로의 config파일을 탐색한다.)
다른 KubeConfig 파일을 사용하고자하면, 환경변수 KUBECONFIG를 KubeConfig 파일 경로로 지정하거나, 명령실행 시 `--kubeconfig` 플래그를 지정해 해당 config파일을 사용할 수 있다.
config view 커맨드로 KubeConfig 파일 내용을 확인할 수 있다.
kubectl config view
KubeConfig 파일 구조
KubeConfig 파일은 크게 `clusters, users, contexts, current-context`의 4가지 요소로 구성되어있다.
apiVersion: v1
kind: Config
current-context: [현재 설정된 context 정보]
clusters:
- name: [cluster명]
cluster:
certificate-authority: [CA 파일]
server: [kube-api server 주소]
users:
- name: developer
user:
client-certificate: [client 인증서 crt파일]
client-key: [client 키 파일]
contexts:
- name: development
context:
cluster: [cluster명]
user: [user명]
namespace: [namespace명]
- clusters : 생성된 클러스터 목록, 각 클러스터의 이름과 함께 API 서버의 URL도 포함
- users : 클러스터에 접근하는 사용자 목록, user client의 키파일과 인증서를 포함
- contexts : 작업환경 설정 목록, 클러스터와 user, namespace를 포함
- current-context : 현재 설정된 Context 정보 (username@clustername 구조)
Context
Context는 cluster와 user를 묶어서 정의한 것으로, 작업환경에 대한 내용이다. 즉, 어떤 user가 어떤 cluster의 어떤 namespace에서 작업할 것인지를 설정해둔 것이다.
이 context를 변경해 여러 클러스터에 대해 왔다갔다 전환하면서 작업할 수 있는 것이다.
Context 추가는 kubeconfig 파일에 직접 해주거나 kubectl 커맨드를 이용할 수 있다.
kubectl config set-context [context명] --user [user명] --cluster [cluster명] --namespace [namespace명]
아래 커맨드로 current-context의 변경이 가능하다. 변경된 current-context 내용은 KubeConfig파일에도 반영이 된다.
kubectl config use-context user1@prod
kubectl이 아닌 kubectx를 이용해 context를 변경하는 방법도 존재한다.
# dev1 context로 변경
kubectx dev1
# 이전 context로 돌아오기
kubectx -