kubernetest 강의
1/12 ~ 1/15 (4일)
Container Orchestration (Docker & kubernetes)
container 구동하기 위해 runtime이 설치되어져 있는 - docker 실행
orchestration -> 관리
container runtime은 os 설치 그 위에 container -> 이게 system
- system machine
- virtual machine
우리는 public cloud - AWS가 제공하는 instance (vm)을 이용해서 실습 진행
실습환경준비
container -> app
[ web -> db ] -> app
gowebapp / gowebappmysql
2 tier 구성
AWS 환경준비
- 아마존 IAM 계정으로 로그인
my region - 아시아 태평양(서울)
container를 실행하기 위해서는 runtime(docker runtime) - 아래에 OS (windows / linux / mac)가 필요함
EC2 instance 생성
- EC2 -
container |
runtime |
OS |
우리의 목표는 우리의 app이 안정적이고 민첩하게 구동하는 것!
누군가가 container를 관리해주는게 필요 (resource, 죽었나 살았나, scaling 은 잘되는가, 등등)
-> k8s
c c c
------
k8s
AWS가 K8S 플랫폼 환경 대신 만들어줄테니 여기서 쓰면 됨
AWS EKS 서비스를 이용해서 k8s 환경을 만들면 됨
- EC2 역할 2가지
- docker 실습하는 경우, docker host 역할
- k8s cluster API server에 접속하는 역할
VPC (subnet 집합) -> EC2 instance가 연결된 걸 subnet 이라고 함
VPC는 public에서 access 할 수 있게 함
AWS는 subnet 10.xxx
AWS 네트워크 - VPC 생성
서브넷 생성
EC2 instance
우리 개인 PC를 통해서 SSH -> VPC 10.0.0.0/16
10.0.1.0/24 (자동할당 IP 수정) => 이 네트워크에는 사설 ip도 줘야해 라고 지정해줘야함
EC2 - 인스턴스(가상머신) 생성
만드는 이유는 docker host를 띄우기 위해서임
서비스 -> 컴퓨팅 -> EC2 인스턴스 -> 인스턴스 시작하기
• 1단계 : Ubuntu Server 18.04 LTS (HVM), SSD Volume Type
• 2단계: t2.micro ( vcpu : 1 , memory : 1G ) 선택
• 3단계: 퍼블릭 IP 자동할당 ( 활성화) 확인, 나머지는 모두 기본값으로 설정(새VPC 생성, 새서브넷생성)
• 4단계: 8G 범용SSD
• 5단계: 태그
• 6단계: 새보안그룹생성 -> 규칙추가 -> 모든 트래픽, 소스 ( 0.0.0.0/0)
EC2 instance에 container도 올릴거니까 규칙 추가
• 검토및 시작 -> 시작하기
• 새로운키페어생성 -> 키페어이름 : userxx -> 키페어다운로드 -> userxx.pem 파일을 다운 로드 하여 로컬데스크탑에 저장해둔다.
• 인스턴스시작
• 배포한 인스턴스에 대한 정보 확인
SSH 접속
지금은 접속이 안되고
1. Internet gateway 생성
2. routing table에 가서 0.0.0.10/ -> 이걸 internet gateway로 보내 라고 지정해줘야함
다시 SSH 연결
명령어 입력
- AWS CLI v2 설치
• https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/install-cliv2.html
sudo -i
apt-get install -y unzip curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
aws --version
- AWS CLI 자동완성
sudo -i
apt-get install -y
unzip curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
aws --version
which aws_completer => aws_completer 의 위치를 찾아본다.
complete -C ‘/usr/loca/bin/aws_completer’ aws
source ~/.profile
Docker Setup - Client
docker-ce -> docker server (docker engine) // ce -> community edtion
docker-ce-cli -> docker client 도커 명령어 -> 도커 서버한테 명령어 전달됨
containerd.io
-> image file 을 가져다가 container 형태로 mysql db를 구동할 수 있다.
container
-------------
container
--------------
os
- Linux에 Docker Client 설치
• curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# Pick the release channel.
• add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable”
-> ubuntu 용이기 때문에 repository 등록
필요한 패키지 3가지 설치하기 위해서 위에 명령어 등록
docker server
(docker engine) (containerd) (runc) (docker-init)
(os)
docker engine
1. docker cli 실행 (cmd)
2. container image 관리
3. container 연결 네트워크 만들어주거나, storage volume 생성
(docker engine은 직접 os가서 process를 실행하진 못함)
container d : container image를 가져다가 container 실행 (runc 같이 설치됨) => 오픈소스
runc: host os 에서 container를 process로 실행시켜주는 것 => 오픈소스
docker-init: k8s 플랫폼에서 실행했을 때 누군가가 container를 띄울수 있는 환경이 있음
Docker Container
docker
web application cloud native 하게 만들어야한다?
-> cloud에 배포할 수 있는 형태
cloud의 속성을 보면 됨
1) 자원이 무제한이라는 속성
application을 각각의 function으로 쪼개서 scalable하게 가져가는 것이 효과적임
훨씬 더 나은 성능과 안정성 있게 배포 할 수 있음
2) 인프라
여러 옵션들 중에서 선택을 하는 것이지 환경 설정을 위해서 일일히 설치하지 않음
단일 컨테이너 이미지만 있으면 어디서든 host os(ubuntu, centos, 등) 상관없이 컨테이너를 구동할 수 있는 인프라만 있으면 application, container 구동을 할 수 있음
container runtime만 있으면 단일 컨테이너 이미지를 가지고 어디서든 똑같이 배포, 구동할 수 있음
scaling up - resource 늘리는 것
scaling out - instance 늘리는 것 server 여러개 배포하는 것
app 은 민첩성 중요, 빠른 반응
agile, velocity, fast update
무중단 배포, rollback
Micro Servie Architecture (MSA)
분산 컴퓨팅 환경에서 각각의 service를 container로 배포하고 Rest API call로 호출 / 확장도 용이
가상머신 vs Docker
app -> MSA
vm은 각각 OS를 구성하기엔 overhead 발생
process 발행
1. back ground process
2. ...
Docker Image & Container
docker run --name web01 -d -p 8080:80 library/nginx:1.18 (index.docker.io/library/nginx:1.18)
처음에는 이미지가 없으니까 pulling 해서 가져오고
그 이후에 web02 이미지를 run (container 생성) 했을 땐 기존 이미지가 있으니 또 다시 pulling 하진 않음
현재 실행되는 컨터이너 보고 싶다
> docker ps
manifest 확인 -> 이게 Dockerfile
이미지를 어떻게 생성했니? 하는 명세서
여러 개의 layered 되어져 있음
web01 안에 들어간 것
기본 container는 bash shell로 들어감
> docker exec -it web01 /bin/bash
root@6718ab9aaaf1:/# env HOSTNAME=6718ab9aaaf1 PWD=/ PKG_RELEASE=2~buster HOME=/root NJS_VERSION=0.4.4 TERM=xterm SHLVL=1 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin NGINX_VERSION=1.18.0 _=/usr/bin/env root@6718ab9aaaf1:/# |
우리가 pull 받은 nginx/1.8 에 있는 env와 같은 내용
http://13.124.196.190:8080/
container는 ephemeral(임시적)이다!
docker image는 read only
> docker ps -a
> docker pause web01
> docker inspect web01
Docker Image
- 가상머신 생성 시 사용하는 ISO와 유사한 개념의 이미지
- 여러 개의 층으로 된 바이너리 파일로 존재
- 컨테이너 생성 시 읽기 전용으로 사용 (업데이트 안되므로, 새로운 파일 이미지를 생성해야함)
- 도커 명령어로 레지스트리로부터 다운로드 가능 (pull, push) (컨테이너 이미지로 서비스를 하는 것은 레지스트리 서비스)
- (default: 'index.docker.io/') apexacme[저장소 이름]/ubuntu[이미지 이름]:18.04[이미지 버전]
(index.docker.io/)gklab[저장소 이름]/gowebapp[이미지 이름] : v1 [이미지 태그]
- 저장소 이름: 이미지가 저장된 장소, 이름이 없으면 도커 허브(Docker Hub)로 인식
- 이미지 이름: 이미지 이름, 생략 불가
- 이미지 버전: 이미지 버전 정보, 생략 시 latest 로 인식
Docker Container
- 도커 이미지로부터 생성
- 기된 파일 시스템, 시스템 자원, 네트워크를 사용할 수 있는 독립공간 생성
- 이미지를 읽기 전용으로 사용, 이미지 변경 데이터는 컨테이너 계층에 저장
Layered Architecture
[Layer C / Layer B / Layer A] = ubuntu
[nginx / Layer C / Layer B / Layer A] = nginx
[web app source / nginx / Layer C / Layer B / Layer A] = web app
똑같은 내용이 들어간 것을 또 만들 필요가 없고 사용하면 됨
Docker Image를 Layered 하게 가지고 있음
- Image: 여러 개의 읽기 전용(Read Only) 레이어로 구성
- Container: Image 위에 R/W 레이어를 두고, 실행 중 생성 또는 변경 내용 저장
Docker Image Path
(docker.io/library/) [default] ubuntu:14.04
my.private.image:6000 [private host url] / hello-app [image name] :23[build id]
- 이미지 Path는 <URL>/<manespace>/<Image_name>:<tag> 형식
- library는 도커 허브 공식 이미지 Namespace로, 여기에 사용자 이름이 위치
도커 실습 가이드
Dockerfile
FROM ubuntu
COPY ./code /opt/gowebapp
COPY ./config /opt/gowebapp/config
EXPOSE 80
WORKDIR /opt/gowebapp/
ENTRYPOINT ["/opt/gowebapp/gowebapp"] -> container 실행할 때
도커실습가이드 sudo -i 모든 작업은 root 로 하세요!! - 실제 업무환경에서는 root 허용을 보안상의 이유로 허용하지 않지만 테스트환경에서 sudo 권한의 작업을 쉽게 하기 위해서 root 계정으로 작업을 수행합니다. 도커설치하기
계정을 임의로 생성하여 로그인하고 원하시는 텍스트를 입력하고 save 해보자. save 가 정상적으로 동작하면 프론트엔드 gowebapp 이 백엔드 gowebapp-mysql 과 정상적으로 연동되고 있다는 것이다.
|
'Study > kubernetes' 카테고리의 다른 글
kubernetes 강의 #4 (0) | 2021.01.15 |
---|---|
kubernetes 강의 #3 (0) | 2021.01.14 |
kubernetes 강의 #2 (0) | 2021.01.13 |