본문 바로가기

Study/kubernetes

kubernetes 강의 #1

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가지
  1. docker 실습하는 경우, docker host 역할
  2. 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 버전 2 설치, 업데이트 및 제거 - AWS Command Line Interface

이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.

docs.aws.amazon.com

  •  AWS CLI 자동완성

https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-completion.html#cli-commandcompletion-configure

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

 

index.docker.io/

 

Docker Hub

We and third parties use cookies or similar technologies ("Cookies") as described below to collect and process personal data, such as your IP address or browser information. You can learn more about how this site uses Cookies by reading our privacy policy

index.docker.io

 

manifest 확인 -> 이게 Dockerfile

 

github.com/nginxinc/docker-nginx/blob/3fb70ddd7094c1fdd50cc83d432643dc10ab6243/stable/debian/Dockerfile

 

nginxinc/docker-nginx

Official NGINX Dockerfiles. Contribute to nginxinc/docker-nginx development by creating an account on GitHub.

github.com

이미지를 어떻게 생성했니? 하는 명세서

 

 

여러 개의 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[이미지 버전]

hub.docker.com/

 

Docker Hub

Build and Ship any Application Anywhere Docker Hub is the world's easiest way to create, manage, and deliver your teams' container applications.

hub.docker.com

 

(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 계정으로 작업을 수행합니다.
도커설치하기
  1. 실습파일 확인해보기 upload 클릭 -> gowebapp.tar.gz 를 업로드한다.
  2. -> userxx.pem 업로드한다.
  3. MobaXterm 에서 현재 접속한 세션의 sftp 를 클릭한다.
  4. 간단한 도커컨테이너 생성해보기
  5. 프론트엔드 어플리케이션의 이미지를 생성하기 위한 도커파일을 만드세요
  6. gowebapp 이미지 생성하기
  7. 백엔드 어플리케이션이미지 생성을 위한 도커파일만들기
  8. gowebapp-mysql 도커이미지 생성하기
  9. 로컬레파지토리에 생성된 이미지 확인해보기
  10. 백엔드와 프론트엔드 컨테이너를 연결하기 위한 네트웍생성
  11. 백엔드 와 프론트엔드 컨테이너 실행해보기
  12. 1분정도 기다렸다가 프론트엔드컨테이너를 실행한다.
  13. 브라우저를 띄우고 gowebapp 어플리케이션에 접속해보자
http://node1_ip:9000
계정을 임의로 생성하여 로그인하고 원하시는 텍스트를 입력하고 save 해보자. save 가 정상적으로 동작하면 프론트엔드 gowebapp 이 백엔드 gowebapp-mysql 과 정상적으로 연동되고 있다는 것이다.
  1. gowebapp-mysql 컨테이너에 접속하여 위에서 생성한 계정정보와 텍스트가 데이타베이스에 정상적으로 저장되었는지 확인해보자.
  2. 컨테이너에 대한 정보 확인해보기
  3. 생성한 컨테이너 삭제하기
  4. 로컬레파지토리에 저장된 로컬이미지를 docker hub 레파지토리에 push 하자.
  5. http://hub.docker.com

 

'Study > kubernetes' 카테고리의 다른 글

kubernetes 강의 #4  (0) 2021.01.15
kubernetes 강의 #3  (0) 2021.01.14
kubernetes 강의 #2  (0) 2021.01.13