[Kubernetes] Kubeconfig 파일
🚀 Kubeconfig
~/.kube/config
: 쿠버네티스 설정 파일
apiVersion: v1
kind: Config
preferences: {}
clusters:
- name: cluster.local
cluster:
certificate-authority-data: LS0tLS1...
server: https://127.0.0.1:6443
- name: mycluster
cluster:
server: https://1.2.3.4:6443
users:
- name: myadmin
- name: kubernetes-admin
user:
client-certificate-data: LS0tLS1...
client-key-data: LS0tLS1...
contexts:
- context:
cluster: mycluster
user: myadmin
name: myadmin@mycluster
- context:
cluster: cluster.local
user: kubernetes-admin
name: kubernetes-admin@cluster.local
current-context: kubernetes-admin@cluster.local
해당 파일은 kubectl
명령어가 api-server에 접근할 때 사용할 인증 정보를 가지고 있다.
📌 clusters:
- 우리가 접속할 서버 정보와 관련된 것이며 서버는 여러개 있을 수 있다. 원한다면 쿠버네티스 클러스터를 여러개 설정할 수 있다.
- cluster.local : 설정하지 않아도 기본적으로 구성되는 클러스터 이름
- client-authority-data : kubectl이 어떤 서버에 요청할 것인지에 대한 정보와 CA 인증서를 base64로 인코딩한 것이다.
- server : 실제 api-server의 주소
📌 users:
- 인증받을 사용자
- name : 사용자의 계정명
- client-certificate-data, client-key-data : 사용자가 사용할 클라이언트의 인증서(공개키)와 개인키
쿠버네티스의 모든 구성요소들은 CA가 발급해준 인증서를 가지고 있다.
클라이언트의 인증서와 개인키는 CA가 발급해준 것이다. 내부적으로 PKI 구조로 되어있다.
vagrant@k8s-node1 ~ cd /etc/kubernetes/pki
vagrant@k8s-node1 /etc/kubernetes/pki ls
apiserver-kubelet-client.crt apiserver-kubelet-client.key.old apiserver.key ca.key front-proxy-client.crt front-proxy-client.key.old
apiserver-kubelet-client.crt.old apiserver.crt apiserver.key.old front-proxy-ca.crt front-proxy-client.crt.old sa.key
apiserver-kubelet-client.key apiserver.crt.old ca.crt front-proxy-ca.key front-proxy-client.key sa.pub
해당 디렉토리에 CA의 인증서와 키(ca.crt, ca.key)가 있다. 나머지 모든 키는 CA가 발급해준 것이다.
그래서 CA가 발급해준 키를 가지고 서버에 인증을 시도하고 서버가 발급해준 인증서가 맞다면 쿠버네티스 클러스터를 사용할 수 있게된다.
📌 context:
- 사용자와 클러스터를 연결시킨 것을 말한다.
여러 사용자와 여러 클러스터가 있으면 여러개의 컨텍스트가 생성된다.
어떤 컨텍스트를 선택하느냐에 따라 클러스터와 사용자가 결정된다.
📌 current-context:
- 현재 인증에 사용하기 위한 현재 컨텍스트를 의미한다. 해당 파일은 직접 작성할 수도 있고 명령형 커맨드로 작성할 수도 있다.
🚀 Windows PowerShell에서 쿠버네티스 사용하기
~/.kube/config 파일만 있다면 Windows 환경에서도 쿠버네티스 클러스터를 제어할 수 있다.
choco install kubernetes-cli --version=1.22.4
윈도우 PowerShell에서 쿠버네티스를 사용하기 위해 해당 명령을 실행한다.
mkdir .kube
code .kube/config
홈 디렉토리에서 .kube
디렉토리 생성 후 config
파일을 생성하고 ~/.kube/config
파일 내용을 붙여넣는다.
PS C:\Users\Shinsohui> kubectl get nodes
NAME STATUS ROLES AGE VERSION
node1 Ready control-plane,master 10d v1.22.8
node2 Ready <none> 10d v1.22.8
node3 Ready <none> 8d v1.22.8
다음과 같이 출력되면 성공이다.
인증을 위한 config
파일만 있다면 쿠버네티스 클러스터에 접속할 수 있다.
🚀 클러스터 접근 구성하기
Organizing Cluster Access Using kubeconfig Files | Kubernetes
기본적으로 kubectl
은 $HOME/.kube
디렉토리에서 config
라는 이름의 파일을 찾는다.
다른 방법은 KUBECONFIG라는 환경 변수 뒤에 파일의 경로를 써주면 된다.
또 다른 방법으로는 kubectl
명령어 뒤에 --kubeconfig
옵션으로 파일을 지정해주면 된다.
vagrant@k8s-node1 ~ kubectl config view
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: DATA+OMITTED # 인증서 관련 데이터
server: https://127.0.0.1:6443
name: cluster.local
contexts:
- context:
cluster: cluster.local
user: kubernetes-admin
name: kubernetes-admin@cluster.local
current-context: kubernetes-admin@cluster.local
kind: Config
preferences: {}
users:
- name: kubernetes-admin
user:
client-certificate-data: REDACTED
client-key-data: REDACTED
config 파일을 열어보면 인증서 관련 데이터는 생략된다.
vagrant@k8s-node1 ~ kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
* kubernetes-admin@cluster.local cluster.local kubernetes-admin
컨텍스트의 이름은 보통 사용자명@클러스터이름 으로 구성된다.
사용할 NAMESPACE가 공백이면 default NS를 사용한다.
CURRENT에 *
는 현재 사용하고 있는 컨텍스트라는 것이다.
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: ==
server: https://127.0.0.1:6443
name: cluster.local
- clusters:
server: https://1.1.1.1
name: mycluster
contexts:
- context:
cluster: cluster.local
user: kubernetes-admin
name: kubernetes-admin@cluster.local
- context:
cluster: mycluster
user: myadmin
name: myadmin@mycluster
current-context: kubernetes-admin@cluster.local
kind: Config
preferences: {}
users:
- name: myadmin
- name: kubernetes-admin
user:
client-certificate-data: ==
client-key-data: =
kubeconfig 파일을 수정해서 새로운 cluster와 context를 추가했다.
📌 클러스터를 전환하는 방법
vagrant@k8s-node1 ~ kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
* kubernetes-admin@cluster.local cluster.local kubernetes-admin
*
vagrant@k8s-node1 ~ code ~/.kube/config
vagrant@k8s-node1 ~ kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
* kubernetes-admin@cluster.local cluster.local kubernetes-admin
myadmin@mycluster mycluster myadmin
vagrant@k8s-node1 ~ kubectl config get-clusters
NAME
cluster.local
mycluster
vagrant@k8s-node1 ~ kubectl config use-context myadmin@mycluster
Switched to context "myadmin@mycluster".
vagrant@k8s-node1 ~ kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
kubernetes-admin@cluster.local cluster.local kubernetes-admin
* myadmin@mycluster mycluster myadmin
vagrant@k8s-node1 ~ kubectl get nodes
Please enter Username:
vagrant@k8s-node1 ~ kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
* kubernetes-admin@cluster.local cluster.local kubernetes-admin
myadmin@mycluster mycluster myadmin
📌 kubectl config 서브 커맨드
vagrant@k8s-node1 ~ kubectl config current-context
current-context -- Display the current-context
delete-cluster -- Delete the specified cluster from the kubeconfig
delete-context -- Delete the specified context from the kubeconfig
delete-user -- Delete the specified user from the kubeconfig
get-clusters -- Display clusters defined in the kubeconfig
get-contexts -- Describe one or many contexts
get-users -- Display users defined in the kubeconfig
rename-context -- Rename a context from the kubeconfig file
set -- Set an individual value in a kubeconfig file
set-cluster -- Set a cluster entry in kubeconfig
set-context -- Set a context entry in kubeconfig
set-credentials -- Set a user entry in kubeconfig
unset -- Unset an individual value in a kubeconfig file
use-context -- Set the current-context in a kubeconfig file
view -- Display merged kubeconfig settings or a specified kubeconfig file
vagrant@k8s-node1 ~ kubectl config set-cluster mykube --server=https://5.6.7.8
Cluster "mykube" set.
vagrant@k8s-node1 ~ kubectl config get-clusters
NAME
cluster.local
mykube