Lens는 Kubernetes 클러스터를 관리할 수 있는 데스크톱 애플리케이션이다. kubectl
도 쓰고 있지만 상태를 살펴보거나 할 때는 Lens가 편한 기능을 많이 제공하고 UI도 깔끔해서 Lens를 사용하고 있었다. 오픈소스 프로젝트이지만 2020년 Mirantis가 Lens를 인수했다.(참고로 Mirantis는 Docker 엔터프라이즈 사업을 인수한 회사다.)
작년 7월 Lens Personal과 Lens Pro로 나누어진 새 구독 모델을 발표하게 된다. Lens가 상당히 깔끔한 UI를 제공하는 점을 생각하면 어느 정도 수긍이 간다. Lens Personal은 무료 플랜으로 개인이나 교육용으로 사용할 수 있고 연매출이나 투자 금액이 천만 달러가 안 되는 스타트업에서도 사용할 수 있다. 자격은 본인이 확인하고 Lens Personal에서 CONFIRM
을 입력하면 가입할 수 있다. Lens Pro는 월 $19.9로 Lens Desktop뿐 아니라 Teamwork나 Security 같은 Lens의 다른 제품도 같이 쓸 수 있다.
오픈소스 프로젝트라서 핵심 부분은 OpenLens로 배포하고 있고 OpenLens 바이너리 저장소에서 빌드된 버전을 다운로드 받을 수 있다. 히스토리를 자세히는 몰라서 처음에는 따로 빌드를 만들어내나 했더니 OpenLens를 제공하는 것도 Lens팀의 약속이고 이러한 저장소는 바이너리 빌드만 제공하는 것뿐이다. 다만 OpenLens 6.3.0부터는 팟에 쉘로 접근하거나 로그를 볼 수 있는 기능이 없어졌다.(Lens Personal에서는 사용할 수 있는데 계속될 예정인지는 잘 모르겠다.)
개인 용도에서는 Lens Personal를 사용할 수 있지만 업무상으로는 Lens의 대안을 찾다 보니 OpenLens를 사용해 보고 있었다.(좋은 앱이라 구매를 해도 되긴 하지만 Kubernetes 관리가 주 업무는 아니라서 구매까지 하긴 애매했다.) 사용해보니 6.3.0에서 버그도 있고 쉘과 로그가 안 되는 문제(물론 익스텐션을 설치하면 사용할 수 있다고 한다.)도 있어서 다른 대안을 찾기 시작했다.
- Aptakube는 UI는 깔끔해 보였지만 지금만 무료고, 곧 유료로 가격 플랜도 나와 있어서 보지 않았다.(결제할 거면 Lens를 결제하는 게 나아서...)
- Octant는 1월 20일 기준으로 VMware에서 개발 중단을 발표했기에 살펴보지 않았다.
- KDash는 Rust로 작성된 터미널 앱인데 터미널 앱이면 사용자층이 더 많은 k9s가 더 나을 것 같아서 자세히 보지 않았다.(나중에 좀 더 살펴볼지 모르겠다..)
- Headlamp는 UI가 이쁘지는 않았지만, 기능은 꽤 있는 거 같아서 보려고 했지만 내가
kubeconfig
을 이상하게 관리하는지 Headlamp에서는 로드되지 않고 다른 로딩 방법을 못 찾아서 살펴보지 못했다.
아무래도 UI를 만드는 데는 비용이 많이 들어서 그런지 Lens에 버금가는 대안은 찾기 어려웠고(그나마 OpenLens에서 방법을 찾아봐야 할 듯...) 주변 사람도 많이 쓰는 터미널에서 클러스터를 관리할 수 있는 k9s가 가장 괜찮은 대안으로 보였다.
업무에서 더 사용해 봐야 확실하긴 한데 OpenLens의 기능 제한이 앞으로 어찌 될지 확실치 않아서 OpenLens도 같이 쓰면서 k9s를 손에 익혀보려고 한다.
k9s
k9s는 터미널에서 Kubernetes 클러스터를 관리할 수 있는 CLI 도구이다. kubectl
도 같이 사용할 수 있어서 같은 컨텍스트에서 kubectl
과 k9s
를 오가면서 사용할 수 있는 것도 장점으로 보인다.
masOS, Linux, Windows에서 설치할 수 있는데 난 릴리스 페이지에서 다운로드받아서 PATH
에 넣어서 사용했다.(현재 최신 버전은 v0.26.7이다.)
$ k9s version
____ __.________
| |/ _/ __ \______
| < \____ / ___/
| | \ / /\___ \
|____|__ \ /____//____ >
\/ \/
Version: v0.26.7
Commit: 37569b8772eee3ae29c3a3a1eabb34f459f0b595
Date: 2022-10-18T15:02:30Z
k9s help
로 사용할 수 있는 명령어와 옵션을 볼 수 있다.
$ k9s help
K9s is a CLI to view and manage your Kubernetes clusters.
Usage:
k9s [flags]
k9s [command]
Available Commands:
completion Generate the autocompletion script for the specified shell
help Help about any command
info Print configuration info
version Print version/build info
Flags:
-A, --all-namespaces Launch K9s in all namespaces
--as string Username to impersonate for the operation
--as-group stringArray Group to impersonate for the operation
--certificate-authority string Path to a cert file for the certificate authority
--client-certificate string Path to a client certificate file for TLS
--client-key string Path to a client key file for TLS
--cluster string The name of the kubeconfig cluster to use
-c, --command string Overrides the default resource to load when the application launches
--context string The name of the kubeconfig context to use
--crumbsless Turn K9s crumbs off
--headless Turn K9s header off
-h, --help help for k9s
--insecure-skip-tls-verify If true, the server's caCertFile will not be checked for validity
--kubeconfig string Path to the kubeconfig file to use for CLI requests
--logFile string Specify the log file (default "/var/folders/y3/4dg4vpy52r7fr167z8wzq6700000gn/T/k9s-outsider.log")
-l, --logLevel string Specify a log level (info, warn, debug, trace, error) (default "info")
--logoless Turn K9s logo off
-n, --namespace string If present, the namespace scope for this CLI request
--readonly Sets readOnly mode by overriding readOnly configuration setting
-r, --refresh int Specify the default refresh rate as an integer (sec) (default 2)
--request-timeout string The length of time to wait before giving up on a single server request
--screen-dump-dir string Sets a path to a dir for a screen dumps
--token string Bearer token for authentication to the API server
--user string The name of the kubeconfig user to use
--write Sets write mode by overriding the readOnly configuration setting
Use "k9s [command] --help" for more information about a command.
k9s 사용 방법
터미널에서 k9s
명령어를 실행하면 바로 실행할 수 있다. 실행할 때 옵션으로 kubeconfig
나 클러스터, 네임스페이스를 지정할 수도 있지만 터미널의 현재 설정을 따라갈 테니 그냥 실행해도 된다. 실행되면 다음과 같은 화면이 나온다.
Lens처럼 많은 메뉴가 있던 UI에 비해 간단해서 처음엔 어떻게 쓰는 건가 싶지만 하나씩 눌러보다 보면 생각보다 복잡하진 않다. (내가 터미널 폰트를 크게 써서 그런지 화면이 좀 깨진다. ㅠ)
상단에도 간단한 키 안내가 있지만 ?
를 누르면 사용할 수 있는 키를 확인할 수 있다.
위 화면은 Pod을 보는 화면인데 0
을 누르면 모든 네임스페이스의 Pod을 보여주고 1
을 누르면 default
네임스페이스의 팟을 보여준다. j
, k
, h
, l
로 상하좌우를 이동할 수 있다.(VI를 쓰면 더 익숙하게 쓸 수 있는 느낌이다.)
원하는 Pod에서 d
를 누르면 describe가 실행되어 YAML을 아래처럼 볼 수 있다.
아래 보면 pod - describe로 되어 있는데 단계가 하나씩 들어간 거고 ESC
를 누르면 다시 이전 화면으로 돌아갈 수 있다.
/term
은 필터 모드인데 /STATUS
라고 입력하면 위에 필터 모드가 활성화되면서 화면에서 해당 부분을 필터링해준다. 여기서는 YAML에서 검색했지만, 리스트에서도 필터링할 수 있다.
POD 리스트에서 e
를 누르면 VI가 연결되면서 YAML을 바로 수정할 수 있고 s
를 누르면 Shell로 접속할 수 있다. 상황마다 조금씩 명령어는 다르겠지만 모든 기능이 이런 식으로 연결되어 있다.
스페이스를 누르면 선택을 할 수 있고 ctrl + d
처럼 삭제 명령을 누르면 선택된 Pod에 대해 적용된다. 위에서는 선택된 2개의 Pod를 지울 것인지를 묻고 있다. 선택한 목록은 ctrl + \
로 초기화할 수 있다.
지금까지 Pod 목록만 봐서 다른 리소스는 어떻게 보나 궁금할 수 있는데 이는 :cmd
형태의 명령어 모드를 사용하면 된다.
위는 :deploy
를 입력해서 디플로이먼트만 보게 이동하는 화면이다. 명령어의 앞부분만 입력하면 자동으로 완성된다.
아까완 달리 Pod가 아니라 Deployment가 출력되는 것을 볼 수 있다. 다른 리소스를 확인할 때도 명령어 모드를 사용할 수 있고 명령어 모드가 리소스를 선택하는 건에만 쓰이는 건 아니라 k9s를 종료하려면 :q
나 :quit
를 입력하면 된다.
스킨 적용
터미널이지만 스킨을 사용해서 자신이 원하는 대로 커스터마이징할 수 있다. 문서에 따르면 $XDG_CONFIG_HOME/k9s/skin.yml
이 기본 스킨 파일이 된다.(기본으로는 이 파일이 없다) 직접 만들 수도 있지만 k9s/skins에 다양한 스킨이 있으므로 다운받아 쓸 수 있다. $XDG_CONFIG_HOME
위치는 그냥 k9s info
에서 Configuration
을 보면 된다.
$ k9s info
____ __.________
| |/ _/ __ \______
| < \____ / ___/
| | \ / /\___ \
|____|__ \ /____//____ >
\/ \/
Configuration: /Users/outsider/Library/Application Support/k9s/config.yml
Logs: /var/folders/y3/4dg4vpy52r7fr167z8wzq6700000gn/T/k9s-outsider.log
Screen Dumps: /var/folders/y3/4dg4vpy52r7fr167z8wzq6700000gn/T/k9s-screens-outsider
solarized_light.yml 파일을 /Users/outsider/Library/Application Support/k9s/skin.yml
로 저장하고 다시 k9s
를 실행하면 스킨이 적용된 걸 볼 수 있다.
skin.yml
은 k9s에서 기본으로 사용하는 스킨 파일이 된다. 클러스터별로 다른 스킨을 적용하고 싶다면 CLUSTERNAME_skin.yml
로 지정하면 된다. 위 예시에서 클러스터 이름이 playground
이므로 playground_skin.yml
파일을 만들면 해당 클러스터에 접속할 때는 이 스킨이 적용된다. 알파나 프로덕션 별로 다른 스킨을 적용해 놓는다면 사용할 때 실수할 여지를 줄일 수 있을 걸로 보인다.
설정
위 k9s info
에서 k9s/config.yml
라는 Configuration 파일이 있는 걸 보았는데 이 파일은 아래처럼 생겼다. 여기서 k9s 설정을 할 수 있는데 각 옵션의 자세한 내용은 문서에서 확인할 수 있다.
k9s:
refreshRate: 2
maxConnRetry: 5
enableMouse: false
headless: false
logoless: false
crumbsless: false
readOnly: false
noExitOnCtrlC: false
noIcons: false
logger:
tail: 100
buffer: 5000
sinceSeconds: 60
fullScreenLogs: false
textWrap: false
showTime: false
currentContext: playground
currentCluster: playground
clusters:
playground:
namespace:
active: all
lockFavorites: false
favorites:
- all
- default
view:
active: deploy
featureGates:
nodeShell: false
shellPod:
image: busybox:1.35.0
command: []
args: []
namespace: default
limits:
cpu: 100m
memory: 100Mi
portForwardAddress: localhost
thresholds:
cpu:
critical: 90
warn: 70
memory:
critical: 90
warn: 70
screenDumpDir: /var/folders/y3/4dg4vpy52r7fr167z8wzq6700000gn/T/k9s-screens-outsider
예를 들어 logoless: true
로 설정하면 우측 상단에 나오던 k9s 로고를 없앨 수 있다.
각 리소스 목록에서 나오던 칼럼도 커스터마이징할 수 있는데 문서에서 처럼 $XDG_CONFIG_HOME/k9s/views.yml
파일에 자원별로로 칼럼을 정의하면 원하는 값을 쉽게 볼 수 있다.
k9s:
views:
# Alters the pod view column layout. Uses GVR as key
v1/pods:
columns:
- AGE
- NAMESPACE
- NAME
- IP
- NODE
- STATUS
- READY
# Alters the service view column layout
v1/services:
columns:
- AGE
- NAMESPACE
- NAME
- TYPE
- CLUSTER-IP
처음 k9s를 보았을 때는 Lens를 대체할 수 없을 것 같았는데 기능을 살펴보니 점점 맘에 들고 있다. 실무에서 사용해 봐야겠지만 익숙해 지면 상당히 빠르게 오퍼레이션을 할 수 있을 걸로 보인다. OpenLens와 같이 사용하면서 익숙해져 봐야겠다
Comments