nayoungs
항상 끈기있게
nayoungs
  • 분류 전체보기 (274)
    • Cloud (21)
      • AWS (15)
      • Azure (3)
      • NCP (2)
      • GCP (1)
    • DevOps (68)
      • Docker (16)
      • Kubernetes (50)
      • CICD (2)
    • IaC (25)
      • Ansible (17)
      • Terraform (8)
    • Certification (4)
    • 금융 IT (5)
    • AI (3)
    • Linux (47)
    • 미들웨어 (5)
    • Programming (7)
      • GoLang (3)
      • Spring (4)
    • CS (25)
      • 네트워크 (17)
      • 운영체제 (5)
      • Web (1)
      • 개발 상식 (2)
      • 데이터베이스 (0)
    • Algorithm (59)
      • 프로그래머스 (36)
      • 백준 (18)
      • 알고리즘 정리 (5)
    • ETC (5)

블로그 메뉴

  • 홈
  • 방명록

공지사항

인기 글

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
nayoungs

항상 끈기있게

DevOps/Kubernetes

[Kubernetes] k8s Label, LabelSelector, Annotations

2022. 5. 17. 22:29
728x90

📌Index

  • Label
  • LabelSelector
  • Annotations

 



✔️ Label

Labels

Label은 AWS의 TAG와 비슷하여, Label은 리소스에 하나 이상 설정할 수 있고, 중복될 수 있다.

Label은 오브젝트의 특성을 식별하는 데 사용한다.

metadata의 키를 사용하며, 키는 중복이 가능하다.

권장 레이블 : 권장일 뿐 must는 아니다.

일반적으로 애플리케이션 이름, 버전, 도구, 만든 사용자 등을 붙여준다.


유효한 레이블 조건

  • 63 자 이하(공백일 수도 있음)
  • (공백이 아니라면) 시작과 끝은 알파벳과 숫자([a-z0-9A-Z])
  • 알파벳과 숫자, 대시(-), 밑줄(_), 점(.)을 중간에 포함 가능

 

참고로 kubernetes.io/와 k8s.io/ 접두사는 쿠버네티스의 핵심 컴포넌트로,

예약되어 있다. (다른 곳에 쓰이고 있다)

 

레이블 확인
$ kubectl get pods --show-labels
$ kubectl get pods <Pod> -o yaml
$ kubectl describe pods <Pod>

예시

$ kubectl get pods --show-labels
NAME    READY   STATUS    RESTARTS   AGE   LABELS
myweb   1/1     Running   0          38m   <none>

 

레이블 생성
  • 명령형 커맨드로 생성하기
$ kubectl label <RESOURCE> <RESOURCE NAME> KEY=VALUE

예시

기존에 있던 리소스에 레이블을 부여해보자. 참고로 KEY 값이 꼭 대문자여야하는 것은 아니다

리소스 리소스명과 리소스/리소스명 모두 가능하다.

$ kubectl label pods myweb APP=apache
$ kubectl label pods/myweb APP=apache

확인

$ kubectl get pods --show-labels
NAME    READY   STATUS    RESTARTS      AGE   LABELS
myweb   1/1     Running   1 (37m ago)   99m   APP=apache
$ kubectl label pods myweb ENV=staging
pod/myweb labeled
$ kubectl get pods --show-labels
NAME    READY   STATUS    RESTARTS      AGE    LABELS
myweb   1/1     Running   1 (38m ago)   101m   APP=apache,ENV=staging
  • yaml 파일로 생성하기
apiVersion: v1
kind: Pod
metadata:
  name: myweb-label
  labels:
      APP: apache
      ENV: development
spec:
  containers:
    - name: myweb
      image: httpd
      ports:
        - containerPort: 80
          protocol: TCP
$ kubectl get pods myweb-label --show-labels
NAME          READY   STATUS    RESTARTS   AGE   LABELS
myweb-label   1/1     Running   0          68s   APP=apache,ENV=development

기존에 있던 레이블을 덮어쓸 때(수정)는 --overwrite 옵션을 사용해야한다.

$ kubectl label pods myweb ENV=staging
error: 'ENV' already has a value (developments), and --overwrite is false
$ kubectl label pods myweb ENV=staging --overwrite
pod/myweb labeled
$ kubectl get pods --show-labels
NAME    READY   STATUS    RESTARTS      AGE    LABELS
myweb   1/1     Running   1 (41m ago)   103m   APP=apache,ENV=staging

 

레이블 삭제
$ kubectl label pods <Pod> <label>-

예시

$ kubectl label pods myweb ENV-
pod/myweb labeled
$ kubectl get pods --show-labels
NAME    READY   STATUS    RESTARTS      AGE    LABELS
myweb   1/1     Running   1 (42m ago)   104m   APP=apache

 

$ kubectl get nodes --show-labels
NAME    STATUS   ROLES                  AGE   VERSION   LABELS
node1   Ready    control-plane,master   15h   v1.22.8   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node1,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node-role.kubernetes.io/master=,node.kubernetes.io/exclude-from-external-load-balancers=
node2   Ready    <none>                 15h   v1.22.8   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node2,kubernetes.io/os=linux
node3   Ready    <none>                 15h   v1.22.8   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node3,kubernetes.io/os=linux



✔️ LabelSelector

LabelSelector는 검색과 리소스 간 연결을 위해 사용한다.

검색 시 -l 옵션을 사용한다.

검색하는 방법 2가지

  • 일치성 기준
  • 집합성 기준

 

일치성(equality base)
  • =
  • == (=와 같음)
  • !=

키(Key)만 매칭시키는 방법은 없다.

예시 1: 레이블이 APP=apache 인 것을 검색

$ kubectl get pods -l APP=apache
$ kubectl get pods -l APP==apache
$ kubectl get pods -l APP=apache
NAME    READY   STATUS    RESTARTS      AGE
myweb   1/1     Running   1 (51m ago)   113m

 

예시 2: 레이블이 APP=apache가 아닌 것을 검색

$ kubectl get pods -l 'APP!=apache'

 

집합성(set base)
  • in
    • kubectl get pods -l 'ENV in (staging)' : ENV에 staging이 있는 경우
    • kubectl get pods -l 'APP in (nginx, apache)' : Value가 여러개 들어갈 수 있음
  • notin
    • kubectl get pods -l 'APP notin (apache)' : apache가 포함되어있지 않는 경우 검색
  • exists: 키만 매칭
    • Value는 상관없음
    • kubectl get pods -l 'APP' : APP 키가 있는 경우 검색
  • doesnotexists: 키 제외 매칭
    • kubectl get pods -l '!APP'



✔️ Annotations

레이블과 비슷지만, Annotaions는 비 식별 메타데이타이다. 식별이 안되므로 렉터도 없다.

단어 자체의 의미는 주석이지만, 엄밀히 말하면 주석은 아니다.

도구 및 라이브러리와 같은 클라이언트에서 이 메타데이터를 검색(접근, Get)할 수 있으며, key:Value 쌍으로 구성된다.

 

어노테이션의 예시

  • 빌드,릴리스 또는 타임 스탬프, 릴리스 ID, git 브랜치, PR 번호, 이미지 해시, 레지스토리 주소 등
  • 로깅, 모니터링, 분석, 감사 리포지터리에 대한 포인터
  • 디버깅 정보 : 이름, 버전, 빌드 정보
  • 사용자 또는 도구/시스템 출처 정보
  • 책임자의 전화번호 또는 호출기의 번호
  • 최종 사용자의 지시 사항

 

Label과 마찬가지로 kubernetes.io/와 k8s.io/ 접두사는 쿠버네티스의 핵심 구성요소를 위해 예약되어있다.

문법도 Label과 거의 동일하다.

 

참고로 Calico를 사용했다면, Calico가 자동으로 파드에 관리 용도를 위해 비 식별 데이터를 붙여놓는다.

 annotations:
    cni.projectcalico.org/containerID: 36a3eacd1d7e1dd89ebb9577ae91509ba15e4c48600f27707937e98d99162efc
    cni.projectcalico.org/podIP: 10.233.92.14/32
    cni.projectcalico.org/podIPs: 10.233.92.14/32

 

 

어노테이션 생성하기

  • 명령형 커맨드로 어노테이션 생성하기
$ kubectl annotate <RESOURCE> <RESOURCE NAME> KEY=VALUE

예시

$ kubectl annotate pods myweb created-by=Jang
pod/myweb annotated
vagrant@k8s-node1:~/annotation$ kubectl get pods -o yaml | head
apiVersion: v1
items:
- apiVersion: v1
  kind: Pod
  metadata:
    annotations:
      cni.projectcalico.org/containerID: 36a3eacd1d7e1dd89ebb9577ae91509ba15e4c48600f27707937e98d99162efc
      cni.projectcalico.org/podIP: 10.233.92.14/32
      cni.projectcalico.org/podIPs: 10.233.92.14/32
      created-by: Jang
  • yaml 파일로 어노테이션 생성하기
apiVersion: v1
kind: Pod
metadata:
  name: myweb-label-anno
  labels:
    APP: apache
    ENV: staging
  annotations:
    Created-by: Jang
spec:
  containers:
    - name: myweb
      image: httpd
      ports:
        - containerPort: 80
          protocol: TCP

 

어노테이션 수정

 

변경 시에는 --overwrite 옵션을 사용해야한다.

$ kubectl annotate pods myweb created-by=Kim --overwrite

 

어노테이션 삭제

 

$ kubectl annotate pods myweb created-by-

 

728x90
저작자표시 비영리 (새창열림)
    'DevOps/Kubernetes' 카테고리의 다른 글
    • [Kubernetes] Controller : ReplicationController와 ReplicaSets
    • [Kubernetes] Pod Lifecycle
    • [Kubernetes] k8s Namespace (feat. 이름과 UID)
    • [Kubernetes] k8s Workload : Pod
    nayoungs
    nayoungs
    안되면 될 때까지

    티스토리툴바