Kubernetes - Object

우야·2021년 5월 24일
0

Kubernetes Object란?

  • 쿠버네티스 시스템에서 영속성을 가지는 오브젝트

Object 관리 방법

  • 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 서브도메인 이름으로 사용할 수 있는 이름이 필요하다. 이것은 이름이 다음을 충족해야 한다는 것을 의미한다.

    1. 253자를 넘지 말아야 한다.
    2. 소문자와 영숫자 - 또는 . 만 포함한다.
    3. 영숫자로 시작한다.
    4. 영숫자로 끝난다.
  • DNS 레이블 이름
    일부 리소스 유형은 RFC 1123에 정의된 대로 DNS 레이블 표준을 따라야 한다. 이것은 이름이 다음을 충족해야 한다는 것을 의미한다.

    1. 최대 63자이다.
    2. 소문자와 영숫자 또는 - 만 포함한다.
    3. 영숫자로 시작한다.
    4. 영숫자로 끝난다
  • 경로 세그먼트 이름
    일부 리소스 유형에서는 이름을 경로 세그먼트로 안전하게 인코딩 할 수 있어야 한다. 즉 이름이 "." 또는 ".."이 아닐 수 있으며 이름에는 "/" 또는 "%"가 포함될 수 없다.

  • UID
    오브젝트를 중복 없이 식별하기 위해 쿠버네티스 시스템이 생성하는 문자열.
    쿠버네티스 UID는 보편적으로 고유한 식별자이다(또는 UUID라고 한다). UUID는 ISO/IEC 9834-8 과 ITU-T X.667 로 표준화

Namespace

  • 쿠버네티스는 동일한 물리 클러스터를 기반으로 하는 여러 가상 클러스터를 지원하고,
  • 이런 가상 클러스터를 네임스페이스라고 한다.
  • 네임스페이스는 서로 중첩될 수 없으며, 각 쿠버네티스 리소스는 하나의 네임스페이스에만 있을 수 있다.

쿠버네티스는 처음에 네 개의 초기 네임스페이스

  1. default 다른 네임스페이스가 없는 오브젝트를 위한 기본 네임스페이스
  2. kube-system 쿠버네티스 시스템에서 생성한 오브젝트를 위한 네임스페이스
  3. kube-public 자동으로 생성되며 모든 사용자(인증되지 않은 사용자 포함)가 읽기 권한으로 접근할 수 있다. 이 네임스페이스는 주로 전체 클러스터 중에 공개적으로 드러나서 읽을 수 있는 리소스를 위해 예약되어 있다.
  4. 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

  • 레이블 셀렉터를 통해 클라이언트와 사용자는 오브젝트를 식별할 수 있음
  • 여러개의 셀렉터 조건 검색시, 또는 &&로 구분
  • 식별 방법
    1. 일치성 기준 (equality-based)
      • 연산자 : =,==,!=
      • 조건을 모두 만족해야함.
      • 예) environment=production,tier!=frontend
        • key가 environment이며 value가 production이고, key가 tier이고 value가 fronted가 아닌것
    2. 집합성 기준 (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 인 모든 파드를 선택
  • 연산자 : =, ==, !=
  • 여러개 리소스
profile
Fullstack developer

0개의 댓글