플러그인으로 kubectl 확장하기
플러그인으로 kubectl 확장하기 (Extend kubectl with plugins)
kubectl 플러그인을 만들고 설치해 kubectl을 확장해요. 이 가이드는 kubectl용 확장을 설치하고 작성하는 방법을 보여드려요. 핵심 kubectl 명령을 쿠버네티스 클러스터와 상호작용하기 위한 필수 구성 요소로 생각한다면, 클러스터 관리자는 플러그인을 이러한 구성 요소를 활용해 더 복잡한 동작을 만드는 수단으로 생각할 수 있어요. 플러그인은 kubectl을 새 하위 명령으로 확장해, kubectl의 메인 배포판에 포함되지 않은 새롭고 커스텀한 기능을 허용해요.
출처: 문서
본문
시작하기 전에 (Before you begin)
작동하는 kubectl 바이너리가 설치돼 있어야 해요.
kubectl 플러그인 설치하기 (Installing kubectl plugins)
플러그인은 이름이 kubectl-로 시작하는 독립 실행형 실행 파일이에요. 플러그인을 설치하려면 그 실행 파일을 PATH의 어디든 이동해요.
Krew를 사용해 오픈 소스에서 사용 가능한 kubectl 플러그인을 발견하고 설치할 수도 있어요. Krew는 Kubernetes SIG CLI 커뮤니티가 유지 관리하는 플러그인 매니저예요.
주의: Krew 플러그인 인덱스를 통해 제공되는 Kubectl 플러그인은 보안 감사(audit)되지 않아요. 타사 플러그인은 머신에서 실행되는 임의의 프로그램이므로 본인 책임으로 설치하고 실행해야 해요.
플러그인 발견하기 (Discovering plugins)
kubectl은 PATH에서 유효한 플러그인 실행 파일을 검색하는 kubectl plugin list 명령을 제공해요. 이 명령을 실행하면 PATH의 모든 파일을 탐색해요. 실행 가능하고 kubectl-로 시작하는 파일은 PATH에 있는 순서대로 이 명령의 출력에 표시돼요. 실행 가능하지 않은 kubectl-로 시작하는 파일에는 경고가 포함돼요. 서로 이름이 겹치는 유효한 플러그인 파일에도 경고가 포함돼요.
Krew를 사용해 커뮤니티가 관리하는 플러그인 인덱스에서 kubectl 플러그인을 발견하고 설치할 수 있어요.
플러그인 만들기 (Create plugins)
kubectl은 PATH에 kubectl-create-something 바이너리를 제공해 kubectl create something 형태의 커스텀 create 명령을 플러그인이 추가하도록 허용해요.
제한 사항 (Limitations)
현재 기존 kubectl 명령을 덮어쓰거나 create 외의 명령을 확장하는 플러그인을 만드는 것은 불가능해요. 예를 들어 kubectl-version 플러그인을 만드는 것은 기존 kubectl version 명령이 항상 우선하기 때문에 그 플러그인이 절대 실행되지 않게 해요. 이 제한 때문에 기존 kubectl 명령에 새 하위 명령을 추가하기 위해 플러그인을 사용하는 것도 불가능해요. 예를 들어 kubectl-attach-vm으로 플러그인 이름을 지어 kubectl attach vm 하위 명령을 추가하는 것은 그 플러그인이 무시되게 해요. kubectl plugin list는 이를 시도하는 유효한 플러그인에 대해 경고를 보여줘요.
kubectl 플러그인 작성하기 (Writing kubectl plugins)
명령줄 명령을 작성할 수 있는 어떤 프로그래밍 언어나 스크립트로도 플러그인을 작성할 수 있어요.
플러그인 설치나 사전 로딩은 필요하지 않아요. 플러그인 실행 파일은 kubectl 바이너리에서 상속된 환경을 받아요. 플러그인은 이름을 기반으로 구현하려는 명령 경로를 결정해요. 예를 들어 kubectl-foo라는 플러그인은 kubectl foo 명령을 제공해요. 플러그인 실행 파일을 PATH 어딘가에 설치해야 해요.
예시 플러그인 (Example plugin)
#!/bin/bash
# optional argument handling
if [[ "$1" == "version" ]]
then
echo "1.0.0"
exit 0
fi
# optional argument handling
if [[ "$1" == "config" ]]
then
echo "$KUBECONFIG"
exit 0
fi
echo "I am a plugin named kubectl-foo"
플러그인 사용하기 (Using a plugin)
플러그인을 사용하려면 플러그인을 실행 가능하게 만들어요.
sudo chmod +x ./kubectl-foo
그리고 PATH의 어디든 배치해요.
sudo mv ./kubectl-foo /usr/local/bin
이제 플러그인을 kubectl 명령으로 호출할 수 있어요.
kubectl foo
I am a plugin named kubectl-foo
모든 인자와 플래그는 그대로 실행 파일에 전달돼요.
kubectl foo version
1.0.0
모든 환경 변수도 그대로 실행 파일에 전달돼요.
export KUBECONFIG=~/.kube/config
kubectl foo config
/home/<user>/.kube/config
KUBECONFIG=/etc/kube/config kubectl foo config
/etc/kube/config
추가로 플러그인에 전달되는 첫 번째 인자는 항상 호출된 위치의 전체 경로예요(위 예시에서 $0은 /usr/local/bin/kubectl-foo가 돼요).
플러그인 이름 짓기 (Naming a plugin)
위 예시에서 볼 수 있듯이 플러그인은 파일 이름을 기반으로 구현할 명령 경로를 결정해요. 플러그인이 대상으로 하는 명령 경로의 모든 하위 명령은 대시(-)로 구분돼요. 예를 들어 사용자가 kubectl foo bar baz 명령을 호출할 때마다 호출되길 원하는 플러그인은 kubectl-foo-bar-baz라는 파일 이름을 가져야 해요.
플래그와 인자 처리 (Flags and argument handling)
참고: 플러그인 메커니즘은 플러그인 프로세스에 어떤 커스텀한 플러그인 특정 값이나 환경 변수도 만들지 않아요. 더 오래된 kubectl 플러그인 메커니즘은
KUBECTL_PLUGINS_CURRENT_NAMESPACE같은 환경 변수를 제공했지만, 더 이상 그렇게 하지 않아요.
kubectl 플러그인은 전달된 모든 인자를 파싱하고 검증해야 해요. 플러그인 작성자를 위한 Go 라이브러리 세부 사항은 "명령줄 런타임 패키지 사용"을 참고하세요.
사용자가 플러그인을 추가 플래그와 인자와 함께 호출하는 몇 가지 추가 사례가 있어요. 이는 위 시나리오의 kubectl-foo-bar-baz 플러그인을 기반으로 해요.
kubectl foo bar baz arg1 --flag=value arg2를 실행하면 kubectl의 플러그인 메커니즘은 먼저 가능한 가장 긴 이름의 플러그인을 찾으려 시도해요. 이 경우 kubectl-foo-bar-baz-arg1이 될 거예요. 그 플러그인을 찾지 못하면 kubectl은 마지막 대시 구분 값을 인자(arg1)로 취급하고 다음으로 긴 이름을 찾으려 시도해요: kubectl-foo-bar-baz. 이 이름의 플러그인을 찾으면 kubectl은 그 플러그인을 호출하고, 플러그인 이름 뒤의 모든 인자와 플래그를 플러그인 프로세스의 인자로 전달해요.
예시:
# create a plugin
echo -e '#!/bin/bash\n\necho "My first command-line argument was $1"' > kubectl-foo-bar-baz
sudo chmod +x ./kubectl-foo-bar-baz
# "install" your plugin by moving it to a directory in your $PATH
sudo mv ./kubectl-foo-bar-baz /usr/local/bin
# check that kubectl recognizes your plugin
kubectl plugin list
The following kubectl-compatible plugins are available:
/usr/local/bin/kubectl-foo-bar-baz
# test that calling your plugin via a "kubectl" command works
# even when additional arguments and flags are passed to your
# plugin executable by the user.
kubectl foo bar baz arg1 --meaningless-flag=true
(계속) 위 출력에서는 사용자가 추가 인자와 플래그를 전달해도 플러그인이 호출되는 것을 보여줘요. 추가적인 플러그인 작성 사례에 대해서는 원문을 참고하세요.