TL; DR
- kubectl > 간편하게 실행할 수 있는 CLI 도구
- k9s > 동적으로 클러스터 상태를 확인하고, 명령어 실행가능한 TUI 도구
- OpenLens > 클러스터 전반적인 상황을 시각적으로 파악하기에 용이한 GUI 도구
1. Intro
쿠버네티스 클러스터를 제어할 때, 일반적으로 kubectl 이라는 CLI 명령어를 많이 활용한다.
쿠버네티스는 쿠버네티스 API를 사용하여, 쿠버네티스 클러스터의 컨트롤 플레인과 통신하기 위한 명령줄 도구를 제공하며, 그 도구의 이름은 kubectl이다.
Kubernetes provides a command line tool for communicating with a Kubernetes cluster’s control plane, using the Kubernetes API. This tool is named kubectl.
Command line tool (kubectl), k8s doc
pod / service / ingress 등과 같은 리소스의 상태를 파악하기위해 아래의 예시들과 같은 명령어를 사용해서 리소스의 정보를 확인 할 수 있다
- kubectl get pods
- kubectl describe service <service이름>
- kubectl edit ingress <ingress이름>
모든 명령어를 이렇게 full form으로 입력하는일은 번거롭다. 따라서 어느정도 숙련된 k8s오퍼레이터들은 kubectl을 k로 alias를 지정하거나, 자동완성을 사용하거나, api-resource에서 조회가능한 축약어(shortname)를 주로 활용하곤 한다
- Kubectl autocomplete
- alias k=kubectl
- source <(kubectl completion zsh)
- k api-resources
- k get po
- k describe svc <service이름>
- kubectl edit ing <ingress이름>
그럼에도 불구하고, 여전히 관리하는데 있어 kubectl을 활용하는것은 번거로운 구석이 있었다. 명령어 입력 > 출력으로 마무리 되기 때문에, 여러 명령어를 입력해야 할 경우 쉽지 않았기 때문이다.
예를 들어, deploy로 생성된 nginx 파드에 에러가 발생해서, 상태를 확인한 뒤, 로그를 확인한다는 시나리오를 가정해보자.
# image명에 에러가 있는 deployments 생성
k create deploy nginx --image=nginx123 --replicas=3
# pod 목록 확인
k get po
# NAME READY STATUS RESTARTS AGE
# nginx-59ff94c798-hl964 0/1 ErrImagePull 0 100s
# nginx-59ff94c798-tszxx 0/1 ImagePullBackOff 0 100s
# nginx-59ff94c798-v6p84 0/1 ImagePullBackOff 0 100s
# 파드 중 하나의 상태 describe 보기
k describe nginx (탭탭탭탭
k describe nginx-59ff94c798- (탭탭탭하다가 아무 해시값 선정)
k describe nginx-59ff94c798-h (탭하면 -hl964로 자동완성)
# 파드 중 하나의 logs 보기
k logs ngix (탭탭탭~ 위의 일련의 과정 반복, 기억하지 못하면 k get po부터 재시작)
테스트용으로 비어있는 default namespace 환경에서 파드를 생성했다면 불편하긴 하지만 이제 큰 문제인가?라는 생각을 했었다. 하지만 다른 ns의 리소스를 조회하기위해 -n <ns이름>을 누락한다던가, kube-system 과 같이 여러 컨트롤러가 있는 ns에 대한 제어가 필요한 상황에서는, 조금더 우아한 방법이 없을까라는 고민을 했다.
그 과정에서, ohmyzsh alias / k9s / open lens등의 도구를 테스트 해보았었다. 각 도구별 설치방법과 사용 후기, 장단점등을 살펴고자 한다.
2. ohmyzsh alias
2019년 10월 7일 macOS 카탈리나부터, 기본쉘이 bash에서 zsh로 변경되었다. zsh을 그대로 써도되지만, 테마/플러그인등 추가설정을 위해 ohmyzsh을 사용하고 있다.
구글/네이버에 ohmyzsh 플러그인으로 검색하면 일반적으로 3~4개의 플러그인들 (autojump,autosuggestions,syntax-highlighting,etc)등이 추천되지만, 다른 플러그인들은 없나 하면서 ohmyzsh의 깃헙을 뒤져봤고, plugins 페이지를 발견하였으며, kubectl 플러그인을 발견하였다.
별도 설치과정이 필요하지않고, ~/.zshrc 파일의 plugin부분에 kubectl 만 추가한 뒤 쉘을 리로드하면 적용이 완료된다. kubectl에서 자주 사용되는 명령어들을 alias로 등록해준다
- Plugin README
- k get pods > kgp
- k get pods -A > kgpa
- k get all > kga
- k get all -A > kgaa
- k apply -f sample.yaml > kaf sample.yaml
- k config set-context –current –namespace > kcn
- etc..
장단점
- 설치가 간편함
- 별도 brew install / git clone 할 필요 없이 zshrc 변경만으로 적용 가능
- 입력해야하는 키/스페이스바 감소
- 명령어 단어 사이사이를 다 붙여버렸기 때문에 금방 슥슥 입력가능
- kdeld <deploy명>;kgpw (k delete deploy <deploy명>;k get pod -w)
- 쓰기전엔 모르는데 쓰다 안쓰면 확실히 장점임을 체감함
- 단순한 kubectl의 alias 집합
- 결국 명령어를 치고, 결과를 보고, 다시 명령어를 입력하는 정적인 방식엔 변화 X
3. k9s
K9s는 Kubernetes 클러스터와 상호 작용할 수 있는 터미널 UI를 제공합니다. 이 프로젝트의 목표는 클러스터의 애플리케이션을 더 쉽게 탐색, 관찰 및 관리할 수 있도록 하는 것입니다. k9s는 지속적으로 Kubernetes의 변경 사항을 감시하고 관찰된 리소스와 상호 작용할 수 있는 후속 명령을 제공합니다.
K9s provides a terminal UI to interact with your Kubernetes clusters. The aim of this project is to make it easier to navigate, observe and manage your applications in the wild. K9s continually watches Kubernetes for changes and offers subsequent commands to interact with your observed resources.
k9s github
kubectl은 k8s의 CLI였다면, k9s는 k8s의 TUI이다. text기반 UI를 제공하여, 명령어 입력 대신 터미널에서, 동적으로 클러스터 관리가 가능하다.
k9s 설치
공식문서의 Installation 페이지 참조 바람
- binary
- github의 releases에서 OS/아키텍쳐별 바이너리 파일을 받을 수 있다.
- MacOS
- brew를 통해 간단히 설치가 가능하다
- brew install derailed/k9s/k9s
k9s 사용법
- 기본적으로 방향키/hjkl로 네비게이션
- 숫자키 (0/1/2/…)를 통해 namespace 전환
- d(describe)/e(edit)/l(logs)/s(shell) 등으로 파드에 대한 제어
- shift+<각 열(column)의 첫번째 글자>로 정렬
- shift+n > 이름(Name) 순 정렬
- shift+c/m > CPU/Memory 순 정렬
- shift+a > 생성시간(Age) 순 정렬
- :+<리소스명>으로 조회하는 리소스 변경
- k api-resource의 축약어 사용가능
- :svc > service 조회
- :pvc > PersistentVolumeClaim 조회
- ?로 도움말 확인
- 상세한 명령어 설명은 공식문서의 commands 페이지 참조
k9s Views
일반적인 관리화면외에도, 시각화된 현황을 보여주는 pulse, tree형식으로 리소스를 보여주는 xray, 보안스캔결과인 popeye 화면을 제공해준다.
- pulse (pu)
- :pulse 또는 :pu로 진입
- 간단한 리소스 시각화를 해준다
- k top 명령어와 비슷하게, 작동에는 Metrics API 설치가 필요하다
- xray
- :xray <리소스명>으로 진입
- 특정 리소스에 대해서, ns/dependancy에 따라 관련있는 리소스들을 tree 형식으로 보여준다
- pods를 기준으로본다면, ns별 파드들과, 연관 cm,secret,sa등을 종합적으로 볼 수 있다.
- popeye
- :popeye 또는 :pop으로 진입
- 클러스터 취약점 진단 및 점수화하여 보여준다
- resource limit / probe / security context / etc …
장단점
- 동적인 클러스터 제어
- 매번 kgp / kgd / kgs / kgaa 로 리소스명 확인하고 명령어를 작성할 필요없이, 네비게이션과 몇개 단축키로 간단히 원하는 명령어 결과를 실행할 수 있다.
- 깔끔한 색상 시각화
- cli의 결과는 기본색으로 출력
- 정상/비정상이나 에러로그 등에서 색깔 출력이 지원되서, 가시성 향상
- 로그조회시 autoscroll/wrap 지원
- 프로그램 시작 과정을 거쳐야한다는 점은 다소 불편
- 명령어로 바로 결과를 볼 수 있는 cli와 달리, 일단 k9s로 실행 후 사용
- k9s -c pod / k9s -c ing 등으로 바로 들어갈 순 있기는 함
4. OpenLens
kubectl은 CLI고, k9s는 TUI다. 그렇다면 이번에 소개할 OpenLens(Lens IDE)는 k8s 클러스터 관리에 대한 GUI라고 할 수 있겠다.
Lens Desktop은 Linux, macOS 및 Windows에서 사용할 수 있는 독립 실행형 애플리케이션입니다. Lens Desktop을 사용하면 다음과 같은 몇 가지 이점이 있습니다:
- 클러스터가 올바르게 설정 및 구성되었다는 확신
- 향상된 가시성, 실시간 통계, 로그 스트림 및 문제 해결 기능.
- 클러스터를 빠르고 쉽게 작업할 수 있어 생산성과 비즈니스 속도를 획기적으로 개선
Lens Desktop is a standalone application available on Linux, macOS, and Windows. Here are a few advantages of using Lens Desktop:
Welcome to Lens, Lens Documentation
- Confidence that your clusters are properly set up and configured.
- Increased visibility, real-time statistics, log streams, and hands-on troubleshooting capabilities.
- The ability to work with your clusters quickly and easily, radically improving productivity and the speed of business.
OpenLens vs Lens IDE
Lens IDE는 Team Lens (Mirantis)가 개발중인 상용 Kubernetes IDE이다. 대표적인 Lens Desktop외에도 Lens Teamwork, Lens Security Center등 협업, 보안등에 대한 추가적인 기능을 제공한다.
그러나 상용제품인만큼, 구독형 요금제가 존재한다.
- Lens Personal (Free)
- Lens Desktop, Community Forums 사용 가능
- 연 천만달러 이하의 투자금/매출일 것
- Lens Pro (Subscribe)
- Lens의 모든 기능 사용 가능
- 인당 월 19.9달러 / 연 199달러
OpenLens는 Lens IDE의 Core 부분이며, MIT License의 적용하에 오픈소스로 제공되고있다. Core/OSS인만큼 일부 기능이 누락되어있으나, 확장기능등을 통해 보완이 가능하다.
OpenLens 설치
GitHub의 Installation 참고
- Binary 설치
- Github의 Releases에서 OS/아키텍쳐별 바이너리 파일을 받을 수 있다.
- MacOS
- brew 명령어를 통해 간단히 설치 가능
상용판인 Lens와는 다르게, OpenLens에는 파드 로그, 쉘 진입등의 추가 기능이 제한되어있다. 해당기능의 사용을 위해서는 유저 플러그인의 적용이 필요하다
# --- Node, Pod 관련 추가기능 설치
# command+shift+e > 추가기능 설치 페이지
# @alebcay/openlens-node-pod-menu 검색 후 설치
# (설치시 enabled disable 계속 깜박이는 이슈 존재. 앱 재시작으로 해결)
OpenLens 사용법
GUI인만큼 좌측 사이드 바를 기준으로, 눌러보다보면 금방 사용법을 확인할 수 있다.
- Cluster
- 클러스터 전반적인 Metric과 Events 조회가 가능하다.
- k8s와 별개로, EKS에서는 노드별 Max Pod 제한이 존재한다. 해당 제한에 맞춘 현재/최대파드 수에 대한 지표도 만족
- Nodes
- 개별 노드의 부하상태와 Condition등을 확인 할 수 있다.
- 추후 반복되겠지만, 개별 리소스명을 클릭하면, describe 결과값 처럼 해당 리소스의 상세 정보를 조회 가능하다
- 또한 우측상단의 아이콘을 통해 node shell, cordon, drain, edit, delete등이 가능하다
- 카테고리화 된 각종 리소스들
- Workloads > po, deploy, ds, sts, rs, etc..
- Config > cm, secrets, etc…
- Network > svc, ep, ing, netplo, etc..
- Storage > pvc, pv, sc
- …
- 노드와 유사하게, 리소스 클릭시 describe 화면을 볼 수 있고, 상단의 아이콘을 통해 추가 조작이 가능하다
- 추가적으로 Helm 탭을 통해 차트와 헬름으로 배포된 앱을 관리하는 부분도 인상적이였다.
Metric 지표를 연결하는 방법
Why I don’t see any metrics or some of the metrics are not working?
OpenLens의 metrics은 Prometheus를 통해 수집되고, 보여진다. 따라서 클러스터에 프로메테우스가 구성되어있지않다면 메트릭의 조회가 불가능하다.
SETTINGS > Metrics 진입 시, Auto Detect Prometheus로 설정되어있어 기본적으로 프로메테우스가 배포되어있다면 자동적으로 감지해서 연결을 해준다.
Lens IDE의 경우, Prometheus가 배포되어있지 않다면 Builtin Metrics Provider를 통해 토글버튼으로 간단히 배포할 수 있다. OpenLens는 해당 메뉴가 존재하지않지만, helm등을 통해 간단히 배포할 수 있다. 프로메테우스의 배포판?은 여러 버전이 있지만 helm의 kube-state-metrics을 통해 배포하였다.
다만 배포하였는데도 제대로 표출이 안될경우,
SETTINGS > Metrics > Prometheus Operator 선택 및 PROMETHEUS SERVICE ADDRESS에 prometheus의 service 경로를 <namespace>/service:port 형식으로 (monitoring/prometheus-kube-prometheus-prometheus:9090) 입력하여 연동이 가능하다
ControlPlane(kube-APIserver)가 node의 9090포트에 접근이 가능한지 보안그룹을 확인할 것
장단점
- 클러스터의 전반적인 리소스 확인 가능
- k8s를 처음 공부할때, 막막했던것이 어떤 리소스들이 있고, 일부는 describe가 되고, 일부는 edit만 가능하여 혼란스러웠음
- 좌측 사이드바를 통해 접근 가능한 모든 리소스를 조회할 수 있음 (심리적안도감)
- events / metric을 파악 용이
- 각 화면별로, events, metric, status가 시각화되어 쉽게 확인 가능
- cli,tui는 결국 그 명령어/화면을 입력해야 조회가능 / 간단히 클릭으로 확인 가능
- 리소스 이름 클릭시 describe에서 조회되는 정보가 더 정리되어 나옴
- 실제 리소스 edit등 제어에는 부정적
- IDE인 만큼 리소스의 edit 버튼 클릭시 터미널 창+yaml이 열리긴하지만..
- 보통 클러스터 자체 리소스를 수동 변경하는 일은 잘 없음 > gitops
- 해당 리소스를 생성하는데 사용한 manifest, helmvalue yaml은 별도 IDE에서 편집하기 때문에 주로 조회용도로만 사용 중
5. Outro
유사한 명령어를 여러번 쓰기 귀찮다는 이유로 여러 k8s 클러스터 관리 도구를 찾아보았다.
이 3 도구 중 무엇을 쓰느냐..하면 상황에 따라서 3가지 모두를 자주 쓰고 있다
- 간단히 클러스터 상황을 조회할때
- k alias 명령어들 (kgd / kgi / kgaa / …)
- 상태 describe가 필요하거나, logs등을 찬찬히 살펴보아야할때
- k9s
- 문제 원인을 감도 못잡고, 전체적인 events등 상황을 확인할때
- openlens