Virtualization
4
게임회사 (방학)
사용자의 요청에 따라 하드웨어 자원을 효율적으로
사용할 수 있음.
12 (3 +9)개의 container로 처리가능함.
학교Zoom (방학)
Traffic
Traffic
Traffic
Traffic
Traffic
Traffic
Traffic
Traffic
Traffic
게임회사(방학X)
학교Zoom (방학X)
Traffic
Traffic
Traffic
Traffic
Traffic
Traffic Traffic
Traffic
Traffic
Traffic
Traffic
Traffic
Traffic
Traffic
Traffic
Virtualization
5
1. VM도 가능하다.
2. Docker를 이용해도 가능하다.
Q. k8s와 무슨 차이인가?
결과적으로 CI/CD 때문이다.
좌측 사진은 실제 서비스의 구조
복잡도는 높다. VM으로 관리할 경우
비용이 크다. (그래서 컨테이너)
Docker로도 구현가능하나
자동화되지 않았다.(그래서 k8s)
지속적 통합과 지속적 배포를 위해
k8s는 필요하다.
Virtualization & CICD
6
서버관리자. Ubuntu 20.04
개발자
Ubuntu 20.04
MAC OS 12.6
MAC OS 11.6
WSL
Win 10
Remote Test : F
Local Test : P
Local Test : P
Local Test : P
Local Test : P
Local Test : P
Remote Test : F
Remote Test : F
Remote Test : F
Remote Test : F
Win 11 Local Test : P
개발자가 열심히 개발하였으나, 개발환경에서 일어나는 환경문제로 인해, 오류가 발생하는 경우가 있음.
(E.g 과제제출했는데 내 노트북에선 통과, 교수님의 노트북에서는 버그)
개발환경까지 Package하여 배포할 수 있음. -> 컨테이너
Virtualization & CIDI
7
Chroot, namespace, cgroup를 사용하여 Process단위로 APP이 구동됨.
개발환경(OS, Lib ETC ) + 개발한 프로그램 자체가 하나의 Process가 되는
기적
Cgroup -> CPU 코어할당
CPU 시간, 시스템 메모리, 네트워크 대역폭 등의 자원을 프로세스 그룹 단
위로 제어하는 리눅스 커널의 기능이다.
Namespace -> 프로세스 범위 할당
같은 이름의 함수나 변수도 각기 다른 프로세스에서는 서로 UNIQUE
Chroot -> 디렉토리 할당.
프로세스가 실행되는 루트를 변경하는 시스템콜이다.
root(/) 디렉토리를 기준으로 다른 파일을들 탐색할 수 있음
어떤 A라는 프로세스를 '/'가 아닌 그 밑의 특정 디렉토리를 루트디렉토리로
가지게 만들면 A프로세스는 '/'를 root로 가지는 다른 파일에 접근할 수 없게
된다.
???
[Virtualization & CIDI] Chroot
8
/
root user
bin lib
bash
ls pwd cat Fire wire
user2
리눅스는 /라는 root directory
/는 막강하다.
rm -rf ./하면 시스템이 붕괴된다.
사용자에게 이런 권한을 주어도 될
까?
그래서 안드로이드는 사용자에게
이런 권한을 주지 않는다.
이처럼 관리자 권한을 바탕으로 쓸
수 있는 프로그램을 격리 할 수 있
는 것이 chroot다.
예시 chroot user2 /bin/bash
[단 busybox 파일을 모두 user2로
옮겼다고 가정]
Isolated dir
예시 명령을 입력하면 이곳이 /
Linux기본 dir,Busybox
• User별 PID이다.[/proc 에서 확인가능]
• Pid안에는 ns라는 dir이 있는데
• 열어보면 현재 구동중인 ns의 id값을 알
수 있음.
• 즉, 네임스페이스는 프로세스가
동작하는 영역을 의미함
9
[Virtualization & CIDI] namespace
[Virtualization & CIDI] namespace
10
# 유저 격리 & PID 격리
# --map-root-user : 루트 사용자를 네임스페이스에 매핑(새 네임스페이스 안에서 루트 권한이 있음)
# 프로세스 분기(bash)
unshare --user --pid --map-root-user --mount-proc --fork bash
ps -ef
# 다음과 같이 process들이 격리됨을 확인할 수 있다.
Unshare namespace 격리 명령어
네임스페이스 격리한다. 사용자, PID를 루트 사용자를 네임스페이스에 맵핑 해주며,proc 마운트 , bash
fork해줘라
[Virtualization & CIDI] namespace
11
/
user
bin lib
bash pwd cat Fire wire
user2
Busy Box
Isolated dir
proc
kakaoTalk
User에서
Ps – l을 해도
kakao Talk 을 확인할 수 없음.
Busy Box
12
• /proc에서 확인 할 수 있었던 것처럼
• /user2/proc에 kakaoTalk를 넣고
• /user1 에서 ps 명령을 입력하면 kakao Talk를 확인할 수 없음
• 즉, Isolated
• 리눅스는 아래의 네임스페이스를 지원함.
• Cgroup 네임스페이스(cgorup)
• PID 네임스페이스(pid)
• UTS 네임스페이스(user)
• ETC
[Virtualization & CIDI] namespace
13
[Virtualization & CIDI] cgroup
Cgroup(Control Group)
H/W에 대한 제한을 걸 수 있는 Linux Kernel function
- Memmory
- Cpu
- I/O
- Net
- Device /dev에 device drive가 있음.
- Gpu (Nvida는 driver를 오픈하여 가능함.)
오른쪽 예제 cgruop 생성 및 한memory 제한
Sudo cgcreate –a knu –g memory:testknu명령어를 입력하면
/sys/fs/cgroup/*/knu경로에 옆과 같은 파일들이 생김.
echo 2000000 > /sys/fs/cgroup/memory/testknu/memory.kmem.limit_in_bytes
testknu라는 디렉토리에 하드웨어 종류를 확인할 수 있는데 2mb를 2000000바이트로
환산하여 입력하면 됨.
컨테이너의 원리 끝!
14
[Virtualization & CIDI] Container/ Containerd
1. Chroot 로 bin과 Lib 폴더를 user2로 격리하고
2. Namepsace또한 따로 격리해주고
3. Cgroup 으로 h/w를 제한한 뒤
4. 그 공간에서 python 및 node.js 로 프로그래밍
5. User2폴더자체를 zip OR packaging 하면???
= > container. 기술
15
[Virtualization & CIDI] what is Docker?
1. Docker는 2013년에 출시한 container 기반의
가상화 추상화 계층을 제공하는 상품이름이자
기업의 이름이다.
2. VM보다 유지보수가 용이함.
3. Dependencies를 개발자의 노트북과
Operation(e.g Server Admin)의 환경을 통일
할 수 있음.
즉, Build Share Run 모두 용이하다.
VM도 snap shoot하면 가능하다.
그러나 무겁고 비효율적.
H/W Driver ETC 목적에 필요없는 파일이 많음.
17
[Virtualization & CIDI] Only Docker?
2013년 Docker의 출시 이후 많은 개발자와 회사들이 Docker를 사용하였음.
이때는 업계표준으로 Docker가 자리잡았으나,
2015 Brog 와 함께 구글의 Project7(오픈하면서 k8s가 됨)이 공개 됨
Large-scale cluster management at Google with Borg EuroSys '15: Proceedings of the Tenth European Conference on Computer SystemsApril 2015 Article No.: 18Pages 1–
이렇게 Docker는 k8s의 Container Runtime으로 공존
But Docker Engine 이 업데이트 될 때 마다 k8s는 이슈가 발생.
그래서 Docker(법인)과 Google, ETC 모여 OCI(Open Container Initiative) 프로젝트를 시작.
OCI 표준을 준수하는 containerd라는 Container Runtime을 만들고,
Kubernetes에서는 OCI 표준을 준수하는 이미지들을 실행할 수 있는 CRI(Container Runtime Interface)를
제공.
Docker 버전과 무관하게 OCI 표준을 준수하기만 하면 어떤 컨테이너 이미지도 Kubernetes에서 실행가능
한 상태
결론 : 꼭 Docker 쓸 필요없이 Containerd CRI면 모두 가능하다. <- 어디서 찾을 수 있나요?
Container Compiler 혹은 Container를 위한 kernel, hypervisor 같은 존재
19
[Virtualization & CIDI] Only Docker?
Ref : https://www.youtube.com/watch?v=uDOu6rK4yOk
Docker보다 containerd가 좀 더 우수한 성능 (실제로 docker로 k8s 를 구성해도 containerd 를 runtime으로 사용
함.
20
[Virtualization & CIDI] So what is k8s?
From ChatGpt
가상화를 하는 이유와 Docker의 구동원리 장점을 알겠다. 그렇다면 K8s는 무엇인가? CI/DI를 위한 Platform
Version management : git
Container managerment : k8s
Borg 발표 2015년,
Project7은 매우 오래 진행되었다.
21
개발하고 배포하였다고 끝이 아니다.
앞선 비유처럼 (zoom과 game server, Dev/Ops)
유지보수를 해야하며, 서비스가 잘 보존되도록 해야한다.
[Virtualization & CIDI] So What is k8s?
가상화를 하는 이유와 도커의 구동원리 장점을 알겠다. 그렇다면 K8s는 무엇인가? CI/DI를 위한 Platform
26
K8s Namespace
Process관리 및 isolate를 위해 namespace를 지원한다.
이게 왜 필요한가요?
보안, 관리 등의 목적으로 필요함.
Server 관리자 입장에서는 zoom namespace, game namepsace 이런식으로 분류하여 관리함
또한, 복수의 container가 운영되는 만큼 depadancy(환경문제)로 인한 문제를 예방할 수 있음.
Ex)나의 클러스터에서 zoom과 game을 서비스하고 있을 때, game유저가 sql injection같은 기법으로 process를
탐색할 수도 있고,(극단적 경우)
28
K8s Namespace
Namespace 추가
kubectl config set-context blue@kubernetes --cluster=kubernetes --user=kubernets-admin --
namespace=blue
기본 Namespace 설정
kubectl config use-context blue@kubernetes
kubectl delete namespaces ornage
29
Pod
Pod는 k8s의 최소 기능단위로 1개 이상의 컨테이너로 구성된다.
(일반적으로 1Pod당 2Container[function + agent]로 구성한다.)
Pod
Pod Pod
Container Container
Container Container
Container
Container
Container
39
Pod == Container?
curl을 한 것은 centos-container에서 했다.
그러나 Local IP는 Pod의 IP이다.
따라서 그것을 처리한 것은 80번 Port를 할당한 nginx-container이다.
Pod = Container라고 오인하면 안됨.
40
Pod == Container?
kubectl logs multipod -c nginx-container
centos-container는 로그없음.
Curl Get 받은 nginx-container이다.
Pod == Container라고 오인하면 안됨.
41
K8s의 핵심기능 중 하나 livenessprobe
모든 Service는 죽는다. 그리고 서버관리자가 다시 복구한다. -> 이것을 자동화한다.
어떻게 가능한가?
1.container마다 정의된 서비스가 다른데 어떻게 주기적으로 진단할까?
( e.g 파일 시스템을 구성했다. 로그정보를 수집하는 파일 시스템인데 Image는 정상적으로
설치되었느나, 서비스가 제대로 동작하지 않는다 이것은 건강하다고 판단할까? )
2.running state임에도 의도와 다르게 동작되는 경우 어떻게 진단할까?
( e.g 컨테이너는 멀쩡한데, 빌드상의 오류가 있을 경우 등)
42
K8s의 핵심기능 중 하나 livenessprobe
Yaml 파일에 다음 유형과 같이 원하는 옵션
을 넣을 수 있다.
43
K8s의 핵심기능 중 하나 livenessprobe
kubectl create -f pod-nginx-liveness.yaml
44
K8s의 핵심기능 중 하나 livenessprobe
kubectl create -f pod-nginx-liveness.yaml
time out 기준은 1초
period(검사주기)는 10초
성공 기준은 1회
실패기준은 3번
45
K8s init conatiner
개발자 김길동씨는 로그인이 되는 웹서비스를 개발하여 컨테이너로 배포하였다.
로그인 기능을 제공하기 위해서는 데이터베이스 컨테이너가 있어야 구동된다.
하나의 Pod에서 데이터 베이스 컨테이너를 먼저 실행하고 웹 컨테이너를 실행해야 한다.
이 경우 사용하는 것이 init container를 활용한 Pod이다.
71
K8s Pod가 recovery되면 IP 가 바뀌는데, 문제아닌가요?
eth0
docker0
podeth0
NGINX:80
eth0
docker0
podeth0
NGINX:80 NGINX:80
Overlay Network
현재 제공 Weave net platform을 사용
73
K8s Pod가 recovery되면 IP 가 바뀌는데, 문제아닌가요?
서비스
(물론 yaml에 있을 수 도 있고, selector로 잡을 수 도 있음. 그러나 서비스로 묶어서 하나로 관리하는게 더 효율)
Pod
10.10.xx
Pod
10.10.x.x
RC OR RS
DP
Serivce
Pod
10.10.x.x
Pod
10.10.x.x
RC OR RS
DP
83
What is OpenWhisk?
Ref : Apache OpenWhisk: Building a Production-Ready Serverless Stack on/for Kubernetes - David Grove
84
What is OpenWhisk?
client
Ref : Apache OpenWhisk: Building a Production-Ready Serverless Stack on/for Kubernetes - David Grove
Openwhisk Docker
Container
(Function)