Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

Kubernetes 운영에 사용하던 Lens 대체제로 찾은 k9s

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가 가장 괜찮은 대안으로 보였다.

k9s 홈페이지

업무에서 더 사용해 봐야 확실하긴 한데 OpenLens의 기능 제한이 앞으로 어찌 될지 확실치 않아서 OpenLens도 같이 쓰면서 k9s를 손에 익혀보려고 한다.

k9s

k9s는 터미널에서 Kubernetes 클러스터를 관리할 수 있는 CLI 도구이다. kubectl도 같이 사용할 수 있어서 같은 컨텍스트에서 kubectlk9s를 오가면서 사용할 수 있는 것도 장점으로 보인다.

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나 클러스터, 네임스페이스를 지정할 수도 있지만 터미널의 현재 설정을 따라갈 테니 그냥 실행해도 된다. 실행되면 다음과 같은 화면이 나온다.

k9s pod 목록

Lens처럼 많은 메뉴가 있던 UI에 비해 간단해서 처음엔 어떻게 쓰는 건가 싶지만 하나씩 눌러보다 보면 생각보다 복잡하진 않다. (내가 터미널 폰트를 크게 써서 그런지 화면이 좀 깨진다. ㅠ)

상단에도 간단한 키 안내가 있지만 ?를 누르면 사용할 수 있는 키를 확인할 수 있다.

k9s 단축키

위 화면은 Pod을 보는 화면인데 0을 누르면 모든 네임스페이스의 Pod을 보여주고 1을 누르면 default 네임스페이스의 팟을 보여준다. j, k, h, l로 상하좌우를 이동할 수 있다.(VI를 쓰면 더 익숙하게 쓸 수 있는 느낌이다.)

원하는 Pod에서 d를 누르면 describe가 실행되어 YAML을 아래처럼 볼 수 있다.

k9s Pod의 YAML describe

아래 보면 pod - describe로 되어 있는데 단계가 하나씩 들어간 거고 ESC를 누르면 다시 이전 화면으로 돌아갈 수 있다.

k9s 필터 모드

/term은 필터 모드인데 /STATUS라고 입력하면 위에 필터 모드가 활성화되면서 화면에서 해당 부분을 필터링해준다. 여기서는 YAML에서 검색했지만, 리스트에서도 필터링할 수 있다.

POD 리스트에서 e를 누르면 VI가 연결되면서 YAML을 바로 수정할 수 있고 s를 누르면 Shell로 접속할 수 있다. 상황마다 조금씩 명령어는 다르겠지만 모든 기능이 이런 식으로 연결되어 있다.

k9s 목록의 아이템 선택

스페이스를 누르면 선택을 할 수 있고 ctrl + d처럼 삭제 명령을 누르면 선택된 Pod에 대해 적용된다. 위에서는 선택된 2개의 Pod를 지울 것인지를 묻고 있다. 선택한 목록은 ctrl + \로 초기화할 수 있다.

지금까지 Pod 목록만 봐서 다른 리소스는 어떻게 보나 궁금할 수 있는데 이는 :cmd 형태의 명령어 모드를 사용하면 된다.

k9s 커맨드 모드로 deploy 선택

위는 :deploy를 입력해서 디플로이먼트만 보게 이동하는 화면이다. 명령어의 앞부분만 입력하면 자동으로 완성된다.

k9s의 deployment 목록

아까완 달리 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를 실행하면 스킨이 적용된 걸 볼 수 있다.

solarized_light 스킨이 적용된 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와 같이 사용하면서 익숙해져 봐야겠다

2023/01/22 19:16 2023/01/22 19:16