쿠버네티스 최신 명령어 가이드 - kubectl로 마스터하는 컨테이너 오케스트레이션
쿠버네티스는 현대 클라우드 네이티브 애플리케이션의 핵심 플랫폼으로 자리잡았습니다. 이 가이드에서는 최신 kubectl 명령어들과 쿠버네티스의 핵심 기능들을 체계적으로 정리하여, 초보자부터 고급 사용자까지 모두가 실무에서 활용할 수 있도록 안내해드리겠습니다.
kubectl 기본 설정
kubectl 설치 및 설정
최신 kubectl을 설치하는 방법들입니다.
macOS (Homebrew):
brew install kubectl
Linux:
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
클러스터 연결 설정
# 클러스터 정보 확인
kubectl cluster-info
# 컨텍스트 확인
kubectl config get-contexts
# 컨텍스트 전환
kubectl config use-context <context-name>
# 현재 컨텍스트 확인
kubectl config current-context
kubectl 자동 완성 설정
Bash:
echo 'source <(kubectl completion bash)' >>~/.bashrc
Zsh:
echo 'source <(kubectl completion zsh)' >>~/.zshrc
기본 리소스 관리 명령어
파드(Pod) 관리
파드 생성 및 조회
# 파드 생성
kubectl run nginx --image=nginx
# 파드 목록 조회
kubectl get pods
# 파드 상세 정보
kubectl describe pod nginx
# 파드 로그 확인
kubectl logs nginx
# 실시간 로그 확인
kubectl logs -f nginx
# 파드에 접속
kubectl exec -it nginx -- /bin/bash
파드 관리 고급 옵션
# 모든 네임스페이스의 파드 조회
kubectl get pods --all-namespaces
# 레이블 선택기로 조회
kubectl get pods -l app=nginx
# 파드 상태별 정렬
kubectl get pods --sort-by=.status.phase
# JSON 형태로 출력
kubectl get pod nginx -o json
# YAML 형태로 출력
kubectl get pod nginx -o yaml
디플로이먼트(Deployment) 관리
디플로이먼트 생성
# 디플로이먼트 생성
kubectl create deployment nginx-deployment --image=nginx
# 레플리카 수 지정
kubectl create deployment nginx-deployment --image=nginx --replicas=3
# 포트 노출
kubectl create deployment nginx-deployment --image=nginx --port=80
디플로이먼트 관리
# 디플로이먼트 조회
kubectl get deployments
# 디플로이먼트 상세 정보
kubectl describe deployment nginx-deployment
# 디플로이먼트 스케일링
kubectl scale deployment nginx-deployment --replicas=5
# 롤링 업데이트
kubectl set image deployment/nginx-deployment nginx=nginx:1.21
# 롤아웃 상태 확인
kubectl rollout status deployment/nginx-deployment
# 롤아웃 히스토리
kubectl rollout history deployment/nginx-deployment
# 이전 버전으로 롤백
kubectl rollout undo deployment/nginx-deployment
서비스(Service) 관리
서비스 생성
# ClusterIP 서비스 (기본값)
kubectl expose deployment nginx-deployment --port=80 --target-port=80
# NodePort 서비스
kubectl expose deployment nginx-deployment --type=NodePort --port=80
# LoadBalancer 서비스
kubectl expose deployment nginx-deployment --type=LoadBalancer --port=80
# 서비스 조회
kubectl get services
# 서비스 상세 정보
kubectl describe service nginx-deployment
네임스페이스 관리
네임스페이스 기본 조작
# 네임스페이스 생성
kubectl create namespace production
# 네임스페이스 조회
kubectl get namespaces
# 특정 네임스페이스의 리소스 조회
kubectl get pods -n production
# 기본 네임스페이스 설정
kubectl config set-context --current --namespace=production
네임스페이스별 리소스 관리
# 네임스페이스에 리소스 생성
kubectl run nginx --image=nginx -n production
# 네임스페이스간 서비스 통신 확인
kubectl get endpoints -n production
# 네임스페이스 삭제 (주의: 모든 리소스 삭제됨)
kubectl delete namespace production
고급 명령어
리소스 모니터링
실시간 모니터링
# 파드 상태 실시간 감시
kubectl get pods --watch
# 리소스 사용량 확인 (metrics-server 필요)
kubectl top nodes
kubectl top pods
# 이벤트 확인
kubectl get events --sort-by=.metadata.creationTimestamp
# 특정 파드의 이벤트
kubectl get events --field-selector involvedObject.name=nginx
디버깅 명령어
# 파드 내부 네트워크 확인
kubectl exec nginx -- nslookup kubernetes.default
# 파드간 네트워크 연결 테스트
kubectl run tmp-shell --rm -i --tty --image nicolaka/netshoot
# 파드 리소스 사용량 실시간 확인
kubectl exec nginx -- top
# 파드 프로세스 확인
kubectl exec nginx -- ps aux
파일 기반 리소스 관리
YAML 매니페스트 활용
# YAML 파일로 리소스 생성
kubectl apply -f deployment.yaml
# 디렉토리의 모든 YAML 파일 적용
kubectl apply -f ./configs/
# 원격 YAML 파일 적용
kubectl apply -f https://raw.githubusercontent.com/kubernetes/examples/master/nginx.yaml
# 리소스 상태 확인
kubectl get -f deployment.yaml
# 리소스 삭제
kubectl delete -f deployment.yaml
Kustomize 활용
# Kustomization 적용
kubectl apply -k ./overlays/production
# Kustomization 미리보기
kubectl kustomize ./overlays/production
# 빌드된 YAML 확인
kubectl kustomize ./overlays/production > output.yaml
설정 관리
ConfigMap과 Secret
ConfigMap 관리
# 리터럴 값으로 ConfigMap 생성
kubectl create configmap app-config --from-literal=database_url=postgres://localhost
# 파일에서 ConfigMap 생성
kubectl create configmap app-config --from-file=config.properties
# ConfigMap 조회
kubectl get configmaps
# ConfigMap 내용 확인
kubectl describe configmap app-config
# ConfigMap 수정
kubectl edit configmap app-config
Secret 관리
# Generic Secret 생성
kubectl create secret generic app-secret --from-literal=password=mysecretpassword
# TLS Secret 생성
kubectl create secret tls tls-secret --cert=tls.crt --key=tls.key
# Docker registry Secret 생성
kubectl create secret docker-registry regcred \
--docker-server=myregistry.io \
--docker-username=myuser \
--docker-password=mypassword
# Secret 조회 (값은 base64 인코딩됨)
kubectl get secret app-secret -o yaml
# Secret 값 디코딩
kubectl get secret app-secret -o jsonpath='{.data.password}' | base64 --decode
스토리지 관리
볼륨 관리
# PersistentVolume 조회
kubectl get pv
# PersistentVolumeClaim 조회
kubectl get pvc
# StorageClass 조회
kubectl get storageclass
# 볼륨 상태 확인
kubectl describe pv my-pv
kubectl describe pvc my-pvc
동적 볼륨 프로비저닝
# StorageClass 예시
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: fast-ssd
provisioner: kubernetes.io/gce-pd
parameters:
type: pd-ssd
zones: us-central1-a, us-central1-b
네트워킹 관리
Ingress 관리
# Ingress 조회
kubectl get ingress
# Ingress 상세 정보
kubectl describe ingress my-ingress
# Ingress Controller 확인
kubectl get pods -n ingress-nginx
NetworkPolicy
# NetworkPolicy 조회
kubectl get networkpolicies
# NetworkPolicy 적용
kubectl apply -f network-policy.yaml
# 네트워크 연결 테스트
kubectl exec -it pod1 -- nc -zv pod2-service 80
클러스터 관리
노드 관리
# 노드 조회
kubectl get nodes
# 노드 상세 정보
kubectl describe node worker-node-1
# 노드 라벨 추가
kubectl label node worker-node-1 environment=production
# 노드 라벨 제거
kubectl label node worker-node-1 environment-
# 노드 스케줄링 비활성화
kubectl cordon worker-node-1
# 노드 스케줄링 활성화
kubectl uncordon worker-node-1
# 노드 drain (파드 안전하게 이동)
kubectl drain worker-node-1 --ignore-daemonsets
RBAC 관리
# 서비스 계정 생성
kubectl create serviceaccount my-service-account
# 역할 생성
kubectl create role pod-reader --verb=get,list,watch --resource=pods
# 역할 바인딩 생성
kubectl create rolebinding read-pods --role=pod-reader --serviceaccount=default:my-service-account
# RBAC 확인
kubectl auth can-i get pods --as=system:serviceaccount:default:my-service-account
트러블슈팅
일반적인 디버깅 명령어
# 클러스터 상태 종합 확인
kubectl get all --all-namespaces
# 실패한 파드 확인
kubectl get pods --field-selector=status.phase=Failed
# 리소스 사용량이 높은 파드 확인
kubectl top pods --sort-by=cpu
# DNS 문제 디버깅
kubectl run -it --rm debug --image=busybox --restart=Never -- nslookup kubernetes.default
# 네트워크 연결 테스트
kubectl run -it --rm netshoot --image=nicolaka/netshoot --restart=Never
로그 분석
# 여러 파드의 로그 동시 확인
kubectl logs -l app=nginx --tail=100
# 이전 컨테이너의 로그 확인
kubectl logs nginx --previous
# 로그 실시간 스트리밍
kubectl logs -f deployment/nginx-deployment
# 특정 시간 이후 로그
kubectl logs nginx --since=1h
성능 최적화
리소스 관리
# 리소스 할당량 확인
kubectl describe quota
# 리소스 제한 확인
kubectl describe limitrange
# HorizontalPodAutoscaler 상태
kubectl get hpa
# VerticalPodAutoscaler 상태 (설치된 경우)
kubectl get vpa
클러스터 최적화
# 사용하지 않는 리소스 확인
kubectl get pods --all-namespaces --field-selector=status.phase=Succeeded
# 리소스 정리
kubectl delete pods --field-selector=status.phase=Succeeded --all-namespaces
# 이미지 정리 (노드에서 직접 실행)
docker system prune -f
보안 관리
보안 정책
# PodSecurityPolicy 조회 (deprecated, 대신 PodSecurity admission controller 사용)
kubectl get podsecuritypolicy
# 보안 컨텍스트 확인
kubectl describe pod nginx | grep -A 10 "Security Context"
# 권한 확인
kubectl auth can-i create pods
kubectl auth can-i create pods --as=system:serviceaccount:default:my-sa
시크릿 스캔
# 클러스터 내 시크릿 현황
kubectl get secrets --all-namespaces
# 시크릿 타입별 분류
kubectl get secrets --all-namespaces -o custom-columns=NAMESPACE:.metadata.namespace,NAME:.metadata.name,TYPE:.type
실전 시나리오
애플리케이션 배포 전체 과정
# 1. 네임스페이스 생성
kubectl create namespace myapp
# 2. 시크릿 생성
kubectl create secret generic db-secret \
--from-literal=username=admin \
--from-literal=password=secret123 \
-n myapp
# 3. ConfigMap 생성
kubectl create configmap app-config \
--from-literal=database_url=postgres://db:5432/myapp \
-n myapp
# 4. 디플로이먼트 생성
kubectl create deployment myapp \
--image=myapp:latest \
--replicas=3 \
-n myapp
# 5. 서비스 노출
kubectl expose deployment myapp \
--port=80 \
--target-port=8080 \
--type=ClusterIP \
-n myapp
# 6. Ingress 설정 (별도 YAML 필요)
kubectl apply -f myapp-ingress.yaml
롤링 업데이트와 롤백
# 새 버전 배포
kubectl set image deployment/myapp myapp=myapp:v2.0 -n myapp
# 배포 진행 상황 모니터링
kubectl rollout status deployment/myapp -n myapp
# 문제 발생시 즉시 롤백
kubectl rollout undo deployment/myapp -n myapp
# 특정 리비전으로 롤백
kubectl rollout undo deployment/myapp --to-revision=1 -n myapp
kubectl 플러그인과 도구
유용한 kubectl 플러그인
# krew (kubectl 플러그인 매니저) 설치
kubectl krew install krew
# 인기 플러그인들
kubectl krew install ns # 네임스페이스 빠른 전환
kubectl krew install ctx # 컨텍스트 빠른 전환
kubectl krew install tree # 리소스 트리 구조 확인
kubectl krew install view-secret # 시크릿 값 쉽게 확인
별칭(Alias) 설정
# ~/.bashrc 또는 ~/.zshrc에 추가
alias k='kubectl'
alias kg='kubectl get'
alias kd='kubectl describe'
alias ka='kubectl apply'
alias kdel='kubectl delete'
마무리
이 가이드에서는 쿠버네티스의 핵심 kubectl 명령어들을 체계적으로 정리했습니다. 쿠버네티스를 효과적으로 사용하려면:
- 기본 명령어 숙달: get, describe, apply, delete 등 핵심 명령어 완전 이해
- 리소스 생명주기 관리: Pod, Deployment, Service의 생성-수정-삭제 과정 숙지
- 디버깅 스킬: logs, exec, events 등을 활용한 문제 해결 능력
- 보안 인식: RBAC, Secret, NetworkPolicy 등 보안 관련 리소스 이해
- 모니터링 습관: top, describe, get events 등을 통한 상시 모니터링
쿠버네티스는 복잡하지만 강력한 플랫폼입니다. 이 명령어들을 단계적으로 익혀가며 실제 프로젝트에 적용해보시기 바랍니다. 경험이 쌓일수록 더욱 효율적이고 안정적인 컨테이너 오케스트레이션이 가능할 것입니다.