Kubernetes에서 오브젝트는 "원하는 상태(desired state)"의 선언입니다. 이 선언은 다음과 같은 클러스터 상태를 정의합니다:
오브젝트는 단순한 리소스 정보 이상의 의미를 가지며, Kubernetes는 이 선언을 기반으로 클러스터를 끊임없이 조율합니다. 이처럼 오브젝트는 "명령"이 아니라 "의도"를 기록하는 방식이라는 점에서, 선언적(declarative) 접근을 대표합니다.
대부분의 Kubernetes 오브젝트는 다음과 같은 공통 필드를 갖습니다:
apiVersion: <API 버전>
kind: <오브젝트 종류>
metadata:
name: <오브젝트 이름>
namespace: <네임스페이스 (선택)>
spec:
... 원하는 상태에 대한 정의 ...
apiVersion: 해당 오브젝트를 처리할 API의 버전kind: 생성하고자 하는 오브젝트의 종류 (예: Deployment, Pod 등)metadata: 이름, 라벨, 네임스페이스 등 식별자 정보spec: 오브젝트가 어떤 상태를 가져야 하는지 정의또한, Kubernetes는 status라는 필드를 통해 현재 상태(actual state)를 기록합니다. 이는 시스템이 자동으로 업데이트하며, 사용자는 수정하지 않습니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
위 YAML은 nginx 컨테이너를 2개의 복제본으로 실행하는 Deployment를 정의합니다. 중요한 점은 이 설정이 단순히 "2개의 nginx를 실행하라"는 명령이 아니라, "2개가 항상 존재해야 한다"는 의도를 담고 있다는 것입니다. Kubernetes는 이 의도를 만족시키기 위해 pod를 생성하고, 실패 시 재시작하며, 롤링 업데이트도 처리합니다.
적용 방법:
kubectl apply -f deployment.yaml
오브젝트는 결국 Kubernetes API를 통해 정의되고 조작됩니다. kubectl CLI는 이러한 API 호출을 추상화해주는 도구일 뿐입니다. 직접 프로그램에서 오브젝트를 생성하거나 조회하고 싶다면, Kubernetes 클라이언트 라이브러리를 사용할 수 있습니다 (Go, Python, Java 등).
Kubernetes v1.25부터는 서버 측 필드 유효성 검사가 도입되었습니다. 기존에는 kubectl --validate=true를 통해 클라이언트 측에서만 필드 유효성을 검사했지만, 이제는 서버에서 직접 잘못된 필드나 중복된 항목을 검사합니다.
strict: 유효하지 않으면 에러warn: 유효하지 않아도 경고만 출력ignore: 검사를 수행하지 않음기본값은 strict이며, 이는 CI/CD 환경에서 잘못된 리소스 정의로 인한 장애를 미리 방지하는 데 효과적입니다.