API 리소스와 오브젝트
API 리소스
API 리소스는 쿠버네티스가 관리할 수 있는 오브젝트의 종류입니다. API 리소스의 종류에는 Pod, Service, ConfigMap, Secret등이 있습니다. 심지어 쿠버네티스 클러스터를 구성하는 Node도 리소스로 취급되고, 클러스터 상에서 사용되는 계정 ServiceAccount도 리소스로 관리하게 됩니다. 그리고 이에 대한 Role도 리소스가 됩니다.
오브젝트 (Object)
오브젝트는 API리소스를 인스턴스화 한 것이라고 보실 수 있ㅅ브니다.
우선 실습을 진행하기 위해 로컬 단일 클러스터 구축을 위해 minikube start를 하고 status로 클러스터가 잘 실행된 것을 홗인해주었습니다. 그리고 kubectl에서 node를 확인하니 잘 존재합니다.
저희가 이전에 쿠버네티스에서 기본적으로 관리하는 리소스는 Pod가 있었음을 알고 있습니다. 그리고 kubectl api-resources로 이를 찾아보니 NAME, SHORTNAMES, APIVERSION, NAMESPACED KIND가 다 잘 나오는 것을 보실 수 있습니다. pods라는 리소스 타입이 있고, 그리고 축약어는 po임을 알 수 있습니다.
그리고 이제 kubectl을 통해서 pod목록을 확인할 수 있는데, 그냥 get pod라고 하면 나오지 않습니다. 그 이유는 지금 네임스페이스에 pod가 없기 떄문입니다. 따라서 모든 네임스페이스 상에서 pod를 찾아주니 여러개의 pod가 나오는 것을 보실 수 있습니다. 또한 po라는 단축어로도 실행할 수 있습니다.
이 외에도 kubectl explain [resource]를 통해서 리소스에 대한 정보를 확인할 수 있습니다.
매니페스트 파일
아까 explain명령어를 쳐보면서 FIELDS값이 있었습니다. 쿰버네티스에서는 오브젝트를 관리하기 위해서 YAML기반의 매니페스트 파일을 사용하게 됩니다.
일단 루트 키로 apiVersion, kind, metadata가 있는데, 이는 거의 모든 리소스가 가지고 있는 FIELD라고 보시면 됩니다. apiVersion은 오브젝트가 어떤 API그룹에 속하고 API버전이 몇인가에 대한 설명입니다. 그리고 kind는 오브젝트가 어떤 API리소스 인가?를 명시하게 됩니다. 그리고 metadata는 오브젝트를 식별하기 위한 정보(이름, 네임스페이스, 레이블 등)을 명시합니다.
그리고 spec이라는 키도 있는데, 이는 오브젝트가 가지고자 하는 데이터입니다. 그런데 spec이 없는 리소스도 있는데, API리소스에 따라 spec대신 data, rules, subjects등 다른 속성을 사용하는 경우가 있습니다.
Labels와 Annotations
metadata에 들어가는 labels와 annotations는 모든 쿠버네티스 오브젝트가 옵셔널하게 가질 수 있는 메타데이터 입니다.
labels는 오브젝트를 식별하기 위한 목적이 강하지만 쿠버네티스 내부 여러 기능에서 Label Selector기능을 제공합니다. 따라서 이는 검색 / 분류 / 필터링 등의 목적으로 사용됩니다.
annotations은 label과 다르게 식별이 아닌 다른 목적으로 사용됩니다. 이는 식별의 목적이 아닌 즉 쿠버네티스의 클러스터를 구성하는 여러 애드온 서비스가 있을 것입니다. 예를 들면 LogAgent를 모든 Pod를 추가하기 위해 추가해줄 수 있습니다.