데이터센터프로그래밍15

서유리·2022년 5월 4일
1
post-thumbnail

15-Docker Labels

🔴 What are Docker Object Labels?
◾ 도커에 라벨을 붙이는 것?

  • Images: 도커허브에서 이미지를 가지고 올 때, 이미지 빌드 할 때
  • Containers: 이미지에서 컨테이너를 run 할 때, 직접 이름을 명시해준 경우
  • Volumes
  • Networks
  • Swarm nodes
  • Swarm services
    ➡ 실질적으로 물건은 아니지만, 이전 수업 때, 도커 안에 있는 something에 이름을 지어주는 경험을 했었음

🔴 Why Labels?
◾ 왜 라벨들인가?
🔘 다양한 목적에 의해 라벨을 달 수 있다

  • (1) 이미지들 즉, 하나의 어플리케이션을 도입할 때에 여러개의 이미지들이 필요함
    ➡ 이미지들을 하나의 어플리케이션으로, "버전1이다" 라고 하기 위해 공통된 라벨을 붙이기도함
    ➡ 공통된 서비스 이지만, 버전이 다를 수 있는데, 이를 구분하기 위해서
    ➡ 즉, 도커의 something의 구분이 필요한 경우에 라벨을 달 수 있음
  • (2) 라이센스와 관련된 것들을 저장하기 위함
  • (3) 상호관계 (의미상 묶어줘야하는 것들)
    : containers
    : volumes
    : networks
  • (4) 본인이 만든 비즈니스 or 어플리케이션에 이름을 붙여야 하는 경우

🔴 Labels Keys & Values

  • (1) 라벨은 기술적으로 Keys & Values라고 부름
    ex. 파이썬 프로그램의 "딕셔너리"에는 "키" 값과 "Value"값이 있음
    : 그래서 Key & Value pair가 많이 등장함
    : YAML파일 : Key & Value값이 들어가 있는데, Key & Value값을 매핑하는 구조임
    : 구현하기 위해 Key & Value값이 있는 "튜플"의 형태로 함
    ➡ 즉, 문자형 타입이라고 볼 수 있음
  • (2) 특정 object에 의해서 복수의 라벨을 다는 행위도 가능함
  • (3) Key & Value 값으로 줄 때, "Key"값은 딕셔너리에도 있지만, 변하지 않아야 한다
    (Key에 Value값을 할당 할 때, 값이 변할 수는 있음)
  • (4) YAML파일에서도 실수할 수 있는데, Key & Value값을 선언한 것에서 이후에 중복된 Value값을 주게 되면, 최근에 업데이트한 값으로 Key가 그 값을 받음

🔴 Key Format Recommendations

  • yaml 파일에서 보았다시피, Key & value pair를 구현할 때, 알파벳으로 되어 있는 문자열, 그리고 이들을 의미상 구분할 때, (.)(-)로 구분함
    ➡ 즉, 영문자로 되어있는데 의미상 잘라야 하는 부분에서 (.) 또는 (-)을 사용함
    ➡ 대부분 (.) 는 카테고리에서 소켓테고리와 대켓테고리를 구분할 때 사용함
    (-)는 대등관계(버전, 타입) 일때 사용함

🔴 Key Guidelines (1)

  • 도커에서도 라벨을 사용했는데, 쿠버네티스는 라벨을 좀더 많이 사용함
  • (1) 도메인 이름: DNS, 도메인 이름 쓰는 것은 사람이 쓰는 웹사이트(www.naver.com)와 비슷하지만, 이를 뒤집어서 사용함
    ex) com.example.some-label
    ➡ 위 예시처럼) 점을 찍는 행위는 대분류에서 소분류로 구분할 때 사용함
    ➡ 프로그램을 짤 때에는 뒤집음 (ex. kr.ac.khu)
  • (2) 도메인 이름을 역으로하여 값을 표현해야 한다고 하면, 본인이 도메인의 소속하거나, 관리를 해야함
  • (3) 변수와 비슷한 목적인데, com.docker.*, io.docker.*, & org.dockerproject.*로 시작하는 namespaces(이름들)이 등장함
    ➡ 도커가 점유한 것이므로, 쓰면 안됨
    : 그래서 실질적으로 구현하려고 하면, 알파벳과 (.), (-)으로 함
    : 이들은 주로 타이핑, 실현 가능한 형태로 될 때, 도메인 이름과 비슷한 형태로 정의함
    : 대신 뒤집어 있음
    : 도메인 형태와 비슷하지만, 도메인 이름과 같은 맥락으로 사용함으로 도메인 이름을 쓰려고 한다면, 이를 사용할 자격이 있어야 함

🔴 Key Guidelines (2)

  • (1) 규칙은 소문자로 시작하고 끝남
  • (2) only contain
    : 소문자로 되어있는 글자로만 할 것
    : 대분류와 소분류를 끊을 때 : (.)
    : 타입을 나울 때 : (-)
  • (3) 연속적으로 (.)을 2개이상 찍거나, (-)를 2개 이상 사용하는 것은 금지 (의미 구분을 위한 것이므로)
  • (4) (.)을 찍게되면, 카테고리를 나누는 일종의 "fields" 값으로 받아들일 수 있음
  • (5) 프로그래밍으로 구현 가능한 구체적인 실체를 가져야 하는데, key & value로 되어 있는 것들은 많이 사용했던 JSON (YAML 파일과 1:1로 매칭), XML(엑셀)을 저장할 때, CSV로 하면, 데이터와 value값만 저장됨
    ➡ 프로그래밍할때, JSON - YAML을 가장 많이 사용함
    (6) JSON.stringify() ➡ JSON 형태로 되어 있는 것을 문자로 바꾸라는 의미

🔴 Value Guidelines Example

  • 아래의 예시를 보면, 웹 브라우저에서 "Create JSON string from a JavaScript object"로 나오며
  • {"name":"John","age":30,"city":"New York"} 다음과 같이 값과 키가 나타남
  • html 파일을 열어보면, <script>부분이 있고, <body>부분이 출력될 때, <h2>가 되어있는 부분이 큰 글씨고, <p id="demo"></p>에는 아이디는 있고, 데이터는 없음
  • "demo"에 대한 아이디를 <script>안에 넣고, demo에 대한 아이디를 통해 element를 가져와서 document에 나타나야 할 HTML 글자에 들어 갈 것을 myJSON으로 하라는 의미
  • myJSON 은 문자형(Object)이고, Object는 자바스크립트 안에 있는 형태로 됨

🔴 Label Example (1)

  • "foo" 변수에다 값을 넣어주는 것과 비슷함 : LABEL com.example.label-with-value=“foo”
  • 버전은 1.0 : LABEL version=“1.0”
  • 문자열로 넣어줄 수 있음 : LABEL description=“This text illustrates \ That label-values can span multiple lines.”
  • 프로그래밍 언어에 전역변수 하듯이 변수에다가 값을 줌으로써, 이후 동작시에 활용하게 하는 용도임 : LABEL multi.label1=“value1”
    ➡ 즉, 변수에 값을 넣어준다고 할 수 있고, 오른쪽의 값을 왼쪽에 칭한다는 의미 (=value1은 label1에 칭함)

🔴 Label Example (2)

  • yaml파일 형태로 되어 있어서 Infrastructure as Code 즉, 손으로 타이핑 하지 않고, 프로그램 짜듯이 코드를 만들면, 이를 바탕으로 운영하고, 제어하는 것
  • 라벨을 붙이는 이유는?
  • docker node update --label-add foo label-add bar worker1
    : foo 버전에서 서비스가 돌아갈때, worker1이고, bar에도 worker1이면, 이미지를 업데이트 할 때에 foo에도 업데이트, bar에도 업데이트 할 수 있는 것이고, 다양한 이유로 라벨을 붙일 수 있음

🔴 How to Update Labels
🔘 라벨을 업데이트 할 때 주의사항

  • 라벨은 object가 살아있는 동안에 정적임
  • 라벨을 바꾸려고 하면, object를 다시 생성해야함 (그만큼 신중해야 하며, 한번 정하면, 어플리케이션이 끝날 때까지 유지해야 함)
  • 동적으로 바꿀 수 있고 nodes & services를 바꾸면 됨
    ➡ object가 어떤것인가에 따라 다른데, 컨테이너의 버전 up & down
    ex) A라는 어플리케이션 구현-이미지버전 1.0으로 했을 때, 1.0에 따른 컨테이너들이 있지만, 1.2에 해당하는 컨테이너 이미지들로 만들고 싶다면? 서비스는 연속적인 것임
    : 즉, 서비스는 연속적인데, 서비스 안에 있는 일꾼인 컨테이너가 죽었다가 살아날 수 있음
    : 그래서 동적으로 nodes나 services 라벨을 주어가면서 작업을 할 수 있음
    : 쿠버에서는 라벨이 중요하게 사용하며, 그룹핑을 해줄 것임

🔴 Manage Labels on Objects
🔘 라벨을 달 수 있는 것
(1) Images and containers

  • 이미지와 컨테이너에 라벨을 주는 것
  • 라벨을 두고 이미지와 컨테이너를 구분하는 것
    (2) Local Docker daemons
    (3) Volumes
    (4) Networks
    (5) Swarm nodes
    (6) Swarm services
  • 버전 업 다운 하는 것
    ➡ 핵심!! "어떻게 군을 나눌 것인가?"

🔴 운영수준의 컨테이너 오케스트레이션 "쿠버네티스" : 자동화된 컨테이너 배포, 스케일링과 관리

  • Docker Swarm이 컨테이너 오케스트레이션인데, 구글이 오픈소스로 공개하였고, 쿠버네티스는 구글에서 15년간 프로덕션 워크로드 운영한 경험을 토대로 구축되었음
  • 쿠버네티스는 컨테이너화된 어플리케이션을 자동으로 배포, 스케일링 및 관리해주는 오픈 소스 시스템
  • Docker Swarm처럼 yaml 파일을 주면, 어플리케이션을 띄우고, 서비스 이미지들 기반으로 컨테이너 띄우고, Scale up & down하는 것
  • Docker Swarm에서 직접했었던 일을 쿠버는 더 쉽고, 자연스럽게 하는 기능이 있음

🌟 쿠버네티스를 사용하는 이유

  • (1) 구글에서 15년간 프로덕션 워크로드 운영한 경험을 토대로 구축한 것이어서 검증되었음
  • (2) 대규모의 컨테이너를 다룰 때, 편리한 기능들이 구현되어져 있음
  • (3) 구글이 1주일에 수십억개의 컨테이너들을 운영하게 해준 원칙들에 따라 디자인 되었기에 다룰 수 있는 컨테이너의 개수가 많음 (Docker Swarm에서 다룰 수 있는 컨테이너의 개수가 많지 않았음..)
profile
best of best

0개의 댓글

관련 채용 정보