🔴 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
에서 다룰 수 있는 컨테이너의 개수가 많지 않았음..)