본문 바로가기
  • 오늘처럼
소프트웨어 아키텍처/Kubernetes

KubeConfig 파일 확인하기

by bluefriday 2022. 7. 11.
반응형

KubeConfig 파일

Kubernetes 클러스터는 Scheduler, Controller 등 여러 모듈로 구성되어 있으며, 사용자는 kube-apiserver 와 통신하여 클러스터의 정보를 조회하거나 파드 등의 자원을 관리한다. 이번에는 이렇게 kube-apiserver 와의 통신을 위해 필요한 KubeConfig 파일에 대해 확인해본다.

사용자는 Kube API Server 와의 안전한 통신을 위하여 TLS 인증을 사용하는 통신을 수행하게 되는데, 다음과 같은 방법을 사용한다.

# curl 명령을 통한 클러스터 내 파드 리스트 조회
curl https://my-kubeapi-server:6443/api/v1/pods \
 --key admin.key \
 --cert admin.crt \
 --cacert ca.crt

[출력]
{
	"apiVersion": "v1",
	"kind": "PodList",
    "metadata": {
    	"selfLink": "/api/v1/pods",
 	},
    "items": []
}

위와 같이 TLS 인증과 관련된 crt,key 파일 등을 파라미터로 추가한 curl 명령어를 사용하는데,실제로는 kubernetes 에서 제공하고 있는 binary 파일인 kubectl 명령어를 사용하여 아래와 같이 수행하게 된다.

# kubectl 명령어를 사용한 클러스터 내 파드 조회
kubectl get pod \
 --server my-kubeapi-server:6443 \
 --client-key admin.key \
 --client-certificate admin.crt \
 --certificate-authority ca.crt
 
 [출력]
 No resources found

curl을 사용한 방식에 비해 깔끔하지만 매번 kubectl 명령어를 입력할 때마다 server 의 주소를 지정하고, TLS 인증과 관련된 파일을 파라미터로 지정하기에는 불편하므로, 이러한 파라미터들을 파일에 저장하고 해당 파일을 파라미터로 지정해주는 방식을 사용한다. 

kubectl get po --kubeconfig config

여기서 사용된 config 파일이 'KubeConfig' 파일이다. 이 파일은 사용자가 kube apiserver 와 통신할 때 필요로 하는 정보를 담고 있으며, kubectl 명령어를 사용할 때 기본적으로 사용자의 홈디렉토리 하위의 .kube 디렉토리를 참조한다.

만약 root 유저일 경우 하단과 같이 /root/.kube/config 파일을 자동으로 참조하게 된다.

# kubectl 명령어가 기본적으로 참조하는 kubeconfig 파일의 위치
$HOME/.kube/config

# root 유저일 경우의 kubeconfig 파일의 위치
root/.kube/config

kubeadm 등을 통하여 클러스터를 구축할 경우 기본적으로 이와 같이 설정 파일이 구성되므로, 사용자는 '--kubeconfig' 파라미터를 추가하지 않고, kubectl 명령어를 사용할 수 있다.


KubeConfig 파일의 내용 확인하기

이제 kubeconfig 파일의 내용을 확인해보자. kubeconfig 파일은 yaml 형식으로 되어 있으며, 크게 다음의 3가지 정보를 포함한다. 

Clusters, Contexts, Users 3개의 필드 모두 배열 형식으로 여러 개의 값을 포함할 수 있다. 위 구성에서 확인할 수 있듯이, Clusters/Users 필드를 이용하여 여러 종류의 클러스터와 사용자를 기술할 수 있다. 그리고 Contexts 필드에서 Cluster@Users 의 형식으로 사용자와 클러스터를 매칭하여 준다.

조금 더 yaml 의 형식으로 보면 다음과 같다.

...
clusters:
- cluster:
    certificate-authority: ca.crt
    server: https://my-kubeapi-server:6443
  name: PrdCluster
contexts:
- context:
    cluster: PrdCluster
    user: admin
  name: admin@PrdCluster
users:
- name: admin
  user:
    client-certificate: admin.crt
    client-key: admin.key

위에서 설명한 내용과 동일한 내용을 확인할 수 있다. 예시에서는 1개의 cluster/user/context 가 표현되었지만 실제로는 yaml array 형식이므로 여러 개의 cluster/user 가 존재하고 context 쌍이 서술될 수 있다.

 

여기에 추가로

  • apiVersion : v1 
  • kind : Config
  • current-context : admin@PrdCluster

항목이 추가된다. current-context 에는 현재 context 값이 저장되며, 만약 사용자가 kubectl config 명령어로 context를 변경할 경우 이 파일의 이 값 또한 동적으로 자동으로 변경된다.

위 항목들이 추가된 KubeConfig 파일은 다음과 같다.

apiVersion: v1
kind: Config
current-context: admin@PrdCluster
clusters:
- cluster:
    certificate-authority: ca.crt
    server: https://my-kubeapi-server:6443
  name: PrdCluster
contexts:
- context:
    cluster: PrdCluster
    user: admin
  name: admin@PrdCluster
users:
- name: admin
  user:
    client-certificate: admin.crt
    client-key: admin.key

위와 같이 ca.crt, admin.crt, admin.key 파일을 상대 경로로 지정하였는데, 이 경로는 절대 경로로 지정할 수도 있다. 또한 추가로 파일의 경로가 아니라 실제 값을 넣어줄수도 있다. 이 때는 base64로 인코딩 한 값을 넣는다.

[root@localhost]# cat test.crt
-----BEGIN CERTIFICATE-----
MIIDfTCCAmWgAwIBAgIJAP+OIjvo6IITMA0GCSqGSIb3DQEBCwUAMFUxCzAJBgNV
BAYTAktSMRUwEwYDVQQHDAxEZWZhdWx0IENpdHkxHDAaBgNVBAoME0RlZmF1bHQg
...
S26HP5mYYGrJ1jQdvUMJxh3IW0WHfbceOIARLhF+Ldr8
-----END CERTIFICATE-----


[root@localhost]# cat test.crt | base64
LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tL....RklDQVRFLS0tLS0K
[root@localhost]#

또한 필드의 명에 '-data' 라는 postfix 가 추가된다.

Field 파일 경로 지정시의 Field 명 데이터 직접 입력시의 Field 명
clusters.cluster.certificate-authority certificate-authority certificate-authority-data
users.user.client-certificate client-certificate client-certificate-data
users.user.client-key client-key client-key-data

위와 같이 데이터 값으로 직접 넣은 kubeconfig 파일은 다음과 같아진다.
(실제 파일에서는 매우 긴 값이 보이나 화면 상 생략)

apiVersion: v1
kind: Config
current-context: admin@PrdCluster
clusters:
- cluster:
    certificate-authority-data: LS0tLS1CRUdJTiBDRV...0tLS0K
    server: https://my-kubeapi-server:6443
  name: PrdCluster
contexts:
- context:
    cluster: PrdCluster
    user: admin
  name: admin@PrdCluster
users:
- name: admin
  user:
    client-certificate-data: LS0tLS1CRUdJTiBDRV...0tLS0K
    client-key-data: LS0tLS1CRUdJTiBDRV...0tLS0K

 

KubeConfig 파일을 kubectl 명령어로 조회할 경우 조금 더 간략하게 볼 수 있다.

apiVersion: v1
kind: Config
current-context: admin@PrdCluster
clusters:
- cluster:
    certificate-authority-data: DATA+OMITTED
    server: https://my-kubeapi-server:6443
  name: PrdCluster
contexts:
- context:
    cluster: PrdCluster
    user: admin
  name: admin@PrdCluster
users:
- name: admin
  user:
    client-certificate-data: REDACTED
    client-key-data: REDACTED

 

 

위와 같이 인코딩 된 값들이 'DATA+OMITTED', 'REDACTED(민감한 내용을 가림)' 으로 표현되어 전체 구성과 cluster 의 이름 등을 쉽게 확인할 수 있다.

 

반대로 KubeConfig 파일을 알고 있을 경우 base64 로 디코딩하여 다시 원래의 ca.crt, admin.crt, admin.key 값도 확인할 수 있다.

[root@localhost]# 
echo "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tL....RklDQVRFLS0tLS0K" | base64 --decode
-----BEGIN CERTIFICATE-----
MIIDfTCCAmWgAwIBAgIJAP+OIjvo6IITMA0GCSqGSIb3DQEBCwUAMFUxCzAJBgNV
BAYTAktSMRUwEwYDVQQHDAxEZWZhdWx0IENpdHkxHDAaBgNVBAoME0RlZmF1bHQg
...
S26HP5mYYGrJ1jQdvUMJxh3IW0WHfbceOIARLhF+Ldr8
-----END CERTIFICATE-----
[root@localhost]#

 

댓글