k8s 노드에 접속하기(+ AKS 노드에 접속하기)
목차
k8s에 대해서 스터디하거나 서비스를 배포하다 보면 가끔 워커 노드에 접속해야 할 때가 있습니다. 예를 들면 pod에서 DB나 Redis 등에 제대로 접속하지 못할 때 혹시 네트워크에 문제 있는지 확인하거나 워커 노드의 로그 등을 수집할 때 해당 로그의 위치가 어디인지 등을 확인해야 할 때가 있습니다.
이럴 때 노드에 접속할 수 있는 몇 가지 방법을 알아보겠습니다.
k9s 사용하기⌗
k9s 설치하기⌗
k9s는 k8s 클러스터를 쉽게 관리할 수 있는 터미널 기반의 UI 도구입니다. k9s를 사용하면 k8s 클러스터의 상태를 실시간으로 확인하고, 리소스를 생성하거나 삭제할 수 있습니다. 또한 k8s 클러스터의 로그를 확인하거나, 특정 pod에 쉘로 접속하는 등의 작업을 쉽게 수행할 수 있습니다. 그래픽 환경이 아니라 처음엔 어색할 수 있지만, 익숙해지면 훨씬 빠르게 작업할 수 있습니다.
k9s는 다음과 같이 설치할 수 있습니다.
# MacOS
> brew install derailed/k9s/k9s
# Ubuntu(linuxbrew)
> brew install derailed/k9s/k9s
# Windows
> scoop install k9s
그리고 k9s를 실행하면 됩니다.
k9s로 노드에 접속하기⌗
k9s에서 :pod 명령으로 pod를 선택하고 s를 누르면 해당 pod에 쉘로 접속할 수 있습니다. 그런데 :node 명령으로 노드 목록을 표시해보면 노드에는 쉘로 접속할 수 있는 s 옵션이 표시되지 않습니다. 클러스터의 설정 파일을 찾아서 해당 클러스터에 대해서 쉘을 사용할 수 있도록 설정해줘야 합니다.
클러스터 설정 파일을 찾으려면 다음 명령을 실행합니다.
> k9s info
____ __.________
| |/ _/ __ \______
| < \____ / ___/
| | \ / /\___ \
|____|__ \ /____//____ >
\/ \/
Version: v0.32.5
Config: /Users/onlifecoding/Library/Application Support/k9s/config.yaml
...
Config 항목에 표시되는 경로에 이동하면 clusters 폴더가 있고, 이 폴더에는 k9s로 접속한 적이 있는 k8s 클러스터의 설정 파일이 각 폴더 별로 저장되어 있습니다.
쉘로 접속하려는 클러스터의 폴더로 이동해서 config.yaml 파일의 nodeShell 항목을 true로 변경하면 됩니다.
k9s:
cluster: aks-test-stg
namespace:
active: default
lockFavorites: false
favorites:
- default
view:
active: node
featureGates:
nodeShell: true # 노드에 쉘 접근 허용하기
portForwardAddress: localhost
그리고 다시 k9s에서 :node 명령을 실행하면 노드에 쉘로 접속할 수 있는 s 옵션이 표시됩니다. 해당 노드를 선택하고 s를 누르면 노드에 pod이 배포되고, 해당 pod로 노드의 네트워크 통신 등을 테스트 할 수 있습니다.
참고로, 생성되는 pod는 앞서 k9s info로 확인했던 Config 파일에 설정되어 있으며, 기본 값은 이렇습니다.
---
shellPod:
image: busybox:1.35.0
namespace: default
limits:
cpu: 100m
memory: 100Mi
이 방법은 매우 간단하긴 하지만 노드 자체에는 접근할 수 없다는 단점이 있습니다.
AKS 노드에 접속하기⌗
AKS에서는 kubectl debug를 통해 노드에 접속할 수 있습니다.
우선 k9s나 kubectl을 통해 노드의 이름을 확인합니다.
> kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
aks-default-28123321-vmss000000 Ready <none> 18m v1.29.7 10.224.0.4 <none> Ubuntu 22.04.4 LTS 5.15.0-1071-azure containerd://1.7.20-1
그리고 접속하려는 노드의 이름을 사용하여 kubectl debug 명령을 실행합니다.
> kubectl debug node/aks-default-28123321-vmss000000 -it --image=mcr.microsoft.com/cbl-mariner/busybox:2.0
Creating debugging pod node-debugger-aks-default-28123321-vmss000000-2jj6t with container debugger on node aks-default-28123321-vmss000000.
If you don't see a command prompt, try pressing enter.
/
노드에 debug용 pod이 생성되고, 해당 pod에 접속되었습니다. 이제 다음 명령으로 node에 접근할 수 있습니다.
> chroot /host
노드에서 확인작업을 마치고 exit 빠져나오면, pod은 종료되지만 삭제되지 않고 남아있는데요, k9s에서 ctrl + d를 눌러 삭제하거나 kubectl delete pod 명령으로 삭제할 수 있습니다.
> kubectl delete pod node-debugger-aks-default-28123321-vmss000000-2jj6t
혹시 클라우드 프로바이더에 상관없이 노드에 접속하는 방법은?⌗
마지막으로 kubectl-plugins를 이용하는 방법이 있습니다. 이 방법은 클라우드 프로바이더에 상관없이 노드에 접속할 수 있는 방법인데요, 클러스터의 어드민 권한이 필요합니다.