kubectl kuberc, 이제 alias 셸에 박지 말자

오늘 알게 된 건데, 1.34부터 kuberc가 beta 승격됐다. 이게 뭐냐면, kubectl 전용 사용자 설정 파일이다. 별칭하고 기본 옵션을 따로 관리할 수 있게 해준다.
솔직히 우리 팀은 ~/.zshrc나 ~/.bashrc에 alias k=kubectl, alias kgp='kubectl get pods' 같은 걸 한 30줄씩 박아두고 살았는데, 이거 좀 지저분하다. 새 노트북 받을 때마다 dotfiles 복사하고, 팀 신입한테 "이거 깔아라" 시키는 것도 일이다.
kuberc는 그 자리를 대체할 수 있는 공식 방법이다. kubectl 자체가 읽어서 처리한다.
어떻게 생겼나
~/.kube/kuberc 한 파일이다. 위치만 약속하면 끝.
apiVersion: kubectl.config.k8s.io/v1beta1
kind: Preference
aliases:
- name: kgp
command: get pods
options:
- name: output
default: wide
- name: kdrain
command: drain
options:
- name: ignore-daemonsets
default: "true"
- name: delete-emptydir-data
default: "true"
defaults:
- command: apply
options:
- name: server-side
default: "true"
- command: delete
options:
- name: interactive
default: "true"
aliases는 셸 alias 대체용이고, defaults는 기존 명령에 기본 옵션을 박는 용도다. 차이가 좀 미묘하다.
내가 의외로 좋아하는 건 defaults 쪽이다. kubectl apply에 --server-side 기본으로 깔아두면 SSA(server-side apply) 디폴트가 되고, kubectl delete에 --interactive 기본으로 깔아두면 prod에서 delete deployment 치자마자 "정말 지울 거냐"고 물어본다. 새벽에 wrong context 박혀서 prod 날려먹는 사고를 한 번이라도 본 적 있으면 이 옵션 가치를 안다.
셸 alias랑 뭐가 다른가
alias k=kubectl은 셸이 처리한다. 그래서 xargs kubectl ... 같은 데서 안 먹힌다. 자동완성도 자기가 알아서 알려줘야 한다.
kuberc는 kubectl 바이너리 자체가 처리한다. 그래서 자동완성도 같이 동작하고, --help에도 alias가 잡힌다. kubectl kgp -n kube-system 치면 그냥 동작한다.
근데 한 가지 함정이 있다. alias가 외부 스크립트나 CI 잡에서 동작하는 건 아니다. kuberc는 ~/.kube/kuberc에 있는 게 default라서 CI runner에는 안 깔려 있다. 환경변수 KUBERC로 경로를 지정해도 되긴 한데, 이게 좀 애매하다. 결국 사람용이지 자동화용은 아니라는 얘기.
굳이 써야 하나
내 결론은 "써라". 이유는 두 가지.
첫째, dotfiles에서 kubectl 관련 alias를 분리할 수 있다. 깔끔하다.
둘째, 팀 표준을 만들기 좋다. 우리 팀은 git 리포에 kuberc.yaml 하나 두고 onboarding 문서에 "이거 ~/.kube/kuberc로 복사하세요"라고만 적어둔다. zsh, bash, fish 셸 다 다른 팀원들한테 따로 안내 안 해도 된다.
셋째 — 좀 약한 이유긴 한데 — --interactive 기본값 같은 안전장치를 강제할 수 있다.
1.34 클러스터가 없어도 클라이언트 1.34 이상이면 동작한다. kubectl만 업그레이드하면 된다. kubeconfig 안 건드리는 것도 좋다.
혹시 이미 잘 쓰고 계신 분들 더 좋은 alias 패턴 있으면 댓글로 알려주세요. defaults에 박아둘만한 옵션 추천도 환영.