ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 쿠버네티스 라벨과 애노테이션(kubernetes label, annotation)
    Kubernetes 2018. 7. 26. 09:00
    라벨과 애노테이션은 쿠버네티스에서 자원들의 메타데이터를 관리하는데 사용합니다. 라벨은 셀렉터와 함께 사용되어서 특정 라벨을 가진 자원들을 선택할때 주로 사용합니다. 애노테이션은 의미 그대로 주석 성격의 메타데이터를 기록해 두는데 사용합니다. 라벨과 애노테이션의 가장 큰 차이는 라벨은 쿠버네티스 클러스터 내부에 사용자가 객체를 생성할때 그 객체를 구분하기 위해서 사용자가 임의로 원하는 값을 지정해서 사용합니다. 애노테이션은 라벨처럼 사용자가 원하는 값을 설정하기 보다는 쿠버네티스 시스템에서 필요한 정보들을 표시해 주기 위해서 사용합니다. 

    라벨(Label)
    라벨은 키/값 쌍으로 구성됩니다. 라벨은 사용자가 클러스터내에 객체를 만들때 메타데이터로 붙일 수 있습니다. 생성된 다음에는 언제든지 수정이 가능합니다. 라벨은 쿠버네티스내에서 컨트롤러들이 포드를 관리할때 자신이 관리해야할 포드를 구분할 수 있는 키 역할을 합니다. 라벨만으로 관리 대상을 구분하기 때문에 특정 컨트롤러가 만든 포드라고 하더라도 라벨을 변경하게 되면 인식할 수 없습니다. 컨트롤러와 포드를 느슨하게 결합하는 이런 특징 때문에 쿠버네티스가 포드들을 관리할 때 유연성을 가질 수가 있습니다. 이런 점을 활용하면 실제 서비스에서 운영중인 포드들 중에서 1개를 임의로 따로 떼어내서 확인하는 것이 가능합니다. 이런 기능이 없을 경우 서비스를 운영하는 중에 디버깅이 필요한 경우에는 디버깅용으로 별도의 컨테이너를띄워서 확인하는게 일반적입니다. 하지만 그렇게 했을 경우에는 기존에 발생하던 증상이 재현되지 않아서 확인하기 어려운 경우가 있습니다. 현재 이슈가 발생한 포드만을 서비스에 영향 없이 따로 떼어내서 확인할 수 있다는 건 서비스 운영에 있어서 큰 장점입니다. 이 외에도 다양하게 라벨을 활용할 수 있습니다. 노드에도 라벨을 붙일 수 있기 때문에 클러스터내의 노드들을 라벨을 통해서 구분한 다음 특정 라벨을 가진 노드에만 포드를 띄우는 것도 가능합니다. 실행하려는 앱의 성격에 따라 SSD 디스크를 가진 노드에만 띄운다던가, GPU 카드를 가진 노드에만 띄운다던가 하는 것이 가능합니다.
    라벨의 키는 63자를 넘지 않아야 하고 시작과 끝 문자는 알파벳 대소문자 및 숫자([a-z0-9A-Z]) 여야하고 중간에는 대시(-), 언더바(_), 점(.), 숫자 등이 올 수 있습니다. 키 이름 앞에 /로 구분해서 접두어를 사용할 수도 있습니다. 접두어는 DNS 하위도메인 형식이어야 하고 점(.)으로 구분할 수 있고 253자를 넘으면 안됩니다. 사용자가 직접 사용할때는 접두어 없이 사용하고, 보통 접두어가 붙은 경우에는 쿠버네티스 시스템에서 사용하는 라벨들입니다. "kubernetes.io/" 라는 접두어를 사용합니다. 라벨에서 사용하는 값은 키와 마찬가지로 63자 이하여야 하고 처음과 끝은 알파벳 대소문자 및 숫자([a-z0-9A-Z])가 와야 합니다. 중간에는 대시(-), 언더바(_), 점(.), 숫자 등이 올 수 있습니다.

    라벨은 사용자가 선택해서 사용하기 위해서 붙인다고 했습니다. 라벨을 설정했으면 특정 라벨들만 선택해서 그 라벨에 해당하는 자원들만 관리할수가 있습니다. 이렇게 라벨을 선택할때 사용하는게 라벨 셀렉터(Label selector)입니다. 라벨셀렉터에서 라벨 셀렉터에는 2가지 방식 있습니다. 등호기반(equality-based)과 집합기반(set-based)입니다. 
    등호기반 셀렉터는 같은지(=, ==), 다른지(!=)를 구분하는 연산자를 사용할 수 있습니다. =와 ==은 같은 의미입니다.  다음 처럼 사용할 수 있습니다. 

    environment = develop
    release = stable
    첫번째는 environment가 develop인걸 선택합니다. 두번째는 release가 stable인 라벨을 가진 것들을 선택하게 됩니다. 두 조건을 모두 만족해서 develop이면서 stable인걸 선택하려면 두개를 컴마(,)로 연결해 주면 됩니다.
    집합기반 셀렉터는 여러개의 값을 조건으로 준 다음 해당 키를 가진 라벨의 값이 거기에 속하는지(in), 아닌지(not in)를 확인합니다. 그리고 특정 라벨의 키가 존재하는지(exists)를 조건으로 줄 수도 있습니다. 다음처럼 사용할 수 있습니다.

    environment in (develop, stage)
    release not in (lastest, canary)
    gpu
    !gpu
    첫번째는 environment가 develop이거나 stage이면 선택합니다. 두번째는 release가 lastes도 아니고 canary도 아니여야 합니다. 그리고 release라는 키가 없는 모든 객체를 선택합니다. 세번째는 gpu라는 라벨 키를 가지고 있으면 선택합니다. 이때 값은 확인하지 않습니다. 네번째는 세번째와는 반대로 gpu라는 키가 없으면 선택합니다. 이 조건을 모두 만족하는 AND연산을 하고 싶은면 컴마(,)로 조건들을 연결하면 됩니다.
    두가지 타입을 섞어서 environment = production, release not in (lastest, canary) 이런식으로 사용할 수도 있습니다.


    애노테이션(annotation)
    애노테이션은 라벨과 마찬가지로 키/값 쌍으로 구성됩니다. 라벨처럼 사용자가 붙일 수 있습니다. 라벨과의 차이점은 라벨은 사용자가 특정 라벨을 가진 객체들을 선택하는데 사용하는 것이라면 애노테이션은 쿠버네티스 시스템이 필요한 정보들을 담고 있어서 쿠버네티스 클라이언트나 라이브러리가 활용하는데 사용됩니다. 그래서 일반적으로 애노테이션에서 사용되는 키는 쿠버네티스 시스템이 인식할 수 있는 값들을 사용합니다. 예를들면, 디플로이먼트로 배포할때 변경 사유를 적는 CHANGE-CAUSE(kubernetes.io/change-cause) 정보를 적어 주는데 사용할 수 있습니다. 그외 인그레스에서도 필요한 설정들을 애노테이션을 이용해서 지정해 줄 수 있습니다. nginx-ingress 같은 인그레스 컨트롤러는 애노테이션을 이용해서 nginx에서 필요한 설정들을 사용자가 지정해 줄 수 있습니다. 그외에 사용자가 필요한 정보들을 메모해 두는 용도로 사용할수도 있습니다. 릴리즈 정보, 로깅, 모니터링에 필요한 정보들이나 하다못해 이 객체의 담당자 정보나 비상 연락처를 적어둘 수도 있습니다.






    댓글 1

    • 프로필사진

      label과 annotation이 뭔지, 어떻게 활용하는지 잘 몰랐는데 드디어 이해를 했습니다.
      정말정말 감사합니다!!

      2019.02.02 11:06
Designed by Tistory.