apiVersion/kind/metadata/spec)와 spec vs status는 02장 - 쿠버네티스의 동작 모델 참고kubectl create deployment nginx --image nginx
kubectl run nginx --image nginx
create, replace, delete)를 명시
kubectl create -f nginx.yaml
kubectl replace -f nginx.yaml
kubectl delete -f nginx.yaml
replace는 전체 spec을 덮어쓴다 — 파일에 없지만 클러스터가 독립적으로 갱신하는 필드(예: LoadBalancer의 externalIPs)가 사라진다kubectl diff -f configs/ # 적용 전 차이 확인
kubectl apply -f configs/
kubectl apply -R -f configs/ # 디렉터리 재귀 처리
patch API를 사용 — 파일에 명시된 필드만 갱신하고, 다른 writer가 만든 변경은 보존| 방식 | 작업 단위 | 권장 사용처 |
|---|---|---|
| 명령형 커맨드 | 라이브 오브젝트 | 개발·실험 |
| 명령형 오브젝트 설정 | 파일 단위 | 프로덕션 (단일 writer) |
| 선언형 오브젝트 설정 | 디렉터리 단위 | 프로덕션 (여러 writer, 감사 필요) |
-·., 알파뉴메릭 시작·종료 (Pod·Deployment 등 대부분)-., .., /, % 불가name 대신 generateName을 쓰면 API 서버가 접미사를 붙여 유일한 이름을 생성 (v1.31+는 최대 8회 재시도 후 409)[prefix/]name
-·_·. 허용kubernetes.io/·k8s.io/는 쿠버네티스 코어 예약=, ==, !=) — 쉼표는 AND
environment=production,tier!=frontend
in, notin, exists)
environment in (production, qa)
tier notin (frontend, backend)
partition # 키가 존재
!partition # 키가 존재하지 않음
matchLabels·matchExpressions도 위 문법을 객체 형태로 표현한 것||)은 없다 — 필터를 구조화해 풀어야 함kubectl get pods -l 'environment=production,tier!=frontend'
kubectl get pods -l 'environment in (production, qa)'
ResourceQuota로 자원을 팀 단위로 나눌 때default로 충분default: 기본. 프로덕션에서는 쓰지 말고 전용 네임스페이스를 만들 것kube-system: 쿠버네티스 시스템 컴포넌트kube-public: 모든 클라이언트가 읽을 수 있는 공개 리소스kube-node-lease: 노드 하트비트 Leasekube- 접두사는 예약어 — 직접 만들지 말 것kubectl api-resources --namespaced=true|false<service>.<namespace>.svc.cluster.local로 조회<service>만으로 접근kubectl get namespace
kubectl get pods --namespace=<ns>
kubectl config set-context --current --namespace=<ns> # 컨텍스트 기본 네임스페이스 변경
[prefix/]name, 예약 prefix 포함)metadata.*·spec.*·status.*)=, ==, !=만 지원 (set 연산자 없음)metadata.name, metadata.namespacespec.nodeName, spec.serviceAccountName, status.phase, status.podIPspec.unschedulableinvolvedObject.*, reason, typestatus.successful / Secret: typekubectl get pods --field-selector status.phase=Running
kubectl get pods --field-selector spec.nodeName=worker-1
kubectl get pods --field-selector=status.phase!=Running,spec.restartPolicy=Always
kubectl get services --all-namespaces --field-selector metadata.namespace!=default
BadRequest 오류와 함께 가능한 필드 목록이 반환됨spec.versions[*].selectableFields에 선언한 필드도 사용 가능metadata.finalizers에 저장된 키 목록metadata.deletionTimestamp를 세팅하고 HTTP 202 반환finalizers가 비어 있지 않은 동안 오브젝트는 실제 삭제되지 않음finalizers가 빈 배열이 되면 API 서버가 오브젝트를 최종 삭제deletionTimestamp를 수정할 수는 없다kubernetes.io/pv-protection: Pod가 쓰는 PV가 실수로 지워지는 것을 막음kubernetes.io/pvc-protection: PVC 보호metadata.ownerReferences로 부모(owner) 를 가리킨다
metadata:
ownerReferences:
- apiVersion: apps/v1
kind: ReplicaSet
name: my-rs
uid: <uid>
blockOwnerDeletion: true # true면 이 의존 오브젝트가 정리되기 전엔 부모가 삭제되지 않음
OwnerRefInvalidNamespace 경고 이벤트가 생김foreground finalizer가 붙고, blockOwnerDeletion=true인 dependent가 먼저 삭제된 뒤 부모가 지워짐kubectl delete --cascade=foreground|background|orphan으로 선택