kubectl 플러그인(Plugin) 추천
kubectl 관련하여 사용 팁을 공유하고자 한다.
CheatSheet
https://kubernetes.io/ko/docs/reference/kubectl/cheatsheet/
쉘에 등록하는건 CKA시험볼때도 유용하다. 다른건 몰라도 쉘 설정은 필수로 하자. kubectl -> k 로 줄여서 쓰는거는 처음부터 설정하는게 좋다.
Kubectl Plugins
kubectl은 여러가지 플러그인을 제공한다. 17년도에 비해서 체계가 잡혔고, 워낙 다양한 플러그인이 나오고 있는데, 사용편리성과 디버깅 측면에서 몇가지를 소개하고자 한다(사실 필자도 몰랐던 플러그인도 많았다)
krew 를 이용하면 여러가지 플러그인을 찾아볼 수 있다.
k krew search
...
access-matrix Show an RBAC access matrix for server resources no
accurate Manage Accurate, a multi-tenancy controller no
advise-policy Suggests PodSecurityPolicies and OPA Policies f... unavailable on darwin/arm64
advise-psp Suggests PodSecurityPolicies for cluster. unavailable on darwin/arm64
aks Interact with and debug AKS clusters no
alfred AI-powered Kubernetes assistant no
allctx Run commands on contexts in your kubeconfig no
...
ctx
클러스터를 자동으로 변환해주는 플러그인이다. kubectl ctx로 입력하면 cluster-info 에 있는 클러스터 리스트를 보여주고 선택할 수 있다.
ns
네임스페이스를 자동으로 변환해주는 플러그인이다. -n 네임스페이스를 붙이지 않아도 된다.
kubectl ns monitoring
debug
정말 유용한 툴로, 이건 kubectl 에 기본적으로 포함되어 있다. 동작하지 않는 파드에 필요한 툴들을 담은 사이드컨테이너를 인젝션하고 문제의 컨테이너의 네임스페이스로 동작시킨다. 이는 예전에 수동으로 직접 하던거를 간편화 했다고 보면 된다.
kubectl debug
Synopsis Debug cluster resources using interactive debugging containers. 'debug' provides automation for common debugging tasks for cluster objects identified by resource and name. Pods will be used by default if no resource is specified. The action taken
kubernetes.io
실행 중인 파드에 임시 컨테이너 추가하기
kubectl debug -it <파드명> --image=busybox --target=<대상컨테이너명>
컨테이너 안에서 ping이나 이런 명령어들이 설치되어 있지 않다면 exec 로 확인하기 어렵다. 해당 파드에 컨테이너를 붙이면서도 대상 컨테이너와 같은 네임스페이스(리눅스 컨테이너 용어)로 접근할수 있다. 실행하면 ephemeralContainers 로 추가된다.
-it 옵션을 빼먹지 말자. 이걸 빼먹으면 생성만 되고 해당 컨테이너 터미널이 안뜬다.
ephemeralContainers:
- image: busybox
imagePullPolicy: Always
name: debugger-s5cds
resources: {}
targetContainerName: config-reload
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
Ephemeral Containers
FEATURE STATE: Kubernetes v1.25 [stable] This page provides an overview of ephemeral containers: a special type of container that runs temporarily in an existing Pod to accomplish user-initiated actions such as troubleshooting. You use ephemeral containers
kubernetes.io
--copy-to 옵션으로 파드 복제하여 디버깅하기
위의 방법으로 추가된 ephemeralContainers 은 삭제가 안된다. 그렇기 때문에 디버깅 후에 파드를 재시작해줘야 하는데, 그걸 원치 않는다면, copy를 통해 네임스페이스를 공유하면서도 디버그 파드를 새로 생성할 수 있다.
kubectl debug myapp -it --image=busybox --share-processes --copy-to=myapp-debug
네임스페이스 공유를 위해서 --share-processes 옵션을 빼먹지 말자.
노드 디버깅을 위한 ephemeral 컨테이너 실행
debug 플러그인은 노드도 디버깅할 수 있다. 노드에 직접 접근이 어려울 때 이 방법을 사용하면 좋다.
kubectl debug node/<노드명> -it --image=ubuntu
이렇게 해서 접근했을때 호스트의 루트는 /host 로 마운트되어 있다.
oomd
OOM(out of memory) 를 확인할 경우 파드가 종료된 경우 kubectl describe 를 이용해서 확인할 수 있지만 사실 번거로운편이 있다.
lastState:
terminated:
containerID: 65183c1877aaec2e8427bc95609cc52677a454b56fcb24340dbd22917c23b10f
exitCode: 137
finishedAt: 2017-06-20T20:52:19Z
reason: OOMKilled
startedAt: null
oomd 플러그인을 이용하면 모든 OOM 파드를 확인해서 리스트업해주기 때문에 이 부분을 좀 더 쉽게 확인할 수 있다.
$ kubectl oomd
POD CONTAINER REQUEST LIMIT TERMINATION TIME
my-app-5bcbcdf97-722jp infoapp 1G 8G 2022-11-07 13:03:49 +0000 GMT
my-app-5bcbcdf97-7j5rd infoapp 1G 8G 2022-11-07 14:35:34 +0000 GMT
my-app-5bcbcdf97-k8g8g infoapp 1G 8G 2022-11-07 14:35:02 +0000 GMT
my-app-5bcbcdf97-mf65j infoapp 1G 8G 2022-11-07 14:34:57 +0000 GMT
stern
stern 은 kubectl logs 의 확장 기능으로, 여러개의 파드의 로그를 동시에 볼 수 있다.
다음 예시는 monitoring 네임스페이스에 exporter로 시작하는 모든 파드의 20분전부터의 "ERROR" 키워드를 담은 로그만 필터링해서 보여준다.
kubectl stern -n monitoring exporter --since=20m --include=ERROR
stern은 기본적으로 계속 tailing을 하기 때문에 잠깐 떴다가 사라지는 파드의 로그를 추적할 때도 좋다.
lineage
리소스간 의존성(해당 리소스가 의존하고 있는, 해당 리소스를 의존하고 있는)을 트리구조로 보여준다. tree 플러그인과 비교해서 한가지 특이한 점은 Helm 차트 의존성을 보여준다는 것이다.
GitHub - tohjustin/kube-lineage: A CLI tool to display all dependencies or dependents of an object in a Kubernetes cluster.
A CLI tool to display all dependencies or dependents of an object in a Kubernetes cluster. - tohjustin/kube-lineage
github.com
$ kube-lineage helm kube-state-metrics -n monitoring-system
helm kube-state-metrics -n monitoring-system
NAMESPACE NAME READY STATUS AGE
monitoring-system kube-state-metrics True Deployed 25m
├── ClusterRole/kube-state-metrics - 25m
│ └── ClusterRoleBinding/kube-state-metrics - 25m
monitoring-system │ └── ServiceAccount/kube-state-metrics - 25m
monitoring-system │ ├── Pod/kube-state-metrics-7dff544777-jb2q2 1/1 Running 25m
monitoring-system │ │ └── Service/kube-state-metrics - 25m
monitoring-system │ │ └── EndpointSlice/kube-state-metrics-rq8wk - 25m
monitoring-system │ └── Secret/kube-state-metrics-token-bsr4q - 25m
monitoring-system │ └── Pod/kube-state-metrics-7dff544777-jb2q2 1/1 Running 25m
├── ClusterRoleBinding/kube-state-metrics - 25m
monitoring-system ├── Deployment/kube-state-metrics 1/1 25m
monitoring-system │ └── ReplicaSet/kube-state-metrics-7dff544777 1/1 25m
monitoring-system │ └── Pod/kube-state-metrics-7dff544777-jb2q2 1/1 Running 25m
monitoring-system ├── Secret/sh.helm.release.v1.kube-state-metrics.v1 - 25m
monitoring-system ├── Service/kube-state-metrics - 25m
monitoring-system └── ServiceAccount/kube-state-metrics
commander
예전 도스시절 커맨더를 기억하는가? 그와 비슷한 UX로 여러 리소스들을 편리하게 검색가능하다.
리소스의 상세 스펙도 볼수 있고 로그도 인터렉티브하게 검색 가능하다.
아마도 openlens를 쓰는 분들은 굳이 이걸? 이라고 생각할 수도 있다.
GitHub - schabrolles/kubectl-commander: A kubectl plugin supercharged by fzf to create an interactive menu to interact with Kube
A kubectl plugin supercharged by fzf to create an interactive menu to interact with Kubernetes objects from your terminal. - schabrolles/kubectl-commander
github.com
tmux-exec
여러개의 파드를 동시에 exec 하는 플러그인이다. 여러 서버에 접속할때 쓰는 tmux와 동일한 컨셉이라고 보면된다.
동시에 선택하기 위해서 레이블을 가지고 파드를 선택하면 된다.
kubectl tmux-exec -l app=nginx sh
sniff
패킷캡쳐 플러그인이다. 보통은 -p 옵션을 추가해야지 정상적으로 캡쳐를 할 수 있다.
brew install --cask wireshark
kubectl sniff 파드이름 -p -i eth0 -o capture.pcap
필자가 사용해봤을때는 wireshark를 자동으로 띄워서 실시간으로 하는 방법이 있을거 같은데, 잘 되지 않아 -o 로 별도 파일로 저장한뒤에 로드하여 보았다.
view-secret
base64로 인코딩된 secret을 디코딩하여 보여준다. 매번 echo | base64 -d를 하지 않아서 편리하다.
kubectl view-secret 시크릿이름
view-cert
클러스터내 모든 인증서 정보와 그 유효기간을 한눈에 볼 수 있다. 인증서 만료를 앞두고 확인해볼 때 좋다.
kubectl view-cert -A
[
{
"SecretName": "hubble-server-certs",
"Namespace": "kube-system",
"Version": 3,
"SerialNumber": "432e15e784267e8c",
"Issuer": "CN=Cilium CA",
"Validity": {
"NotBefore": "2025-01-20T05:24:49Z",
"NotAfter": "2124-12-27T05:24:49Z"
},
"Subject": "CN=*.hubble-grpc.cilium.io",
"IsCA": false
},
{
"SecretName": "kyverno-svc.kyverno.svc.kyverno-tls-pair",
"Namespace": "kyverno",
"Version": 3,
"SerialNumber": "1",
"Issuer": "CN=*.kyverno.svc",
"Validity": {
"NotBefore": "2025-01-20T05:26:22Z",
"NotAfter": "2025-06-19T06:26:22Z"
},
"Subject": "CN=kyverno-svc",
"IsCA": false
}
]
fuzzy
fuzzy의 kubectl 버전이다. substring 으로 빠르게 리소스를 찾아주는 기능이다.
GitHub - d-kuro/kubectl-fuzzy: This tool uses fzf(1)-like fuzzy-finder to do partial or fuzzy search of Kubernetes resources. In
This tool uses fzf(1)-like fuzzy-finder to do partial or fuzzy search of Kubernetes resources. Instead of specifying full resource names to kubectl commands, you can choose them from an interactive...
github.com
df-pv
클러스터내 존재하는 Persistant Volume의 실제 데이터 사용량을 보여준다. disk의 여유를 확인하거나 volume을 늘려야할지 판단해야할때 유용하다.
$ kubectl df-pv
PV NAME PVC NAME NAMESPACE NODE NAME POD NAME VOLUME MOUNT NAME SIZE USED AVAILABLE %USED IUSED IFREE %IUSED
pvc-074bcefb-ae2a-4952-9640-21cb5f78c63f jenkins batch jenkins-worker-788t jenkins-0 jenkins-home 7Gi 980Mi 6Gi 12.31 4109 520179 0.78
cond
리소스 condition 타입별 상태를 컬러링해서 보여준다. 빠르게 문제가 생긴 파드 등을 탐색할때 유용하다.
kubectl cond po
Pod monitoring/alertmanager-prometheus-m-alertmanager-0
+-----------------+-----------------------------------------------------------+
| CONDITION TYPE | DETAILS |
+-----------------+-----------------------------------------------------------+
| Ready | Last Transition: 5 months ago (2024-09-25T10:33:31+09:00) |
| (True) | |
+-----------------+-----------------------------------------------------------+
| ContainersReady | Last Transition: 5 months ago (2024-09-25T10:33:31+09:00) |
| (True) | |
+-----------------+-----------------------------------------------------------+
| Initialized | Last Transition: 5 months ago (2024-09-25T10:33:24+09:00) |
| (True) | |
+-----------------+-----------------------------------------------------------+
| PodScheduled | Last Transition: 5 months ago (2024-09-25T10:33:20+09:00) |
| (True) | |
+-----------------+-----------------------------------------------------------+
Pod monitoring/deployment-7fbcb9d8f6-4drm7
+-----------------+-----------------------------------------------------------+
| CONDITION TYPE | DETAILS |
+-----------------+-----------------------------------------------------------+
| Ready | Last Transition: 5 months ago (2024-09-25T10:33:53+09:00) |
| (True) | |
+-----------------+-----------------------------------------------------------+
| ContainersReady | Last Transition: 5 months ago (2024-09-25T10:33:53+09:00) |
| (True) | |
+-----------------+-----------------------------------------------------------+
| Initialized | Last Transition: 5 months ago (2024-09-25T10:33:12+09:00) |
| (True) | |
+-----------------+-----------------------------------------------------------+
| PodScheduled | Last Transition: 5 months ago (2024-09-25T10:33:12+09:00) |
| (True) | |
+-----------------+-----------------------------------------------------------+
pod-lens
파드와 연결된 리소스(configmap, service, secret, pvc 등)를 컬러링된 트리구조로 보여준다. 또한 관련 상세 내용도 같이 보여주기 때문에 잘못 설정된 부분이 있는지 한눈에 살펴볼 수 있다.
GitHub - sunny0826/kubectl-pod-lens: kubectl plugin for show pod-related resources
kubectl plugin for show pod-related resources. Contribute to sunny0826/kubectl-pod-lens development by creating an account on GitHub.
github.com
ingress-nginx
ingress-nginx 의 업스트림 백엔드 정보나 conf 설정을 자세히 볼수 있는 플러그인이다. 유용하긴한데 mac 실리콘은 지원하지 않는다.
kubectl plugin - Ingress-Nginx Controller
The ingress-nginx kubectl plugin Installation Install krew, then run kubectl krew install ingress-nginx to install the plugin. Then run kubectl ingress-nginx --help to make sure the plugin is properly installed and to get a list of commands: kubectl ingres
kubernetes.github.io
총평
이렇게 해서 kubectl에서 유용하게 사용할만한 플러그인을 몇개 추천해보았다.
플러그인이 다양해서 좋긴한데, 기능상 겹치는 플러그인도 있는터라 여기 소개한 것보다 더 좋은 기능을 포함한 플러그인이 있을 수도 있다.
(기존에 여러가지로 나왔던 디버깅 툴이 kubectl debug로 통일된 부분도 있다)
사실 좋은 플러그인이 있어도 실제로 디버깅을 하면서 원인을 유추하는 것은 다른 문제다. 기본적으로 kubernetes 의 네트워크 구조와 컨테이너 특성을 기본적으로 이해하지 못하면 효율적인 원인 추정을 하기 어렵다.