kubectl은 쿠버네티스 클러스터와 상호작용하기 위한 핵심 CLI 도구로, API 서버에 요청을 전달하여 리소스를 관리합니다. 이 도구는 애플리케이션 배포, 상태 확인, 확장, 업데이트 등 다양한 작업을 명령어 한 줄로 수행할 수 있게 해줍니다. kubectl 사용법에 익숙해지는 것은 쿠버네티스 운영의 첫걸음이라 할 수 있습니다.
1. 셸 자동 완성 기능 설정
작업 효율을 높이기 위해 bash 환경에서 kubectl 명령어 자동 완성을 활성화할 수 있습니다.yum install -y bash-completion
source /usr/share/bash-completion/bash_completion
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc
위 설정을 통해 탭 키로 명령어, 하위 명령, 플래그 등을 자동 완성할 수 있습니다.
2. 주요 kubectl 명령어 구조 이해
kubectl의 전체 명령어 목록과 카테고리는 다음 명령으로 확인할 수 있습니다:kubectl --help
주요 카테고리는 다음과 같습니다:
- 기본 명령 (create, get, run): 초기 배포 및 조회
- 수정 명령 (edit, patch, replace): 리소스 변경
- 배포 관리 (rollout, scale): 롤아웃 제어 및 스케일링
- 문제 해결 (logs, describe, exec): 디버깅 및 상태 점검
- 클러스터 관리 (cluster-info, drain): 노드 및 클러스터 제어
--help 옵션으로 세부 설명을 확인할 수 있습니다.
3. Nginx 애플리케이션 배포
Deployment를 사용해 nginx 인스턴스를 생성합니다. 아래 예시는 1개의 복제본을 가진 애플리케이션을 배포합니다.kubectl run my-nginx \
--image=nginx:1.14-alpine \
--port=80 \
--replicas=1
생성 후 Deployment 상태를 확인합니다:
kubectl get deployment my-nginx
결과에는 필요한 복제본 수(Desired), 현재 실행 중인 수(Current), 사용 가능한 수(Available)가 표시됩니다.
4. 파드(Pod) 정보 조회 및 접근
배포 후 생성된 파드를 확인합니다:kubectl get pods -o wide
출력 결과에는 각 파드의 이름, IP 주소, 실행 중인 노드 위치가 포함됩니다. 내부 네트워크를 통해 직접 접근 가능합니다:
curl -I http://[POD_IP]
# 예: curl -I http://10.244.2.2
응답 코드 200을 받으면 정상 동작함을 의미합니다.
5. 서비스(Service)를 통한 외부 노출
파드는 일시적일 수 있으므로, 안정적인 네트워크 엔드포인트를 제공하기 위해 Service를 생성합니다.kubectl expose deployment my-nginx \
--name=web-svc \
--port=80 \
--target-port=80 \
--type=NodePort
NodePort 유형은 클러스터 내 모든 노드의 특정 고정 포트(예: 30757)를 열어 외부에서 접근할 수 있게 합니다. 서비스 정보를 확인합니다:
kubectl get svc web-svc
외부에서는 http://[NODE_IP]:[NODE_PORT] 형태로 접근이 가능합니다.
6. 파드 삭제 시 동작 관찰
현재 실행 중인 파드를 수동으로 삭제해 보겠습니다:kubectl delete pod [POD_NAME]
잠시 후 다시 파드 목록을 확인하면 새로운 파드가 자동으로 생성된 것을 확인할 수 있습니다. 이는 Deployment가 지정된 복제본 수를 유지하려는 특성 때문입니다.
kubectl get pods -w
-w 플래그는 실시간으로 상태 변화를 모니터링합니다.
7. 레이블 기반 연결 구조 이해
Service는 레이블 셀렉터(selector)를 통해 대상 파드를 동적으로 선택합니다. 다음 명령으로 이를 확인할 수 있습니다:kubectl describe svc web-svc
# 출력 예시: Selector: run=my-nginx
새로 생성된 파드도 동일한 레이블을 가지고 있어 자동으로 서비스와 연결됩니다:
kubectl get pod [NEW_POD_NAME] --show-labels
8. 애플리케이션 확장 및 축소
kubectl scale 명령을 사용해 복제본 수를 조정합니다.
확장:
kubectl scale deployment my-nginx --replicas=5
축소:
kubectl scale deployment my-nginx --replicas=3
각 과정에서 파드의 생성/종료가 자동으로 처리됩니다.
9. 롤링 업데이트 및 롤백
이미지를 새 버전으로 업데이트하면서 가동 중단 없이 배포할 수 있습니다:kubectl set image deployment/my-nginx \
nginx=nginx:1.15-alpine \
--record
--record 옵션은 변경 사항을 어노테이션으로 저장하여 추후 추적 가능하게 합니다.
업데이트 진행 상황 확인:
kubectl rollout status deployment/my-nginx
문제 발생 시 이전 버전으로 즉시 롤백:
kubectl rollout undo deployment/my-nginx
완료 후 파드의 이미지 버전을 확인하면 다시 1.14-alpine으로 되돌아간 것을 알 수 있습니다.
10. 요약: 핵심 명령어
kubectl run: 간단한 배포 생성kubectl get: 리소스 상태 조회kubectl expose: 서비스 생성 및 외부 노출kubectl describe: 리소스 상세 정보 분석kubectl scale: 복제본 수 조정kubectl set image: 이미지 업데이트kubectl rollout undo: 이전 상태로 복구