kubectl .kuberc, 팀 kubeconfig 안 건드리고 내 alias 관리하기
오늘 알게 된 건데, 의외로 모르는 분 꽤 있더라. kubectl 1.33부터 들어온 .kuberc 얘기.
팀 단위로 kubeconfig를 공유해 본 사람은 다 한 번씩 짜증 났을 거다. 누군가 current-context를 prod로 바꿔놓고 그대로 푸시한 다음, 다른 사람이 dev에서 작업하다 prod 클러스터에 명령 날리는 그런 사고. 또 한 명은 alias k=kubectl을 셸에 박아두고, 다른 한 명은 kubectl get po -o wide를 매일 손가락으로 치고 있고. 개인 취향과 공용 자격증명이 같은 파일에 섞여 있는 게 문제다.
.kuberc(아직 alpha) 가 그 부분을 분리해 준다. ~/.kube/config에는 클러스터/사용자/컨텍스트만 두고, 내 개인 alias나 기본 플래그는 ~/.kube/kuberc로 빼는 식.
어떻게 쓰나
쓰려면 1.33+ kubectl에서 환경변수 한 줄이 필요하다. alpha 단계라.
export KUBECTL_KUBERC=true
그리고 ~/.kube/kuberc 파일을 이렇게:
apiVersion: kubectl.config.k8s.io/v1alpha1
kind: Preference
aliases:
- name: kgp
command: get pods
flags:
- name: output
default: wide
- name: kdp
command: describe pod
- name: kex
command: exec
flags:
- name: stdin
default: "true"
- name: tty
default: "true"
defaults:
- command: apply
flags:
- name: server-side
default: "true"
- command: delete
flags:
- name: interactive
default: "true"
이러면 kubectl kgp 가 kubectl get pods -o wide 가 되고, kubectl delete 칠 때 자동으로 --interactive 가 붙어서 한 번 더 물어본다. delete 오타로 prod 리소스 날린 적 있는 사람이면 마지막 줄만으로도 쓸 가치 있다.
셸 alias랑 뭐가 다른가
alias kgp='kubectl get pods -o wide' 셸에 박는 거랑 결과적으로 비슷해 보이는데, 차이가 좀 있다.
셸 alias는 셸이 해석한다. 그래서 xargs kubectl kgp 같은 식으로는 안 풀린다. .kuberc는 kubectl 자체가 해석해서 어디서 호출하든 통한다. CI 스크립트나 다른 사람이 짜 놓은 wrapper 안에서도 동일하게 동작한다는 뜻.
그리고 셸 alias는 플래그를 덧붙이기 애매하다. kgp -n foo 치면 kubectl get pods -o wide -n foo 가 되긴 하는데, 기본 flag만 깔고 싶을 때나 --interactive 같은 안전장치 깔고 싶을 때는 .kuberc 의 defaults가 훨씬 깔끔하다.
한 가지 주의
alpha라 KUBECTL_KUBERC=true를 빼먹으면 그냥 무시된다. 나는 처음에 이거 모르고 "왜 안 먹지" 한참 헤맸다. zshrc/bashrc에 환경변수 박아두자.
그리고 팀에 강제할 만한 단계는 아니다. 베타 가기 전까진 개인 dotfiles repo에만 두고 쓰는 정도가 적당하다.
혹시 다른 식으로 개인 kubectl 환경 관리하는 분 있으면 댓글 부탁드린다. krew + kubectx + .kuberc 조합이 요즘 내 기본 셋업인데, 더 나은 패턴이 있을 것 같다.