쿠버네티스 교육

04. Kube 교육 - Kube tool 이용(kctx, kns, kps, kubetail, k neat)

Jerry_이정훈 2021. 6. 4. 16:36
728x90

실습

  • kubeps, kubectx, kubens을 이용한 Cluster, Namespace 변경
  • k neat 통한 YAML file export
  • kube tail 통한 멀티 pod 로그 동시 조회 

Why kube tools 

시간이 가장 소중한 자원이라 엔지니어는 항상 시간을 줄일 수 있는 도구를 찾아야 한다고 생각합니다. 아마 우리가 하는 일의 대부분은 예전에도 하였고 다음에도 할 일입니다. (니체의 영원회귀는 참 맞는 말입니다.) 귀챠니즘이 가장 큰 적인데 매번 작업 시 다음에 어떻게 더 빠르게 할 수 있을까 생각하며 조금이라도 더 생각하는 게 퇴근 시간을 앞당길 수 있는 길이라 생각합니다.

Kube는 태생 자체가 여러 툴들의 조합이고 그걸 또 편하게 integration 할 수 있게 API 서버를 사용하고 있어 참으로 수많은 툴들이 있습니다. 여러 가지 조합해 가면서 자기 만의 리스트들을 추가해 가시는 것을 권고 드립니다.

 

더많은 Kube Tools 참조

참조 : https://blog.usejournal.com/useful-tools-for-better-kubernetes-development-87820c2b9435

 

Useful Tools for Better Kubernetes Development

A collection of awesome Kubernetes tools and projects to deploy, secure, and monitor your Kubernetes clusters.

blog.usejournal.com

kps, kctx, kns 사용

공식 홈페이지 : 

https://github.com/ahmetb/kubectx

 

ahmetb/kubectx

Faster way to switch between clusters and namespaces in kubectl - ahmetb/kubectx

github.com

https://github.com/jonmosco/kube-ps1

 

jonmosco/kube-ps1

Kubernetes prompt info for bash and zsh. Contribute to jonmosco/kube-ps1 development by creating an account on GitHub.

github.com

개인 테스트 + 개발/스테이징/운영 클러스터까지 포함하면 보통 개인 당 5~6대 클러스터 넘어가기 쉽습니다. 저만 해도 10개는 넘어가네요. 

 

제 클러스터 현황 입니다. 

[spkr@erdia22 ~ (hci1-cloud1-dz:diamanti-system)]$ kctx
adzcluster
cmoa
dzbumin
dz-group
dz-saas
dz-saas2
dztest:admin:default
hci1-cloud1-dz:spk:default
hci2-cloud1-dz:spk:default
k3s
kspray
nvme
scluster:admin:default
sfx
spkn02

이렇게 많은 클러스터가 있으면 현재 내가 어떤 클러스터에 작업하고 있고 어떤 네임스페이스에 있는지 헷갈리는 경우가 많습니다. 이 때 사용하는 툴이 kps/kctx/kns 입니다.

 

먼저, kps(kube prompt status)는 현재 prompt로 kube cluster와 namespace 정보를 표시해 줍니다. 아래는 spkn02 cluster의 nginx 네임스페이스 작업 공간을 나타냅니다. 혹시 있을 다른 클러스터에서 k delete pod --all 등의 위험한 명령어를 내리기 전 다시 한 번 확인하게 합니다.

[spkr@erdia22 ~ (spkn02:nginx)]$ 
[spkr@erdia22 ~ (k3s:default)]$ (이건 k3s cluster, default namespace 입니다.)

그럼, 간단히 설치 예제 입니다. 

[root@ksp1 ~]# git clone https://github.com/jonmosco/kube-ps1.git
Cloning into 'kube-ps1'...
(생략)

[root@ksp1 kube-ps1]# vi ~/.bashrc
(생략)
source ~/kube-ps1/kube-ps1.sh
PS1='[\u@\h \W $(kube_ps1)]\$ '
KUBE_PS1_SYMBOL_ENABLE=false

[root@ksp1 kube-ps1]# source ~/.bashrc

이제 Prompt가 변경되었습니다. 긴 이름의 kubernetes-admin@cluster.local 클러스터와 default라는 namespace 사용 중이네요. 

[root@ksp1 kube-ps1 (kubernetes-admin@cluster.local:default)]# 

cluster 이름이 너무 길어서 이걸 줄여 보겠습니다. cluster 이름은 ‘kube config’ 파일에 저장된 이름을 사용 합니다. 아래 파일의 ‘context’ 부문을 'kube' 로 변경 합니다. 

[root@ksp1 kube-ps1 (kubernetes-admin@cluster.local:default)]# vi ~/.kube/config
(생략)
contexts:
- context:
    cluster: cluster.local
    user: kubernetes-admin
  name: kube
current-context: kube

이제 클러스터 이름이(사실은 context 이름입니다.) kube로 줄여들어 훨씬 깔끔합니다. 

[root@ksp1 kube-ps1 (kube:default)]#

kctx, kns 설치

설치 방법 입니다. 공식 홈페이지 bash installation 가이드 그대로 따라 하시면 됩니다.

[root@ksp1 kube-ps1 (kube:default)]# git clone https://github.com/ahmetb/kubectx.git ~/.kubectx
ens
export PATH=~/.kubectx:\$PATH
FOE
Cloning into '/root/.kubectx'...
remote: Enumerating objects: 1400, done.
remote: Counting objects: 100% (115/115), done.
remote: Compressing objects: 100% (80/80), done.
remote: Total 1400 (delta 50), reused 57 (delta 32), pack-reused 1285
Receiving objects: 100% (1400/1400), 889.61 KiB | 0 bytes/s, done.
Resolving deltas: 100% (782/782), done.
[root@ksp1 kube-ps1 (kube:default)]# COMPDIR=$(pkg-config --variable=completionsdir bash-completion)
[root@ksp1 kube-ps1 (kube:default)]# ln -sf ~/.kubectx/completion/kubens.bash $COMPDIR/kubens
[root@ksp1 kube-ps1 (kube:default)]# ln -sf ~/.kubectx/completion/kubectx.bash $COMPDIR/kubectx
[root@ksp1 kube-ps1 (kube:default)]# cat << FOE >> ~/.bashrc
>
>
> #kubectx and kubens
> export PATH=~/.kubectx:\$PATH
> FOE

[root@ksp1 .kubectx (kube:default)]# source ~/.bashrc

이제 kubectx, kubens 사용 가능합니다.

[root@ksp1 .kubectx (kube:default)]# kubectx
kube
[root@ksp1 .kubectx (kube:default)]# kubens
default
kube-node-lease
kube-public
kube-system
metallb-system
nginx
postgresql

자동 완성 기능도 잘 됩니다. 

[root@ksp1 .kubectx (kube:default)]# kubens metallb-system
(tab 치시면 자동 완성 됩니다.)

[root@ksp1 .kubectx (kube:default)]# kubens metallb-system
Context "kube" modified.
Active namespace is "metallb-system".

이제 -n metallb-system 등의 namespace 추가 옵션 명령어 없이 바로 POD 현황 확인 가능합니다.

[root@ksp1 .kubectx (kube:metallb-system)]# kubectl get pod
NAME                          READY   STATUS    RESTARTS   AGE
controller-64f86798cc-dgtts   1/1     Running   0          11h
speaker-bwd8t                 1/1     Running   0          11h
speaker-f5wpz                 1/1     Running   0          11h
speaker-sfql8                 1/1     Running   0          11h

(개인 성향에 따라 kubectx, kubens 혹은 kctx, kns 사용하시면 됩니다. 다만 kctx, kns는 auto completion이 제대로 안되는 것 같습니다.)

 

K neat 

kube 운영 환경에서 현재 실행 중인 Object를 YAML 파일로 export 하는 일이 자주 있습니다. Helm Chart 에서 특정 부문만 변경하는 경우가 대표적입니다. 이 때 단순 -o yaml 옵션으로 YAML file export하면 설치와 관계 없는 정보도 같이 출력되어 번거롭습니다. 이 때 사용하는 툴이 k neat(단정한 정도 번역) 입다. 

 

관련 링크

https://github.com/itaysk/kubectl-neat

 

itaysk/kubectl-neat

Clean up Kubernetes yaml and json output to make it readable - itaysk/kubectl-neat

github.com

위 빨간 부문을 자동으로 삭제해 줍니다.

설치는 krew(동료 선원) 통해서 아주 간단히 가능합니다. 먼저, krew 설치를 진행 합니다.

참조 : https://github.com/kubernetes-sigs/krew/

 

kubernetes-sigs/krew

📦 Find and install kubectl plugins. Contribute to kubernetes-sigs/krew development by creating an account on GitHub.

github.com

[root@ksp1 ~ (kube:metallb-system)]# (
>   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/')" &&
>   curl -fsSLO "https://github.com/kubernetes-sigs/krew/releases/latest/download/krew.tar.gz" &&
>   tar zxvf krew.tar.gz &&
>   KREW=./krew-"${OS}_${ARCH}" &&
>   "$KREW" install krew
> )
++ mktemp -d
+ cd /tmp/tmp.qiw1z1Ot8j
++ 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
+ curl -fsSLO https://github.com/kubernetes-sigs/krew/releases/latest/download/krew.tar.gz
+ tar zxvf krew.tar.gz
./LICENSE
./krew-darwin_amd64
./krew-darwin_arm64
./krew-linux_amd64
./krew-linux_arm
./krew-linux_arm64
./krew-windows_amd64.exe
+ KREW=./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/.
 | /
/

[root@ksp1 ~ (kube:metallb-system)]# vi ~/.bashrc
export PATH="${KREW_ROOT:-$HOME/.krew}/bin:$PATH"
	(PATH 추가 합니다.)

[root@ksp1 ~ (kube:metallb-system)]# source ~/.bashrc
[root@ksp1 ~ (kube:metallb-system)]# 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.

이제, 설치가 완료 되었습니다. 사용 방법은 굉장히 직관적으로, k neat 명령어 앞에 | (파이프) 만 이용하시면 됩니다. 

[spkr@erdia22 ~ (kspray:metallb-system)]$ k get deployments.apps controller -o yaml |k neat > metallb-controller-deploy.yml

[spkr@erdia22 ~ (kspray:metallb-system)]$ cat metallb-controller-deploy.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "1"
  labels:
    app: metallb
    component: controller
(이하 생략)

YAML 파일이 훨씬 깔끔해(neat) 졌습니다.

 

kubetail

kubetail은 kube 환경에서 여러 POD의 로그를 동시에 조회하는 용도로 사용합니다. 유사한 기능으로 stern도 사용 가능하나 tail(tail -f 명령어와 동일) 이름이 좀 더 외우기 쉬워 저는 kubetail을 사용합니다.

 

참조 : https://github.com/johanhaleby/kubetail

 

johanhaleby/kubetail

Bash script to tail Kubernetes logs from multiple pods at the same time - johanhaleby/kubetail

github.com

Bash script that enables you to aggregate (tail/follow) logs from multiple pods into one stream. This is the same as running "kubectl logs -f " but for multiple pods.
공식 홈페이지

 설치는 간단합니다.

[root@ksp1 ~ (kube:metallb-system)]# git clone https://github.com/johanhaleby/kubetail.git
Cloning into 'kubetail'...
remote: Enumerating objects: 638, done.
remote: Counting objects: 100% (36/36), done.
remote: Compressing objects: 100% (29/29), done.
remote: Total 638 (delta 21), reused 16 (delta 7), pack-reused 602
Receiving objects: 100% (638/638), 134.88 KiB | 0 bytes/s, done.
Resolving deltas: 100% (352/352), done.

다운로드 한 kubetail 스크립트를 실행 경로 파일로 link 걸어 주시면 됩니다. 

[root@ksp1 kubetail (kube:metallb-system)]# ln -s /root/kubetail/kubetail /usr/local/bin/kubetail

이제, kubetail 명령어 실행이 가능합니다. 

[root@ksp1 kubetail (kube:metallb-system)]# kubetail
kubetail <search term> [-h] [-c] [-n] [-t] [-l] [-d] [-p] [-s] [-b] [-k] [-v] [-r] [-i] -- tail multiple Kubernetes pod logs at the same time

where:
    -h, --help              Show this help text
    -c, --container         The name of the container to tail in the pod (if multiple containers are defined in the pod).
                            Defaults to all containers in the pod. Can be used multiple times.
(생략)

자동 완성 기능을 추가합니다. $HOME/.bashrc 파일에 추가 합니다.

[root@ksp1 ~ (kube:metallb-system)]# vi ~/.bashrc
(생략)
source $HOME/kubetail/completion/kubetail.bash

[root@ksp1 kubetail (kube:metallb-system)]# source ~/.bashrc

이제 tab 사용하시면 자동 완성 기능을 사용하실 수 있습니다. 

[root@ksp1 kubetail (kube:metallb-system)]# kubetail speaker-*
Will tail 3 logs...
speaker-bwd8t
speaker-f5wpz
speaker-sfql8
[speaker-sfql8] {"caller":"announcer.go:114","error":"creating NDP responder for \"eth0\": listen ip6:ipv6-icmp fe80::f7f4:dd61:8a81:7b71%eth0: bind: cannot assign requested address","interface":"eth0","msg":"failed to create NDP responder","op":"createNDPResponder","ts":"2021-06-01T23:19:10.28883892Z"}
[speaker-sfql8] {"caller":"speakerlist.go:272","msg":"triggering discovery","op":"memberDiscovery","ts":"2021-06-01T23:19:15.070312439Z"}
[speaker-bwd8t] {"caller":"net.go:210","component":"Memberlist","msg":"[DEBUG] memberlist: Stream connection from=172.17.28.171:41414","ts":"2021-06-01T23:19:11.638543884Z"}

-n, Namespace 옵션을 사용하면 전체 POD 로그 확인이 가능합니다. (--since 옵션 사용하면 좀 더 편리하겠죠)

[spkr@erdia22 erdia (spkn01:metallb-system)]$ kubetail -n metallb-system --since 10s
Will tail 6 logs...
controller-7fc84d865b-2gnrp controller
controller-7fc84d865b-2gnrp linkerd-proxy
controller-7fc84d865b-2gnrp linkerd-init
speaker-7d4zm
speaker-s86sc
speaker-zlvjr
[speaker-zlvjr] {"caller":"net.go:210","component":"Memberlist","msg":"[DEBUG] memberlist: Stream connection from=172.17.16.153:54782","ts":"2021-04-03T19:09:25.388741996Z"}

grep 으로 한 번 더 filtering하면 좀 더 빠릅니다.

[spkr@erdia22 erdia (spkn01:metallb-system)]$ kubetail speaker-* |grep -i sender

이상 시간을 줄일 수 있는 몇가지 Tool들을 소개 드렸습니다. Kube 운영하다보면 편리한 툴들이 더 많이 있습니다. 조금씩 찾아보시면 많은 도움이 됩니다. 

반응형