Overview
Kubernetes를 실무에서 사용하다 보면, kubectl
만으로는 부족함을 느낄 때가 많다.
이럴 때 Krew라는 패키지 매니저를 활용하면 kubectl
에 다양한 플러그인을
손쉽게 추가할 수 있어 워크플로우를 훨씬 효율적으로 만들 수 있다.
이번 글에서는 Krew의 개념과 설치 방법,
그리고 실무에서 자주 활용되는 인기 플러그인들(kubectx, kubens, kube-ps1, neat, node-shell
)의
설치 및 사용법을 함께 정리한다.
클러스터를 빠르게 탐색하고 관리하고 싶은 분들께 큰 도움이 될 실전 가이드이다.

Krew란?

Krew는 Kubernetes 클러스터와 상호 작용하기 위한 명령줄 도구인 kubectl의 플러그인 관리자이다.
Krew를 사용하면 kubectl의 기능을 확장하는 추가 플러그인을 쉽게 검색, 설치 및 관리한다. 플러그인은 패키지로 배포되며 Kubernetes 커뮤니티에서 관리하는 플러그인의 중앙 저장소인 Krew 인덱스에서 호스팅할 수 있다.
Krew 설치 가이드
krew 설치
아래의 명령어를 사용하면 설치가 된다.
(
set -x; cd "$(mktemp -d)" &&
OS="$(uname | tr '[:upper:]' '[:lower:]')" &&
ARCH="$(uname -m | sed -e 's/x86_64/amd64/' -e 's/\(arm\)\(64\)\?.*/\1\2/' -e 's/aarch64$/arm64/')" &&
KREW="krew-${OS}_${ARCH}" &&
curl -fsSLO "https://github.com/kubernetes-sigs/krew/releases/latest/download/${KREW}.tar.gz" &&
tar zxvf "${KREW}.tar.gz" &&
./"${KREW}" install krew
)
++ mktemp -d
+ cd /tmp/tmp.RkH52djNKx
++ uname
++ tr '[:upper:]' '[:lower:]'
+ OS=linux
++ uname -m
++ sed -e s/x86_64/amd64/ -e 's/\(arm\)\(64\)\?.*/\1\2/' -e 's/aarch64$/arm64/'
+ ARCH=amd64
+ KREW=krew-linux_amd64
+ curl -fsSLO https://github.com/kubernetes-sigs/krew/releases/latest/download/krew-linux_amd64.tar.gz
+ tar zxvf krew-linux_amd64.tar.gz
./LICENSE
./krew-linux_amd64
+ ./krew-linux_amd64 install krew
Adding "default" plugin index from https://github.com/kubernetes-sigs/krew-index.git.
Updated the local copy of plugin index.
Installing plugin: krew
Installed plugin: krew
\
| Use this plugin:
| kubectl krew
| Documentation:
| https://krew.sigs.k8s.io/
| Caveats:
| \
| | krew is now installed! To start using kubectl plugins, you need to add
| | krew's installation directory to your PATH:
| |
| | * macOS/Linux:
| | - Add the following to your ~/.bashrc or ~/.zshrc:
| | export PATH="${KREW_ROOT:-$HOME/.krew}/bin:$PATH"
| | - Restart your shell.
| |
| | * Windows: Add %USERPROFILE%\.krew\bin to your PATH environment variable
| |
| | To list krew commands and to get help, run:
| | $ kubectl krew
| | For a full list of available plugins, run:
| | $ kubectl krew search
| |
| | You can find documentation at
| | https://krew.sigs.k8s.io/docs/user-guide/quickstart/.
| /
/
krew 환경변수 등록
$ vi ~/.bashrc
# kubectl krew
export PATH="${KREW_ROOT:-$HOME/.krew}/bin:$PATH"
krew 기본 사용법
# 전체 플러그인 검색
$ kubectl krew search
# 플러그인 상세 정보 확인
$ kubectl krew info <plugin-name>
# 설치된 플러그인 목록 보기
$ kubectl krew list
# 모든 플러그인 업데이트
$ kubectl krew upgrade
krew 관련 트러블슈팅 팁
👉 예: kubectl krew: command not found
문제 시 PATH
확인
which krew
which kubectx
/opt/homebrew/bin/kubectx
kubectx & kubedns 란?
kubectx(context 관리), kubedns(namespace 관리)
kubectx 및 kubens는 컨텍스트와 네임스페이스 간 전환 프로세스를 단순화하여 Kubernetes로 보다 효율적으로 작업하는 데 도움이 되는 두 개의 명령줄 유틸리티이다.
$ kubectl krew install ctx
Updated the local copy of plugin index.
Installing plugin: ctx
Installed plugin: ctx
...
WARNING: You installed plugin "ctx" from the krew-index plugin repository.
These plugins are not audited for security by the Krew maintainers.
Run them at your own risk.
$ kubectl krew install ns
Updated the local copy of plugin index.
Installing plugin: ns
Installed plugin: ns
...
WARNING: You installed plugin "ns" from the krew-index plugin repository.
These plugins are not audited for security by the Krew maintainers.
Run them at your own risk.
$ git clone https://github.com/ahmetb/kubectx ./kubectx
Cloning into './kubectx'...
remote: Enumerating objects: 1482, done.
remote: Counting objects: 100% (197/197), done.
remote: Compressing objects: 100% (112/112), done.
remote: Total 1482 (delta 98), reused 162 (delta 78), pack-reused 1285
Receiving objects: 100% (1482/1482), 911.95 KiB | 4.49 MiB/s, done.
Resolving deltas: 100% (830/830), done.
$ cd kubectx/
~/kubectx$ ls
CONTRIBUTING.md LICENSE README.md cmd completion go.mod go.sum img internal kubectx kubens test
~/kubectx$ sudo cp kubectx /usr/local/bin/
~/kubectx$ sudo cp kubens /usr/local/bin/
$ kubectl krew list
PLUGIN VERSION
ctx v0.9.4
krew v0.4.3
ns v0.9.4
kubectx
kubectx를 사용하면 서로 다른 Kubernetes 컨텍스트 간에 쉽게 전환할 수 있다.
컨텍스트는 Kubernetes 구성 파일(일반적으로 ~/.kube/config)에 정의되며 작업 중인 클러스터, 사용자 및 네임스페이스에 대한 정보를 저장한다.
kubectx를 사용하면 구성 파일을 수동으로 편집하지 않고도 다른 클러스터 또는 사용자 구성 간에 빠르게 전환할 수 있다.
- kubectx: 사용 가능한 컨텍스트를 나열한다.
- kubectx <context_name>: 지정된 컨텍스트로 전환한다.
- kubectx -d <context_name>: 지정된 컨텍스트를 삭제한다.
kubectx 사용법
$ kubectx
arn:aws:eks:ap-northeast-1:123456789012:cluster/EKS1
arn:aws:eks:ap-northeast-1:123456789013:cluster/EKS2
arn:aws:eks:ap-northeast-2:123456789012:cluster/EKS3
arn:aws:eks:ap-northeast-2:123456789013:cluster/EKS4
$ kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
arn:aws:eks:ap-northeast-1:123456789012:cluster/EKS1 arn:aws:eks:ap-northeast-1:123456789012:cluster/EKS1 arn:aws:eks:ap-northeast-1:123456789012:cluster/EKS1
arn:aws:eks:ap-northeast-1:123456789013:cluster/EKS2 arn:aws:eks:ap-northeast-1:123456789013:cluster/EKS2 arn:aws:eks:ap-northeast-1:123456789013:cluster/EKS2
arn:aws:eks:ap-northeast-2:123456789012:cluster/EKS3 arn:aws:eks:ap-northeast-2:123456789012:cluster/EKS3 arn:aws:eks:ap-northeast-1:123456789012:cluster/EKS3
* arn:aws:eks:ap-northeast-2:123456789013:cluster/EKS4 arn:aws:eks:ap-northeast-2:123456789013:cluster/EKS4 arn:aws:eks:ap-northeast-1:123456789013:cluster/EKS4
$ kubectx arn:aws:eks:ap-northeast-2:123456789012:cluster/EKS3
$ kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
arn:aws:eks:ap-northeast-1:123456789012:cluster/EKS1 arn:aws:eks:ap-northeast-1:123456789012:cluster/EKS1 arn:aws:eks:ap-northeast-1:123456789012:cluster/EKS1
arn:aws:eks:ap-northeast-1:123456789013:cluster/EKS2 arn:aws:eks:ap-northeast-1:123456789013:cluster/EKS2 arn:aws:eks:ap-northeast-1:123456789013:cluster/EKS2
* arn:aws:eks:ap-northeast-2:123456789012:cluster/EKS3 arn:aws:eks:ap-northeast-2:123456789012:cluster/EKS3 arn:aws:eks:ap-northeast-1:123456789012:cluster/EKS3
arn:aws:eks:ap-northeast-2:123456789013:cluster/EKS4 arn:aws:eks:ap-northeast-2:123456789013:cluster/EKS4 arn:aws:eks:ap-northeast-1:123456789013:cluster/EKS4
kubens
kubens는 현재 컨텍스트 내에서 Kubernetes 네임스페이스 간에 전환하는 데 도움이 된다.
네임스페이스는 Kubernetes 클러스터 내에서 리소스를 구성하는 방법으로 리소스 격리 및 관리를 개선할 수 있다.
kubens를 사용하면 구성 파일을 수동으로 편집하지 않고도 활성 네임스페이스를 빠르게 변경할 수 있다.
- kubens: 사용 가능한 네임스페이스를 나열합니다.
- kubens <namespace>: 지정된 네임스페이스로 전환
kubens 사용법
$ kubens
default
dev1
dev2
kube-node-lease
kube-public
kube-system
$ kubens kube-system
$ k get po
NAME READY STATUS RESTARTS AGE
aws-load-balancer-controller-865cd8df88-djt9m 1/1 Running 0 123d
aws-load-balancer-controller-865cd8df88-tlf4z 1/1 Running 0 123d
coredns-c96679f98-9bt9k 1/1 Running 0 123d
coredns-c96679f98-vk559 1/1 Running 0 123d
dev1-kubernetes-external-secrets-8545gpwd5 1/1 Running 0 104d
dev2-kubernetes-external-secrets-59f6gv5c8 1/1 Running 0 10d
$ kubens dev1
$ k get po
NAME READY STATUS RESTARTS AGE
dev1-76fc65969d-4bcxm 1/1 Running 0 23m
kube-ps1란?
kube-ps1는 multi cluster에서 사용자의 실수를 줄여주는 bash와 zsh을 위한 kubernetes prompt이다.
그리고 현재 Context와 Namespace를 표시해주는 명령어이다.
bash를 기준으로 작성하였습니다.

kube-ps1 설치
$ git clone https://github.com/jonmosco/kube-ps1.git
~/.bashrc
추가
$ vi ~/.bashrc
source ~/eks/kube-ps1/kube-ps1.sh
PS1='[\u@\h \W $(kube_ps1)]\$ '
KUBE_PS1_SYMBOL_ENABLE=false
KUBE_PS1_SYMBOL_COLOR=null
KUBE_PS1_CTX_COLOR=red
KUBE_PS1_NS_COLOR=null
function get_cluster_short() {
echo "$1" | cut -d / -f2
}
KUBE_PS1_CLUSTER_FUNCTION=get_cluster_short
kube-ps1 사용법
$ bashrc 적용
somaz@AD01769994:~$ source ~/.bashrc
[somaz@AD01769994 ~ (EKS4)]$ kubectx
arn:aws:eks:ap-northeast-1:123456789012:cluster/EKS1
arn:aws:eks:ap-northeast-1:123456789013:cluster/EKS2
arn:aws:eks:ap-northeast-2:123456789012:cluster/EKS3
arn:aws:eks:ap-northeast-2:123456789013:cluster/EKS4
[somaz@AD01769994 ~ (EKS4)]$ kubectx arn:aws:eks:ap-northeast-2:123456789012:cluster/EKS3
# on/off
[somaz@AD01769994 ~ (EKS3)]$ kubeoff
[somaz@AD01769994 ~ ]$ kubeon
[somaz@AD01769994 ~ (EKS3)]$
kubectl-neat 란?
kubectl 명령어 결과에서 불필요한 정보를 정리하여 가독성있게 읽을 수 있게 해준다.
neat 설치
$ kubectl krew install neat
Updated the local copy of plugin index.
Installing plugin: neat
Installed plugin: neat
\
| Use this plugin:
| kubectl neat
| Documentation:
| https://github.com/itaysk/kubectl-neat
/
WARNING: You installed plugin "neat" from the krew-index plugin repository.
These plugins are not audited for security by the Krew maintainers.
Run them at your own risk.
neat 사용법
$ k get deployments.apps coredns -o yaml
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "2"
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{},"labels":{"eks.amazonaws.com/component":"coredns","k8s-app":"kube-dns","kubernetes.io/name":"CoreDNS"},"name":"coredns","namespace":"kube-system"},"spec":{"replicas":2,"selector":{"matchLabels":{"eks.amazonaws.com/component":"coredns","k8s-app":"kube-dns"}},"strategy":{"rollingUpdate":{"maxUnavailable":1},"type":"RollingUpdate"},"template":{"metadata":{"annotations":{"eks.amazonaws.com/compute-type":"ec2"},"labels":{"eks.amazonaws.com/component":"coredns","k8s-app":"kube-dns"}},"spec":{"affinity":{"nodeAffinity":{"requiredDuringSchedulingIgnoredDuringExecution":{"nodeSelectorTerms":[{"matchExpressions":[{"key":"beta.kubernetes.io/os","operator":"In","values":["linux"]},{"key":"beta.kubernetes.io/arch","operator":"In","values":["amd64","arm64"]}]}]}},"podAntiAffinity":{"preferredDuringSchedulingIgnoredDuringExecution":[{"podAffinityTerm":{"labelSelector":{"matchExpressions":[{"key":"k8s-app","operator":"In","values":["kube-dns"]}]},"topologyKey":"kubernetes.io/hostname"},"weight":100}]}},"containers":[{"args":["-conf","/etc/coredns/Corefile"],"image":"602401143452.dkr.ecr.ap-northeast-2.amazonaws.com/eks/coredns:v1.8.7-eksbuild.1","imagePullPolicy":"IfNotPresent","livenessProbe":{"failureThreshold":5,"httpGet":{"path":"/health","port":8080,"scheme":"HTTP"},"initialDelaySeconds":60,"successThreshold":1,"timeoutSeconds":5},"name":"coredns","ports":[{"containerPort":53,"name":"dns","protocol":"UDP"},{"containerPort":53,"name":"dns-tcp","protocol":"TCP"},{"containerPort":9153,"name":"metrics","protocol":"TCP"}],"readinessProbe":{"httpGet":{"path":"/health","port":8080,"scheme":"HTTP"}},"resources":{"limits":{"memory":"170Mi"},"requests":{"cpu":"100m","memory":"70Mi"}},"securityContext":{"allowPrivilegeEscalation":false,"capabilities":{"add":["NET_BIND_SERVICE"],"drop":["all"]},"readOnlyRootFilesystem":true},"volumeMounts":[{"mountPath":"/etc/coredns","name":"config-volume","readOnly":true},{"mountPath":"/tmp","name":"tmp"}]}],"dnsPolicy":"Default","priorityClassName":"system-cluster-critical","serviceAccountName":"coredns","tolerations":[{"effect":"NoSchedule","key":"node-role.kubernetes.io/master"},{"key":"CriticalAddonsOnly","operator":"Exists"}],"volumes":[{"emptyDir":{},"name":"tmp"},{"configMap":{"items":[{"key":"Corefile","path":"Corefile"}],"name":"coredns"},"name":"config-volume"}]}}}}
creationTimestamp: "2022-06-10T06:52:25Z"
generation: 2
labels:
eks.amazonaws.com/component: coredns
k8s-app: kube-dns
kubernetes.io/name: CoreDNS
name: coredns
namespace: kube-system
resourceVersion: "180739914"
uid: f04a76b0-0013-4264-ae7a-47e8bf69c095
spec:
progressDeadlineSeconds: 600
replicas: 2
revisionHistoryLimit: 10
selector:
matchLabels:
eks.amazonaws.com/component: coredns
k8s-app: kube-dns
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 1
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
eks.amazonaws.com/component: coredns
k8s-app: kube-dns
...
아래와 같이 바꿔준다.
$ k get deployments.apps coredns -o yaml |k neat
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "2"
labels:
eks.amazonaws.com/component: coredns
k8s-app: kube-dns
kubernetes.io/name: CoreDNS
name: coredns
namespace: kube-system
spec:
progressDeadlineSeconds: 600
replicas: 2
revisionHistoryLimit: 10
selector:
matchLabels:
eks.amazonaws.com/component: coredns
k8s-app: kube-dns
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 1
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
eks.amazonaws.com/component: coredns
k8s-app: kube-dns
kubectl node-shell
쿠버네티스 노드에 원격으로 접속할 수 있다.
- Context(.kube/config 파일 필수)

node-shell 설치 및 사용
$ kubectl krew index add kvaps https://github.com/kvaps/krew-index
$ kubectl krew install kvaps/node-shell
$ k get nodes
NAME STATUS ROLES AGE VERSION
master0 Ready control-plane,master 365d v1.23.5
node1 Ready <none> 365d v1.23.5
node2 Ready <none> 365d v1.23.5
node3 Ready <none> 365d v1.23.5
node4 Ready <none> 365d v1.23.5
node5 Ready <none> 365d v1.23.5
$ k node-shell master0
spawning "nsenter-xc12na" on "master0"
If you don't see a command prompt, try pressing enter.
root@master0:/# ls
마무리: "kubectl 플러그인으로 작업 흐름을 더 빠르게!"
Krew는 단순한 플러그인 매니저를 넘어, Kubernetes 환경에서 개발자와 운영자의 생산성을 극대화해주는 강력한 도구이다.
컨텍스트/네임스페이스 전환, YAML 가독성 향상, 노드 접속, 프롬프트 표시까지 – 플러그인 하나로 수많은 반복 작업을 줄일 수 있다.
특히 실무에서는 kubectx, kubens, kube-ps1, neat의 조합이 굉장히 유용하며, node-shell은 예기치 않은 상황에서 디버깅에 큰 도
움이 된다.
꾸준히 Krew의 plugin 목록을 확인하고, 팀에 맞는 툴셋을 구성해보자.
Reference
'Container Orchestration > Kubernetes' 카테고리의 다른 글
MetalLB란? (2) | 2023.05.03 |
---|---|
Kubernetes Resources(쿠버네티스 리소스) (0) | 2023.05.02 |
Kubernetes API Server, Group / RBAC란? (2) | 2023.04.19 |
K8S 인증서 10년 만기 생성 방법 (2) | 2022.09.23 |
kubectl 명령어 정리 (0) | 2022.08.10 |