일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- SFINAE
- 42seoul
- psql extension
- 프라이빗클라우드
- c++
- 레이캐스팅
- 텍스트북
- 스타트업
- 어셈블리어
- adminbro
- uuid-ossp
- 창업
- 부동소수점
- raycasting
- 파이썬
- Cloud Spanner
- 쿠버네티스
- 어셈블리
- enable_if
- schema first
- mistel키보드
- 이노베이션아카데미
- 스플릿키보드
- 42서울
- 도커
- 자료구조
- GraphQL
- 엣지컴퓨팅
- 동료학습
- 정렬
- Today
- Total
written by yechoi
[ft_services] 도커를 바탕으로 쿠버네티스 이해하기(1) - 생성 본문
42cursus에서 ft_services 과제를 할 때 가장 애먹었던 건 쿠버네티스의 개념을 이해하는 것이었다. 공식 도큐먼트를 읽는 건 물론 쿠버네티스 관련 책도 사서 보고 블로그 글도 많이 읽었는데, 용어가 너무 어려워서 개념이 구체적으로 잡히진 않고 둥둥 떠다녔다.
과제를 끝날 때 쯤에야 개념을 이해했는데, 돌이켜 생각하면 도커에 비교하면 이해가 더 빨랐을 듯하다. 이에 도커에 비교해 쿠버네티스의 기능과 각종 커맨드들을 설명해보려고 한다. (이 글은 도커에 대한 이해를 전제한다. 혹여 간단히 설명하느라 왜곡이 발생했다면, 댓글로 피드백을 주면 도움이 될 것 같다.)
도커, 하나의 컴퓨터 vs. 쿠버네티스, 여러 개의 컴퓨터
도커는 가상 머신에 많이 비교된다. 물론 엄밀히 말하면 가상 머신과 다르고 다르기 때문에 더 각광받는 거지만, 설명의 편의를 위해서 도커는 하나의 가상 컴퓨터라고 하겠다.
도커가 가상의 컴퓨터를 하나 띄운 거라면, 쿠버네티스는 여러개의 컴퓨터로 '클러스터'를 만든 것이다. 여러개의 컴퓨터는 서로 연결돼 서비스를 제공할 수 있다.
도커와 쿠버네티스의 또 다른 큰 차이점은 '상태 관리'가 가능하다는 것이다. 도커와 달리 쿠버네티스는 가상 컴퓨터가 죽으면, 자동으로 켜주는 일을 할 수 있다. 이러한 기능을 헬스체크라고 한다. ft_services에서는 이러한 기능을 요구하고 있으며, 이를 위해선 liveness probe에 대한 개념을 찾아보는 게 좋다.
도커, 컨테이너 만들기 vs 쿠버네티스, 파드 만들기
도커에서 띄운 가상의 컴퓨터를 '컨테이너'라고 불렀다. 쿠버네티스에서 띄운 가상의 컴퓨터는 '파드'라고 부른다. 파드는 컨테이너 하나 또는 그 이상으로 이뤄진다.
도커에서 컨테이너를 만드는 과정과 쿠버네티스에서 파드를 만드는 과정은 많이 닮아있다. 우선 도커에서 컨테이너를 만드는 방법을 생각해보자.
docker build -t IMAGE_NAME .
등으로 IMAGE_NAME으로 이미지 빌드docker run --name CONTAINER_NAME -it -p 80:80 -p 443:443 IMAGE_NAME /bin/bash
같은 식으로 컨테이너 런
쿠버네티스에서 파드를 만들 때도 도커 이미지가 필요하다. 1번과 같은 작업을 해주면 된다.
그 이후에 파드를 만드는 건, 설정 파일이 필요하다. 도커 컨테이너를 런 할 때는 -p 80:80
옵션으로 포트를 열어주는 것처럼 명령어로 각종 설정을 넣어줬다. 쿠버네티스에서는 이런 설정을yaml
형식으로 된 파일에 넣어둔다. 아래는 nginx yaml 파일 예시.
apiVersion: v1
kind: Service
metadata:
name: nginx-service
labels:
app: nginx
spec:
selector:
app: nginx
type: LoadBalancer
ports:
- port: 80
name: http
protocol: TCP
targetPort: 80
- port: 443
name: https
protocol: TCP
targetPort: 443
- port: 22
name: ssh
protocol: TCP
targetPort: 22
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
selector:
matchLabels:
app: nginx
replicas: 1
template:
metadata:
name: nginx-pod
labels:
app: nginx
spec:
containers:
- name: nginx-container
image: nginx-image
imagePullPolicy: Never
ports:
- containerPort: 80
name: http
- containerPort: 443
name: https
- containerPort: 22
name: ssh
livenessProbe:
initialDelaySeconds: 20
periodSeconds: 10
timeoutSeconds: 5
tcpSocket:
port: 22
이 yaml 파일에는 두 가지 내용이 들어있다. 하나는 service
에 관한 내용이고, 또 다른 것은 deployment
다.
이 쯤에서 두 개념을 설명하자면 먼저 deployment
는 파드의 성격 자체를 정의한다. 도커 이미지로 nginx-image를 쓸 것이고, 컨테이너는 nginx-container 하나, 포트는 80, 443, 22를 사용하기로 한다. 그리고 앞서 설명한 죽은 컴퓨터를 알아서 살리는 기능인 liveness probe 설정도 들어가 있다.
service
는 이 파드를 외부로 어떻게 노출할 것이냐에 대한 설정이다. 우리는 nginx에선 서비스에 공인 IP를 할당해 줄 것이므로 type엔 LoadBalacer를 택할 것이다. 외부 노출 없이 클러스터 내부 IP에 대해서만 노출하고 싶으면 ClusterIP를 택하면 된다. 더 많은 설명은 공식 문서 참고. ( 📎 서비스에 대한 doc1, 서비스에 대한 doc2)
yaml 파일로 설정을 완료했다면, 명령어로 적용해서 파드를 구성하면 된다.
그래서 우리가 사용하는 명령어는
docker build -t IMAGE_NAME .
로 이미지 구성kubectl apply -f NAME.yaml
파드 형성
(2)편에선 파드의 상태 확인, 파드 삭제, 파드에 저장소 붙이는 법 등을 알아본다.