번개멍
쿠버네티스란 본문
서버를 관리한다는것
보안으로 원격이 접속 되지 상태에서 장애가 발생하게 되면 직접 가서 각 서버를 재구동해야하는 불편함.
vm이란? 물리적인 서버위에 여러개의 애플리케이션을 운영하기 위해 자원을 할당하여 가상의 서버를 만드는것.
Hypervisor 는 실제 물리 서버의 자원을 관리해주는 소프트웨어
ex) nginx라는 웹서버를 띄운다고 하면 해당 서비스는 보통 100MB라고 하는데 이를 띄우기 위해 운영체제도 설치해야하고 각종 리소스 낭비를 가져온다.
컨테이너란?
개별 소프트웨어의 실행에 필요한 실행환경을 독립적으로 운용할 수 있도록 기반 환경 또는 다른 실행환경과의 간섭을 막고 실행의 독립성을 확보해주는 운영체계 수준의 격리 기술
ex) 위와 동일하게 nginx를 웹서버로 띄울경우 별도의 운영체제를 설치하지 않고 실제로 서비스를 올리기 위한 최소한의 리소스만 사용한다.
장점 :
- 운영체제 수준의 가상화 - 별도의 하드웨어 에뮬레이션 없이 커널을 공유해 컨테이너를 실행
- 빠른 속도와 효율성 - 하나의 머신에서 프로세스만큼 실행하는것이 가능
- 높은 이식성 - 도커 엔진 위에 올라가기 때문에 도커가 동작하는 환경이라면 언제든지 공유 및 복제가 가능
- 상태를 가지지 않음 - 컨테이너가 실행 되는 환경은 독립적이기에 다른 컨테이너에게 영향을 주지 않는다.
docker란?
컨테이너 기반의 오픈소스 플랫폼
도커 아키텍처
클라이언트 - 서버 아키텍처를 사용.
docker Client는 docker daemon과 통신 .
docker daemon은 docker 컨테이너를 빌드, 실행 및 배포하는 작업.
docker Client, docker daemon은 UNIX 소켓 또는 Rest API 통신.
Docker Daemon은 Docker API 요청을 수신하고 이미지, 컨테이너 네트워크 및 볼륨과 같은 Docker 객체를 관리함.
Docker Registry는 Docker image 저장하는 보관함 공개 레지스트리로는 Docker Hub가 있고 프라이빗하게 사용할수 있다.
Docker 실습
기본 docker CLI 사용해보기
- image list
C:\\Users\\Mac>docker images REPOSITORY TAG IMAGE ID CREATED SIZE xoska83/hellopy 0.0.1 758e0fd8a12a 37 hours ago 159MB
- ## List Docker CLI commands docker docker container --help ## Display Docker version and info docker --version docker version docker info ## Execute Docker image docker run hello-world ## List Docker images docker image ls ## List Docker containers (running, all, all in quiet mode) docker container ls docker container ls -all docker container ls -aq
- container list
C:\\Users\\Mac>docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f749a602c3ac xoska83/hellopy:0.0.1 "python app.py" 11 hours ago Up 3 seconds 0.0.0.0:4001->80/tcp priceless_zhukovsky 8f505bcaa795 xoska83/hellopy:0.0.1 "python app.py" 11 hours ago Up 7 minutes 0.0.0.0:4000->80/tcp condescending_brattain
- C:\\Users\\Mac>docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f749a602c3ac xoska83/hellopy:0.0.1 "python app.py" 11 hours ago Up 2 minutes 0.0.0.0:4001->80/tcp priceless_zhukovsky 8f505bcaa795 xoska83/hellopy:0.0.1 "python app.py" 11 hours ago Up 10 minutes 0.0.0.0:4000->80/tcp condescending_brattain
Docker image 만들어보기
샘플 프로젝트(docker-getting-started) 1
아래 . 은 이미지를 생성하는데 필요한 파일들이 있는 위치이다.
docker build -t hellopy .
Sending build context to Docker daemon 4.608kB
Step 1/7 : FROM python:2.7-slim
2.7-slim: Pulling from library/python
68ced04f60ab: Pull complete
08b47f0371a2: Pull complete
afa5f7c888db: Pull complete
1fad109bc0a5: Pull complete
Digest: sha256:2117cd714ad2212aaac09aac7088336241214c88dc7105e50d19c269fde6e0f6
Status: Downloaded newer image for python:2.7-slim
---> 9458934200c5
Step 2/7 : WORKDIR /app
---> Running in dfc66ec3a2b1
Removing intermediate container dfc66ec3a2b1
---> 0baf039bff40
Step 3/7 : ADD . /app
---> 80d05fe0119f
Step 4/7 : RUN pip install --trusted-host pypi.python.org -r requirements.txt
---> Running in 19fe4018cf78
DEPRECATION: Python 2.7 reached the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 is no longer maintained. A future version of pip will drop support for Python 2.7. More details about Python 2 support in pip, can be found at <https://pip.pypa.io/en/latest/development/release-process/#python-2-support>
Collecting Flask
Downloading Flask-1.1.1-py2.py3-none-any.whl (94 kB)
Collecting Redis
Downloading redis-3.4.1-py2.py3-none-any.whl (71 kB)
Collecting click>=5.1
Downloading click-7.1.1-py2.py3-none-any.whl (82 kB)
Collecting itsdangerous>=0.24
Downloading itsdangerous-1.1.0-py2.py3-none-any.whl (16 kB)
Collecting Werkzeug>=0.15
Downloading Werkzeug-1.0.0-py2.py3-none-any.whl (298 kB)
Collecting Jinja2>=2.10.1
Downloading Jinja2-2.11.1-py2.py3-none-any.whl (126 kB)
Collecting MarkupSafe>=0.23
Downloading MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_x86_64.whl (24 kB)
Installing collected packages: click, itsdangerous, Werkzeug, MarkupSafe, Jinja2, Flask, Redis
Successfully installed Flask-1.1.1 Jinja2-2.11.1 MarkupSafe-1.1.1 Redis-3.4.1 Werkzeug-1.0.0 click-7.1.1 itsdangerous-1.1.0
Removing intermediate container 19fe4018cf78
---> ffa0a2cf2e6e
Step 5/7 : EXPOSE 80
---> Running in 754d92c042ca
Removing intermediate container 754d92c042ca
---> 16405653ecaa
Step 6/7 : ENV NAME World
---> Running in a4f6de50b4d1
Removing intermediate container a4f6de50b4d1
---> f078e277461e
Step 7/7 : CMD ["python", "app.py"]
---> Running in aa0f23583356
Removing intermediate container aa0f23583356
---> 74286a0628a0
Successfully built 74286a0628a0
Successfully tagged hellopy:latest
docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
hellopy latest 74286a0628a0 About a minute ago 159MB
docker run -p 4000:80 hellopy
* Serving Flask app "app" (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: off
* Running on <http://0.0.0.0:80/> (Press CTRL+C to quit)
detach모드로 백그라운드에서 hellopy구동
docker run -d -p 4000:80 hellopy
62241a8af0788f2ae0a31ac3e266c9902dff57796f1616562db5105e1cbe6646
docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
62241a8af078 hellopy "python app.py" 55 seconds ago Up 54 seconds 0.0.0.0:4000->80/tcp practical_neumann
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
62241a8af078 hellopy "python app.py"
docker container stop 62241a8af078
62241a8af078
Docker image 공유해보기
이미지태그
기존에 만들어 놓은 이미지가 있어야 registry에 push하기 위한 용도의 태그를 생성할 수 있다.
docker login
Authenticating with existing credentials...
Login Succeeded
tnkim ~/git/docker-getting-started
docker tag hellopy xoska83/hellopy:0.0.1
tnkim ~/git/docker-getting-started
docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
hellopy latest 758e0fd8a12a 23 hours ago 159MB
xoska83/hellopy 0.0.1 758e0fd8a12a 23 hours ago 159MB
이미지공유하기
tnkim ~/git/docker-getting-started
docker push xoska83/hellopy:0.0.1
The push refers to repository [docker.io/xoska83/hellopy]
fe83d8eee022: Pushed
78299df7a379: Pushed
dc2088f4e3cc: Pushed
949db7eb12c6: Mounted from library/python
a96c96927e3d: Mounted from library/python
c5f117060f0d: Mounted from library/python
f2cb0ecef392: Mounted from library/python
0.0.1: digest: sha256:2196a20d0cf88311672487fad7097e9c7580922be927030c122268a8a5347eb7 size: 1788
dockerhub registry에서 push된 image확인
push된 remote image를 이용해서 container실행
tnkim ~/git/docker-getting-started
docker run -p 4000:80 xoska83/hellopy:0.0.1
* Serving Flask app "app" (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: off
* Running on <http://0.0.0.0:80/> (Press CTRL+C to quit)
172.17.0.1 - - [12/Mar/2020 13:04:17] "GET / HTTP/1.1" 200 -
172.17.0.1 - - [12/Mar/2020 13:04:19] "GET / HTTP/1.1" 200
컨테이너 오케스트레이션?
컨테이너를 쉽고 빠르게 배포 /확장하고 관리를 자동화 해주는 도구.
컨테이너 오케스트레이션 장점
- 컨테이너 자동 배치 및 복제
- 컨테이너 그룹에 대한 로드 밸런싱
- 컨테이너 장애 복구
- 클러스터 외부에 서비스 노출
- 컨테이너 추가 또는 제거로 확장 및 축소
- 컨테이너 서비스간의 인터페이스를 통한 연결 및 네트워크 포트 노출 제어
그래서 쿠버네티스랑 도커랑 뭐가 다른데?
쿠버네티스란 무엇인가? Kubernetes
컨테이너를 쉽고 빠르게 배포/확장하고 관리를 자동화해주는 오픈소스 플랫폼
Container Deployment
- 기민한 애플리케이션 생성과 배포
- 지속적인 개발, 통합 및 배포
- 개발과 운영의 관심사 분리
- 가시성
- 개발, 테스팅 및 운영 환경에 걸친 일관성
- 클라우드 및 OS 배포판 간 이식성
- 애플리케이션 중심 관리
- 느슨하게 커플되고, 분산되고, 유연하며, 자유로운 마이크로 서비스
- 자원 격리
- 자원 사용량
쿠버네티스가 제공하는 기능
- 서비스 디스커버리와 로드 밸런싱
- 스토리지 오케스트레이션
- 자동화된 롤아웃과 롤백
- 자동화된 bin packing
- 자동화된 self-healing
- 시크릿과 구성 관리
쿠버네티스가 제공하지 않는 기능
- 지원하는 애플리케이션의 유형을 제약하지 않는다.
- 소스 코드를 배포하지 않으며 애플리케이션을 빌드하지 않는다.
- 애플리케이션 레벨의 서비스를 제공하지 않는다.
- 로깅, 모니터링 또는 경보 솔루션을 포함하지 않는다.
- 기본 설정 언어/시스템(예, Jsonnet)을 제공하거나 요구하지 않는다.
- 포괄적인 머신 설정, 유지보수, 관리, 자동 복구 시스템을 제공하거나 채택하지 않는다.
- 추가로, 쿠버네티스는 단순한 오케스트레이션 시스템이 아니다. 사실, 쿠버네티스는 오케스트레이션의 필요성을 없애준다. 오케스트레이션의 기술적인 정의는 A를 먼저 한 다음, B를 하고, C를 하는 것과 같이 정의된 워크플로우를 수행하는 것이다. 반면에, 쿠버네티스는 독립적이고 조합 가능한 제어 프로세스들로 구성되어 있다. 이 프로세스는 지속적으로 현재 상태를 입력받은 의도된 상태로 나아가도록 한다. A에서 C로 어떻게 갔는지는 상관이 없다. 중앙화된 제어도 필요치 않다. 이로써 시스템이 보다 더 사용하기 쉬워지고, 강력해지며, 견고하고, 회복력을 갖추게 되며, 확장 가능해진다.
Reference :https://wooody92.github.io