본문 바로가기

Technical/Cloud, Virtualization, Containers

[Kubernetes Cluster 관리] 클러스터 컨텍스트 변경과 kubectl을 통한 multi-cluster 접속

Kubernetes 를 사용하다 보면 서로 분리된 환경에 설치된 여러 클러스터에 번갈아 접속해야 할 경우가 종종 발생한다. 예를 들어 한 쪽은 개발&테스트, 다른 한 쪽은 실제 서비스 클러스터 환경, 이런 식이다. 접속 터미널을 따로 띄워서 간편히 사용하는 경우가 많겠지만, 필요에 따라 하나의 kubectl 클라이언트로 서로 다른 클러스터에 접속할 수 있도록 설정하는 방법을 정리한다(K8s 1.6.x~1.8.x 기준).




클러스터 이름과 관리자 이름 변경


Kubernetes 를 구글 repo를 통해 기본 설치로 진행하면, kubectl을 통한 클러스터 접속용 설정 파일(yaml 형식)은 위의 캡처 이미지와 같은 모양으로 나타나게 된다(root 유저일 경우 KUBECONFIG 환경변수의 값은 '/root/.kube/config' 값을 가진다). 파일을 열어 보면, 클러스터명은 kubernetes, 사용자는 kubernetes-admin' 으로 자동 설정 되고, kubeadm을 통한 설치시에 만들어 진 보안 인증키 값들이 인코딩 되어 사용된다. Minikube 를 로컬 PC에 자체 설치하였어도 전체적인 설정파일의 구조는 동일하다고 볼 수 있다.


이와 같이, 유사한 방식으로 쿠버네티스를 여러 환경에 설치하더라도 해당 클러스터명과 사용자명이 동일하게 되지 않도록 구분을 지어 주어야만 context를 스위칭하면서 kubectl 에서 각각의 클러스터에 접속을 할 수 있게 된다.



캡처이미지에도 표시하였지만, 박스로 표시된 부분에 대해 각 이름의 일관성을 유지하면서 원하는 값으로 바꾸어 저장하도록 한다. 여기서는 클러스터 이름을 k8s-vbox로, 사용자(관리자) 이름을 k8s-vbox-admin 으로 변경한다.


<첫 번 째 클러스터 KUBECONFIG 파일 변경>

[root@kubemaster ~]# kubectl config get-contexts

CURRENT   NAME                          CLUSTER      AUTHINFO           NAMESPACE

*         kubernetes-admin@kubernetes   kubernetes   kubernetes-admin


[root@kubemaster ~]# vi $KUBECONFIG 

apiVersion: v1

clusters:

- cluster:

    certificate-authority-data: REDACTED

    server: https://10.255.10.170:6443

  name: k8s-vbox

contexts:

- context:

    cluster: k8s-vbox

    user: k8s-vbox-admin

  name: k8s-vbox-admin@k8s-vbox

current-context: k8s-vbox-admin@k8s-vbox

kind: Config

preferences: {}

users:

- name: help

  user:

    as-user-extra: {}

- name: k8s-vbox-admin

  user:

    client-certificate-data: REDACTED 

    client-key-data: REDACTED


[root@kubemaster ~]# systemctl daemon-reload

[root@kubemaster ~]# systemctl restart kubelet


[root@kubemaster ~]# kubectl config get-contexts

CURRENT   NAME                      CLUSTER    AUTHINFO         NAMESPACE

*         k8s-vbox-admin@k8s-vbox   k8s-vbox   k8s-vbox-admi



이번에는 또 다른 클러스터 이름을 k8s-vmw로, 사용자(관리자) 이름을 k8s-vmw-admin 으로 변경한다.


<두 번 째 클러스터 KUBECONFIG 파일 변경>

[root@kubemaster ~]# kubectl config get-contexts

CURRENT   NAME                          CLUSTER      AUTHINFO           NAMESPACE

*         kubernetes-admin@kubernetes   kubernetes   kubernetes-admin


[root@kubemaster ~]# cat $KUBECONFIG 

apiVersion: v1

clusters:

- cluster: 

    certificate-authority-data: REDACTED

    server: https://192.168.60.170:6443

  name: k8s-vmw

contexts:

- context:

    cluster: k8s-vmw

    user: k8s-vmw-admin

  name: k8s-vmw-admin@k8s-vmw

current-context: k8s-vmw-admin@k8s-vmw

kind: Config

preferences: {}

users:

- name: k8s-vmw-admin

  user:

    client-certificate-data: REDACTED

    client-key-data: REDACTED


[root@kubemaster ~]# systemctl daemon-reload 

[root@kubemaster ~]# systemctl restart kubelet

[root@kubemaster ~]# systemctl status kubelet

● kubelet.service - kubelet: The Kubernetes Node Agent

   Loaded: loaded (/etc/systemd/system/kubelet.service; enabled; vendor preset: disabled)

  Drop-In: /etc/systemd/system/kubelet.service.d

           └─10-kubeadm.conf

   Active: active (running) since 화 2017-12-19 02:07:47 EST; 9s ago

...


[root@kubemaster ~]# kubectl config get-contexts

CURRENT   NAME                    CLUSTER   AUTHINFO        NAMESPACE

*         k8s-vmw-admin@k8s-vmw   k8s-vmw   k8s-vmw-admin



두 개 클러스터의 config 병합 & kubectl 접속


각 클러스터마다 config 를 수정하여 이름 부분이 잘 변경 되었다면, 양쪽 클러스터에 모두 접속할 수 있는 kubectl 클라이언트 계정의 config 파일에 또 다른 클러스터의 config 내용을 병합하여 아래와 같이 변경해 둔다. 내용을 잘 보면 두 개 클러스터의 config 파일 내용 중 'clusters' 영역과 'contexts' 영역 그리고 'users' 영역의 내용이 각각 병합되어 구성됨을 알 수 있을 것이다. 


[root@kubemaster ~]# cd ,kube

[root@kubemaster .kube]# cp config config.old

[root@kubemaster .kube]# vi config

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: REDACTED
    server: https://10.255.10.170:6443
  name: k8s-vbox
- cluster:
    certificate-authority-data: REDACTED
    server: https://192.168.60.170:6443
  name: k8s-vmw
contexts:
- context:
    cluster: k8s-vbox
    user: k8s-vbox-admin
  name: k8s-vbox-admin@k8s-vbox
- context:
    cluster: k8s-vmw
    user: k8s-vmw-admin
  name: k8s-vmw-admin@k8s-vmw
current-context: k8s-vbox-admin@k8s-vbox
kind: Config
preferences: {}
users:
- name: help
  user:
    as-user-extra: {}
- name: k8s-vbox-admin
  user:
    client-certificate-data: REDACTED
    client-key-data: REDACTED
- name: k8s-vmw-admin
  user:
    client-certificate-data: REDACTED
    client-key-data: REDACTED



이제 다음과 같이 두 개의 클러스터를 전환하면서 kubectl 명령을 사용할 수 있게 된다.


[root@kubemaster .kube]# kubectl config get-contexts 

CURRENT   NAME                      CLUSTER    AUTHINFO         NAMESPACE

*         k8s-vbox-admin@k8s-vbox   k8s-vbox   k8s-vbox-admin   

          k8s-vmw-admin@k8s-vmw     k8s-vmw    k8s-vmw-admin


[root@kubemaster ~]# kubectl get pods -nkube-system -l tier=control-plane -o wide

NAME                                 READY     STATUS    RESTARTS   AGE       IP              NODE

etcd-kubemaster                      1/1       Running   5          4d        10.255.10.170   kubemaster

kube-apiserver-kubemaster            1/1       Running   6          4d        10.255.10.170   kubemaster

kube-controller-manager-kubemaster   1/1       Running   5          4d        10.255.10.170   kubemaster

kube-scheduler-kubemaster            1/1       Running   5          4d        10.255.10.170   kubemaster

* 현재 접속된 클러스터의 pod 구성을 확인(control-plane 에 해당하는 pod 정보만 조회)


[root@kubemaster ~]# kubectl config use-context k8s-vmw-admin@k8s-vmw

Switched to context "k8s-vmw-admin@k8s-vmw".


[root@kubemaster ~]# kubectl get pods -nkube-system -l tier=control-plane -o wide

NAME                                 READY     STATUS    RESTARTS   AGE       IP               NODE

etcd-kubemaster                      1/1       Running   36         50d       192.168.60.170   kubemaster

kube-apiserver-kubemaster            1/1       Running   17         50d       192.168.60.170   kubemaster

kube-controller-manager-kubemaster   1/1       Running   45         50d       192.168.60.170   kubemaster

kube-scheduler-kubemaster            1/1       Running   43         50d       192.168.60.170   kubemaster

* 접속할 클러스터를 전환하여 pod 구성을 확인




- Barracuda -