Kubernetes Object란?
- 쿠버네티스 시스템에서 영속성을 가지는 오브젝트
Object 관리 방법
- kubernetes API를 사용하여 생성, 수정, 삭제함
- 방법 : kubectl, kubernetes client 라이브러리 중 하나를 이용, kubernetes API를 직접 이용
- 명령어 사용 방법
- 명령어 커맨드 (개발)
- 오브젝트 직접 생성/삭제
- kubectl create deployment nginx --image nginx
- 명령형 오브젝트 구성 (프로덕션)
- 오브젝트 파일로 생성/삭제
- kubectl create -f nginx.yaml
- 선언형 오브젝트 구성 (프로덕션) - kustomize, helm
- 디렉토리(내부 파일)로 생성/삭제
- kubectl apply -f configs/
- kubectl apply -R -f configs/ (재귀적 디렉토리)
Object 명세(Spec), 상태(Status)
- spec : Object를 생성할때, 리소스에 원하는 특징에 대한 설명을 제공
- status : kubernetes 시스템과 컴포넌트에 상태를 제공하여, kubernetes 컨트롤 플레인은 Object 상태를 사용자가 의도한대로 일치시키기 위해 계속해서 관리한다.
예) deploy object
- spec : replica 3개로 설정
- status : 3개의 인스턴스중 1개라도 실패한 status라면 컨트롤 플레인에 의해 3개를 만들기위해 관리됨
kubernetes Object 기술
필드 설명
- apiVersion : 이 오브젝트를 생성하기 위해 사용하고 있는 쿠버네티스 API 버전이 어떤 것인지
- kind : 어떤 종류의 오브젝트를 생성하고자 하는지
- metadata : 이름 문자열, UID, 그리고 선택적인 네임스페이스를 포함하여 오브젝트를 유일하게 구분지어 줄 데이터
- spec : 오브젝트에 대해 어떻게 생성/유지할지 설정
Object 이름과 ID
각 리소스 타입별로 이름은 동일 네임스페이스 내에서 하나만 존재할 수 있다.
3가지의 이름 제한 조건과 UID
-
DNS 서브도메인 이름
대부분의 리소스 유형에는 RFC 1123에 정의된 대로 DNS 서브도메인 이름으로 사용할 수 있는 이름이 필요하다. 이것은 이름이 다음을 충족해야 한다는 것을 의미한다.
- 253자를 넘지 말아야 한다.
- 소문자와 영숫자 - 또는 . 만 포함한다.
- 영숫자로 시작한다.
- 영숫자로 끝난다.
-
DNS 레이블 이름
일부 리소스 유형은 RFC 1123에 정의된 대로 DNS 레이블 표준을 따라야 한다. 이것은 이름이 다음을 충족해야 한다는 것을 의미한다.
- 최대 63자이다.
- 소문자와 영숫자 또는 - 만 포함한다.
- 영숫자로 시작한다.
- 영숫자로 끝난다
-
경로 세그먼트 이름
일부 리소스 유형에서는 이름을 경로 세그먼트로 안전하게 인코딩 할 수 있어야 한다. 즉 이름이 "." 또는 ".."이 아닐 수 있으며 이름에는 "/" 또는 "%"가 포함될 수 없다.
-
UID
오브젝트를 중복 없이 식별하기 위해 쿠버네티스 시스템이 생성하는 문자열.
쿠버네티스 UID는 보편적으로 고유한 식별자이다(또는 UUID라고 한다). UUID는 ISO/IEC 9834-8 과 ITU-T X.667 로 표준화
Namespace
- 쿠버네티스는 동일한 물리 클러스터를 기반으로 하는 여러 가상 클러스터를 지원하고,
- 이런 가상 클러스터를 네임스페이스라고 한다.
- 네임스페이스는 서로 중첩될 수 없으며, 각 쿠버네티스 리소스는 하나의 네임스페이스에만 있을 수 있다.
쿠버네티스는 처음에 네 개의 초기 네임스페이스
- default 다른 네임스페이스가 없는 오브젝트를 위한 기본 네임스페이스
- kube-system 쿠버네티스 시스템에서 생성한 오브젝트를 위한 네임스페이스
- kube-public 자동으로 생성되며 모든 사용자(인증되지 않은 사용자 포함)가 읽기 권한으로 접근할 수 있다. 이 네임스페이스는 주로 전체 클러스터 중에 공개적으로 드러나서 읽을 수 있는 리소스를 위해 예약되어 있다.
- kube-node-lease 클러스터가 스케일링될 때 노드 하트비트의 성능을 향상시키는 각 노드와 관련된 리스(lease) 오브젝트에 대한 네임스페이스
Namespace와 DNS
- 서비스 생성시 DNS는 <서비스-이름>.<네임스페이스-이름>.svc.cluster.local 구조를 갖는다.
- 동일한 네임스페이스 경우 : <서비스-이름>로 접근
- 네임스페이스를 넘어서 접근할경우 : 전체 주소 도메인 이름(FQDN)으로 접근
Object는 Namespace에 속한것도 있고 아닌것도 있음
- Namespace에 속한것 : pod, service, replicaset ...
- Namespace에 속하지 않은것 : node, namespace, persistentvolume, custerrole, ...
Label, Selector
- label : 오브젝트 특성을 식별하는데 사용 (사용자 관점으로 사용됨)
- UI, CLI에서 쿼리로 사용하거나, 검색하기에 적합하다.
사용 이유?
- 사용자가 느슨하게 결합한 방식으로 조직 구조와 시스템 오브젝트를 매핑할수 있음
Label 규칙
- Key, value로 되어 있다.
- Key는 슬래시(/)로 구분하며 (접두사/이름)이라는 2개의 세그먼트
- 접두사 :
- 생략 가능하고, 접두사를 생략하면 키 레이블은 개인용
- 전체 253자 이하,
- 점(.)로 구분되며, 뒤에는 슬래시(/)가 붙음
- DNS의 하위 도메인으로, DNS 레이블
- 예) kubernetes.io/와 k8s.io/
- 이름 :
- 필수
- 63자 미만
- 작과 끝은 알파벳과 숫자([a-z0-9A-Z]), 대시(-), 밑줄(_), 점(.) 사용
Label Selector
- 레이블 셀렉터를 통해 클라이언트와 사용자는 오브젝트를 식별할 수 있음
- 여러개의 셀렉터 조건 검색시, 또는 &&로 구분
- 식별 방법
- 일치성 기준 (equality-based)
- 연산자 : =,==,!=
- 조건을 모두 만족해야함.
- 예) environment=production,tier!=frontend
- key가 environment이며 value가 production이고, key가 tier이고 value가 fronted가 아닌것
- 집합성 기준 (set-based)
- 연산자 : in,notin과 exists
- 요건에 따라 값 집합을 키로 필터링가능
- 예) partition in (customerA, customerB)
- key가 partition이고 value가 customerA, customerB인것
Label로 API Object에서 선택 설정
- service, replicationcontrollers에서 다른 Object(예) pod)리소스 집합(set)을 선택 가능
- Job, Deployment, Replicaset, Daemonset에서 리소스 집합(set) 선택 가능
- matchLabels는 {key,value}의 쌍과 매칭
- matchExpressions는 key, value 집합 연산으로 매칭
- matchLabels와 matchExpressions 모두 AND로 되어있어 일치하기 위해서는 모든 요건을 만족해야 함
Label로 API 조회
- LIST와 WATCH 기능을 쿼리 파라미터로 사용할 수 있음
- 일치성 기준 요건: ?labelSelector=environment%3Dproduction,tier%3Dfrontend
- 집합성 기준 요건: ?labelSelector=environment+in+%28production%2Cqa%29%2Ctier+in+%28frontend%29
- 예) kubectl로 apiserver 조회가능
Stateless 서비스 권장 Label 사용 예
- Deployment의 Label : 실행하는 pod의 상태를 Oversee(감시)하기 위해
- Service의 : pod에 요청할 수 잇게 Expose(노출)
Annotation
- 레이블과 달리, 어노테이션은 오브젝트를 식별하고 선택하는데 사용되지 않지만, 임의의 비-식별 메타데이터값을 오브젝트에 넣을수 있음.
사용 이유?
- 레이블이나, 이름, 네임스페이스와 같이 특별한 기능이 아닌 임의의 메타 정보를 넣을수 있다.
Annotation 사용처
- 빌드, 릴리스, 또는 타임 스탬프, 릴리스 ID, git 브랜치, PR 번호, 이미지 해시 및 레지스트리 주소와 같은 이미지 정보
- 로깅, 모니터링, 분석 또는 감사 리포지터리에 대한 포인터
- 디버깅 목적으로 사용될 수 있는 클라이언트 라이브러리 또는 도구 정보: 예를 들면, 이름, 버전, 그리고 빌드 정보
- 경량 롤아웃 도구 메타데이터. 예: 구성 또는 체크포인트
- 책임자의 전화번호 또는 호출기 번호, 또는 팀 웹 사이트 같은 해당 정보를 찾을 수 있는 디렉터리 진입점.
Annotation 규칙
- Key, value로 되어 있다.
- Key는 슬래시(/)로 구분하며 (접두사/이름)이라는 2개의 세그먼트
- 접두사 :
- 생략 가능하고, 접두사를 생략하면 키 레이블은 개인용
- 전체 253자 이하,
- 점(.)로 구분되며, 뒤에는 슬래시(/)가 붙음
- DNS의 하위 도메인으로, DNS 레이블
- 예) kubernetes.io/와 k8s.io/
- 이름 :
- 필수
- 63자 미만
- 작과 끝은 알파벳과 숫자([a-z0-9A-Z]), 대시(-), 밑줄(_), 점(.) 사용
Field Selector
- 쿠버네티스 리소스를 선택하기 위해 사용
- 예) kubectl 커맨드는 status.phase 필드의 값이 Running 인 모든 파드를 선택
- 연산자 : =, ==, !=
- 여러개 리소스