DevOps/Kubernetes

[Kubernetes] Kubeconfig 파일

TTOII 2022. 6. 6. 13:53
728x90

🚀 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
728x90