[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 -