기초적인 것들이 늘 가장 어려운 법입니다. 여러 환경에 구축된 쿠버네티스 클러스터를 다루는 상황이 되니 이게 뭥미~ 하는 생각이 들면서 머릿속이 하얗게 변했습니다. 가령 로컬 환경에 시험용 클러스터가 구축되어 있고 (이하 docker-desktop) 구글 클라우드 플랫폼에 클러스터를 하나 구성한 상황에서 (이하 k8snopd) kubectl 로 양쪽 클러스터를 제어하는 방법의 정리입니다.
kubectl 설정 파일 확인하기
kubectl 을 사용하고 있다면 .kube/config 파일에 (맥 기준) 액세스 할 수 있는 클러스터 정보가 기록되어 있습니다. 언급 드린 것처럼 로컬 환경과 GCP 환경에 클러스터가 구성되어 있습니다. 로컬 환경은 맥 용 Docker Desktop 에서 클러스터를 만들었고, GCP 는 gcloud CLI 를 이용해서 원격지 환경에 클러스터를 만들고 접근할 수 있게 가이드를 따랐습니다.
이 상태라면 .kube/config 에는 두 클러스터 접근을 위한 설정이 들어가 있게 됩니다. 설정된 내용은 cat 등으로 조회할 수도 있지만 kubectl 을 이용해서 조회하는 것이 더 깔끔합니다.
% kubectl config view
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: DATA+OMITTED
server: https://kubernetes.docker.internal:6443
name: docker-desktop
- cluster:
certificate-authority-data: DATA+OMITTED
server: https://xx.xxx.xxx.xx
name: gke_k8s-practice-310514_asia-northeast1-a_k8snopd
contexts:
- context:
cluster: docker-desktop
user: docker-desktop
name: docker-desktop
- context:
cluster: gke_k8s-practice-310514_asia-northeast1-a_k8snopd
user: gke_k8s-practice-310514_asia-northeast1-a_k8snopd
name: gke_k8s-practice-310514_asia-northeast1-a_k8snopd
current-context: gke_k8s-practice-310514_asia-northeast1-a_k8snopd
kind: Config
preferences: {}
users:
- name: docker-desktop
user:
client-certificate-data: REDACTED
client-key-data: REDACTED
- name: gke_k8s-practice-310514_asia-northeast1-a_k8snopd
user:
auth-provider:
config:
access-token: ya29.a0AfH6SM...........................
cmd-args: config config-helper --format=json
cmd-path: /Downloads/google-cloud-sdk/bin/gcloud
expiry: "2021-04-15T09:00:09Z"
expiry-key: '{.credential.token_expiry}'
token-key: '{.credential.access_token}'
name: gcp
먼저 clusters 노드로 두개의 cluster 가 지정돤 것이 보입니다. name 키에 지정된 이름이 각각 다른게 보이시죠? GCP 에 만든 클러스터 이름은 다소 복잡합니다. GCP 의 리전명 등이 포함되어 있네요. 이어서 각 클러스터에 접근할 때 사용되는 사용자 토큰 등의 정보가 이어집니다.
kubectl 에서 클러스터 바꾸는 방법
위의 설정에서 주목할 값 중 하나는 current-context 입니다. 제 경우는 GCP 를 나중에 설정해서 그런지 GCP 가 현재 컨텍스트라고 지정되어 있습니다. 즉, kubectl 명령을 사용하면 특별히 컨텍스트를 지정하지 않으면 GCP 의 클러스터로 명령을 날리게 됩니다. 한번 해볼까요?
% kubectl get nodes
NAME STATUS ROLES AGE VERSION
gke-k8snopd-default-pool-8130c84d-371t Ready <none> 63m v1.18.16-gke.502
gke-k8snopd-default-pool-8130c84d-l26t Ready <none> 63m v1.18.16-gke.502
gke-k8snopd-default-pool-8130c84d-xrkt Ready <none> 63m v1.18.16-gke.502
그렇다면 로컬 클러스터 (docker-desktop) 로 컨텍스트를 바꾸어 노드 목록을 받아오고 싶다면 어떻게 해야 할까요? kubectl 이 제공하는 --context 매개변수를 이용해서 클러스터의 컨텍스트명을 입력해 주면 쉽게 대상 클러스터를 바꿀 수 있습니다. 함 해보죠!
% kubectl get nodes --context docker-desktop
NAME STATUS ROLES AGE VERSION
docker-desktop Ready master 5d23h v1.19.3