Kubernetes

[k8s] node-shell - node 접근하기

비번변경 2023. 12. 27. 00:32

개요

AWS EKS 환경에서 서비스를 운영하면서 간혹 문제상황이 발생한 경우 Pod 뿐만 아니라 Worker Node에 직접 접속해 상태를 확인할 필요가 있었다. 하지만 Worker Node에서 SSH 접속을 허용하고 있지 않아 접속할 수 있는 방법이 없었는데, Worker node 접속 기능을 제공하는 kubectl 플러그인을 확인하여 사용 방법을 정리해두려고 한다.

 

node-shell로 EKS 클러스터 노드에 접속할 수 있는지는 확인해봐야 한다! 이 글에서는 사용 방법 정도만 정리해둔다.

 

 

node-shell

kubectl-enter로도 알려진 kubectl node-shell은 node의 호스트 OS에서 root shell을 시작한다.

간단히 말해 node에 명령어를 실행할 수 있는 shell을 제공하거나 명령어를 실행한 결과를 출력한다.

 

 

설치 방법

Github : https://github.com/kvaps/kubectl-node-shell

kubectl 플러그인 관리자인 krew를 이용하거나 github에서 바이너리를 직접 다운로드하여 설치할 수 있다. 참고로 kubectl 하위 명령어로 동작하기 때문에 kubectl이 먼저 설치되어 있어야 한다.

 

krew 

kubectl krew index add kvaps https://github.com/kvaps/krew-index
kubectl krew install kvaps/node-shell

 

바이너리 직접 설치

curl -LO https://github.com/kvaps/kubectl-node-shell/raw/master/kubectl-node_shell
chmod +x ./kubectl-node_shell
sudo mv ./kubectl-node_shell /usr/local/bin/kubectl-node_shell

이 글에서는 바이너리로 직접 설치해 보았다.

 

 

사용법

기본적인 사용법은 node-shell 명령어로 접속할 노드 이름을 지정하는 것이다.

kubectl node-shell <NODE_NAME>

# 예시
kubectl node-shell node01

node-shell 실행 시 출력을 보면 node01에 nsenter-t10odwy라는 것을 스폰 중이라는 내용이 있는데, 동작 방식을 보면 node에 권한이 있는 Pod를 실행하고, 해당 Pod Container에 접속하는 것으로 보인다.

그 외 사용 방법은 아래에 나열한다.

 

Node에서 명령어 실행

kubectl node-shell <NODE_NAME> -- <COMMAND>

# 예시
kubectl node-shell node01 -- hostname

node-shell을 통한 명령어 실행이 완료된 이후에는 node-shell 동작을 위해 생성되었던 pod가 자동으로 삭제된다.

 

 

표준 입력으로 파일 전달

cat /etc/passwd | kubectl node-shell <node> -- sh -c 'cat > /tmp/passwd'

# 예시
cat /etc/passwd | kubectl node-shell node01 -- sh -c 'cat > /tmp/passwd'

node-shell을 통해 명령어를 실행한 뒤, 실제로 SSH로 Node에 접속해 보면 표준입력으로 전달한 파일이 저장되어 있는 상태임을 확인할 수 있다.

 

 

참고 문서

https://github.com/kvaps/kubectl-node-shell

https://kubernetes.io/docs/tasks/configure-pod-container/create-hostprocess-pod/