본문 바로가기

나의 엔키아 생활

[신입OJT] CLOUD R&D / 가상화와 클라우드 / Docker Container / Docker Image, Kubernetes/ 실습

728x90
반응형

**본 수업내용과 자료의 출처는 엔키아 연구소의 이대준부장님에게 있습니다

 

 

클라우드의 범위는 넓지만, 우리가 다루고자 하는 클라우드는 IT인프라와 관련된 클라우드이다. 

인프라와 컴퓨팅 환경의 변화

사내에 서버를 사와서 구축해서 제공하는것이 온프레미스(on-premise) 였었다.

하지만 현재는 Iaas/PaaS/SaaS를 거쳐서 FaaS까지 많이 발전했지!
(왼쪽에서 오른쪽으로 변하는 과정대로 살펴봐보자!)

 

- 서버란?

 

어플리케이션을 하나 개발하기 위해서는 물리적인 서버가 필요하다!
서버 안에는 CPU, MEM, DISK, Network로 구성되어 있고,

서버위에 OS(Unix,Linux,Windows..)를 설치해서 우리는 앱을 만들지!

 

서버 여러개를 연결할때 쓰는것은 L2 스위치이고, 연결된 물리서버들은 각각 private network로 연결되어있다.
L2 스위치는 L3 라우터에 연결되어 인터넷에 최종연결된다! 각 L2와 L3서버 앞에는 방화벽이 존재할 수 있다.


이렇게 모여있는데를 데이터센터 혹은 서버실이라고 한다.

 

 

- 서버 가상화


가상 서버(Virtual Machine)를 이용하는것이다.

(내가 써봤던 그 VM인스턴스 맞음!) 
물리서버를 추상화 시켜주는 하이퍼바이저를 올려주면 가상 서버를 작동가능하다. 

 

**하이퍼바이저란 : 가상머신 모니터라고도 하며, VM을 생성하고 실행하는 프로세스이다.

호스트컴퓨터가 여러 게스트 가상머신을 지원할 수 있도록 한다. 

 

 

가상화의 장점 1. 효율성 
하나의 물리서버 안에 가상서버를 띄워서 다른 서버를 설치해서 사용가능하기 때문에 효율적이다.

네이티브 하이퍼바이저 개념도

위의 사진은 네이티브 방식의 하이퍼바이저이다.

호스트 OS가 필요없는 구조이며, 물리 컴퓨터의 하드웨어상에서 직접 동작한다.

명령어 전환에 대한 오버헤드가 적어서 빠른 속도를 제공할 수 있고, 

물리 컴퓨터를 바로 컨트롤하기 때문에 유연하다. 

 

 

가상화의 장점 2.가용성

 


서버를 라이브/온라인 마이그레이션할때 편하다. (가용성은 서비스를 지속해서 사용할수있는 기능을 뜻한다)

서버묶음을 클러스터라고 부르는데(클라우드를 같이 사용하는 범위), Resource Pool 안의 ESX Server안에서 서로 옮길수 있다. 

 

 

- 네트워크 가상화 

: 기존에 하드웨어로 제공되던 네트워크 리소스를 소프트웨어로 추상화하는 것을 뜻한다. 

물리 서버위에, 하이퍼바이저를 올리고, Virtual Switch를 올리면 된다.

vNIC는 가상 네트워크 인터페이스 카드이다.

 

큰 그림은 L2로 연결된 서버들안에 , virtual switch로 각각의 vm이 구분되고 묶여있으며

서로 private network가 연결되어있고,

그 밑으로 가상서버가 여러개 있는 트리구조라고 이해하자. 

 

 

- SDDC(소프트웨어 정의 데이터센터), Software-defined Data Center의 개념

클러스터 단위로 서버가 모이면 하나의 가상화 데이터센터가 된다.
**호스트는 물리서버를 뜻함. 클러스터 안에 여러개의 호스트가 들어가있다. 

그림을 보고 천천히 이해해보자.

 

- 가상화와 클라우드의 차이점 ?

가상화 : 단일한 물리 하드웨어 시스템에서 여러 시뮬레이션 환경이나 전용 리소스를 생성할 수 있는 기술

클라우드 : 네트워크 전체에서 확장 가능한 리소스를 추상화하고 풀링하는 IT환경이자 방법론

 

 

가상화와 클라우드

** 스케일업은 기존의 서버를 보다 높은 사양으로 만드는 것, 스케일 아웃은 장비를 추가해서 확장하는 방식 

** 클라이언트(Client)와 서버(Server)간의 통신을 상태유지(Stateful) 하느냐, 상태유지하지않음(Stateless) 으로 하느냐 

** 테넌시란 EC2 인스턴스가 물리적 하드웨어에 분산되고 공유하는 방식. 

 

- 서버설치의 차이점 

- 클라우드 분류 

네이버, 아마존등은 public 클라우드를 사용한다고 부른다. private 클라우드는 우리 회사만 쓰는것!

두 클라우드를 같이 쓰는걸 하이브리드 클라우드라고 부른다.

 

 

-IAAS(이아스 서비스)
: 컴퓨터 자원을 빌려준다. cpu코어의 개수, 메모리의 용량, 하드디스크 등등

컴퓨터 자원을 사용자가 원하는 형태로 제공 

-PAAS(파스 서비스)
: 컴퓨터 자원은 물론이고, 플랫폼까지(개발환경) 제공. 

 

-SaaS(사스 서비스)

: 소프트웨어까지 모두 다 제공해주며, 사용자는 그저 사용만 하면 된다.

(구글 메일도 그룹웨어도 사스서비스이겠지)

 

-> 클라우드 서비스 및 가상화 인프라 관리, 클라우드 physical 인프라 관리

private 클라우드와 public 클라우드의 큰 차이!

->우리 회사제품의 모니터링 모듈들..

우리 회사의 기능별 제품들을 대략적으로라도 알고 있자..! 

 

Physical Infra Monitoring - SMS(서버 네트워크 매니지먼트 시스템), NMS(네트워크 장비)

Virtualization/Private cloud - VMM
kubernetes Container Monitoring - KCM 

App monitoring - WPM, DPM 

Service Monitoring - WebAPM, E2E, BSA

우리의 퍼블릭 클라우드는 PCM..! : AWS, MS-Azure, GCP

 

 

- Application 아키텍쳐의 변화

모노리틱 아키텍쳐 vs 마이크로 서비스 아키텍쳐

 

원래는 모노리틱 아키텍쳐 :
하나의 서버에 모든 비즈니스 로직이 들어가있는 형태. 
하나의 중앙 집중화된 데이터 베이스에 모든 데이터가 저장된다.
 
하지만 요즘엔 MSA 즉, 마이크로 서비스 아키텍쳐:
시스템을 여러 개의 독립된 서비스로 나눠서, 이 서비스를 조합함으로써 기능을 제공 
 
 

- MSA지원 플랫폼

 
-도커 컨테이너 : 소프트웨어 컨테이너 플랫폼, 리눅스 컨테이너 기술 적용한 도커 엔진
 
-Spring Cloud : 컨테이너를 가지고 스케줄링해서 개발할수 있는 플랫폼 
 

- 컨테이너? Container 개념

: 어떤 환경에서나 실행하기 위해 필요한 모든 요소를 포함하는 소프트웨어 패키지

: s/w 실행에 필요한 것을 패키지로 구성하여 표준화된 하나의 독립 컨테이너에 저장

: vm과 달리 컨테이너는 전체 OS가 아닌 s/w 필요로 하는 라이브러리 설정만 포함 

: 운영체제별로 존재하는 복잡한 설치 과정을 겪지 않는다.

 

vm과 container의 차이

 

-VM 인스턴스와 컨테이너의 구성차이를 잘 알아두도록 하자. 

 

-Linux Container :

단일 리눅스 호스트에서 컨테이너 독립(isolate)실행을 위한 os가상화 기술

파일 실행은 호스트에서 직접 실행하여 빠르다.

Linux Kernel의 cgroups, namespace를 공유한다. 

 

**namespace란 리눅스의 컨테이너별 독립적 공간을 제공하고 서로가 충돌하지 않도록 하는 기능이다.

독립적인 파일시스템 mnt, 독립적인 프로세스 공간 pid등이 이에 해당한다. 

**cgroups란 자원에 대한 제어를 가능하게 해주는 리눅스 커널의 기능이다. 

 

 

-Docker Container :

Software Container Platform이다. 

리눅스 컨테이너 기술을 적용한 도커엔진을 사용한다.

도커 hub 레퍼지토리를 통한 도커 이미지 관리가 용이하다. 

 

-Docker Image:

Base Image를 기반으로 생성한다.

이전 이미지에서 변경된 내용이 새로운 이미지로 생성.

Docker Hub 저장소에서 이미지관리 

 

 

그리고 ... 컨테이너가 엄청 많아지고 관리하기 힘들때 쓰는게 구글에서 만든 쿠버네티스!

 

- Kubernetes : 

컨테이너 오케스트레이터이다. (실행 및 관리) 

**다른 오케스트레이션 툴에는 docker-swarm, Apache mesos등이 있다

 

쿠버네티스 특징 

 

1. Automatic binpacking : 가용성에 대한 희생없이 리소스 사용과 제약 사항을 기준으로 자동으로 컨테이너 스케쥴

2. Self-healing : 문제가 발생한 노드의 컨테이너를 자동으로 대체

3. Horizontal scaling: cpu와 메모리같은 리소스 사용에 따라 자동으로 동적인 확장 가능

4. Service Discovery and Load balancing : 컨테이너에 고유한 ip를 부여, 여러개의 컨테이너를 묶어 단일 서비스로 부여하는 경우

단일 DNS name으로 접근하도록 로드밸런싱

5. Automatic rollouts and rollbacks : 다운타임 없이 애플리케이션의 새로운 버전 및 설정에 대한 롤아웃/롤백 가능

Kubernetes Control Plane

 

 

쿠버네티스는 컨테이너들을 제어하기위한 마스터라는 제어부가 존재한다. 

파드, POD (최소 컨테이너 한개 이상의 묶음) : 쿠버네티스에서 관리하는 컨테이너 최소단위

 

master node/ 실제 서비스와 관련된 서비스가 올라가는 pod를 worker node라고 부른다. 

 

private 쿠버네티스는 pivotal cloud foundry, openshift등 어디서 다운받는지에 따라 약간 상이하다.

public 쿠버네티스는 AWS의 EKS(kubernetes Service), ECS(Container Service) 가 있다.

MS -Azure는 AKS, gcp는 GKE 라는 이름으로 제공중이다. 컨테이너 기반 PaaS를 지원하는 플랫폼이라고 할 수 있다. 

 

 

 

우리회사의 클라우드와 관련된 제품에 관하여 POLESTAR를 보고 클라우드 수업 끗..!

자사의 제품에 대하여 알고있어야지...!!

https://youtu.be/hrmAPdYk_Ys

 

 

-실습타임

클라우드 실습을 어떻게..?했었는데

일단 AWS의 IAM계정을 하나씩 부여받았다. 

(미터링 - 서버를 얼마짜리를, 얼마나 썼는지 계산해서 한달마다 정산!)

 

각자의 계정으로 가상서버를 하나 만들어보자 ! 

aws- 컴퓨팅 - ec2 인스턴스로 만들어보자 

 

 

이렇게 서울리전에 부장님이 만들어 놓으신 인스턴스가 있어..!

 

-클라우드 네트워크 환경(그림을 보고 인스턴스 항목별 흐름대로 잘 이해해보세요) 

가상서버를 만들기 위한 환경을 만들어줘야한다

amazon VPC 즉 가상의 영역, vpc를 하나 만들고 그 안에 서버를 만들꺼다

가상네트워크는 subnet이라고 부르는데 가상서버를 만들어서 서브넷이랑 연결하면 된다.

서브넷을 L2스위치라고 생각하면 된다. 

서브넷 위에는 라우터스위치가 필요해서 route table이 필요하다. (바깥으로 나갔다가 들어오게하는것)

네트워크acl은 들어오고 나가는 방화벽설정을 해줄수 있고, 서버 앞단에다가도 정책그룹(보안그룹)을 만들어서

서버별로 방화벽 설정을 잘해줄수 있다.

인스턴스에 접근하기 위한 ssh인증서 또한 설정할거야! 

어카운트id는 슈퍼계정이고, iam사용자는 실제 사용하는 유저각각이고, 계정 별 권한을 다르게 설정할 수 있다.

 

1. 서버를 한 번 찍어봐, 보안그룹, 네트워킹, 서브넷id, vpc가 다 보인다. 

2. vpc검색해서 메뉴가보면, 우리가 설정해준 vpc보이고, 우리는 CIDR이 10.1.0.0인것도 보이지? 

3. 서브넷도 들어가보면, subnet- 100과 10이 보인다. 

4. 라우팅 테이블도 들어가서 보면, 인터넷 게이트웨이와 서브넷 id를 걸어놓아서 연결이 가능하게 했다.

5. 인터넷 게이트웨이, 바깥에서 안으로 들어올수 있도록

6.보안의 네트워크 acl가서 보면 인바운드 아웃바운드를 모두 열어놓은걸 볼 수 있다. 

7. 보안의 보안그룹을 봐보면 인바운드규칙은 ssh의 어떤 아이피도 열고, https, 8080열어 놨다. 

모든트래픽은 100.10.0/ 여기만. 서로 연결할 수 있도록

tcp 6443 - 쿠버네틱스땜시 열어놨어용

 

 

이렇게 구경을 하고!

ec2가서 인스턴스 만들어보자 !

많은 os를 이미지화해서 선택해서 쓸수있도록 제공! 

우리는 Centos를 쓸거양

인스턴스 유형은,, 유형별로 요금은 다르긴하지만, 도커를 설치해볼거니까 

키 페어는 서버에 들어갈때 인증서야 하나 만들어주자 (다운로드된 .pem파일 잃어버리지마)

네트워크 설정 기본

우리 가상 vpc를 어디에 만들껀지 설정하자, 서브넷 정보등등 선택해주고

스토리지 구성은 20기가짜리 디스크로 만들어보자 

gp2는 기본, gp3는 점점 고성능..

그리고 인스턴스 시작 해주자 ! 

실무처럼 인스턴스 태그에 들어가서 Owner키도 달아주었다~ (실무에선 사용용도로 value값을 설정해준다)

인스턴스 보고싶다면 인스턴스 활성화된 후 우클릭, 연결 항목 들어가보자

SSH 클라이언트 항목에 들어가서, 서버를 띄워서 인스턴스에 연결해보자 

(맥들은 기본터미널로 했즤만 윈도우들은 MobaXterm이라는것을 사용해서 터미널을 따로 켰다. 그이유는 어떤 기반의

터미널이 필요해서일까? 찾아보자)

 

아까 다운받았더 .pem인증서를 ssh 클라이언트 연결하고자 하는 위치에 넣어준다

 

644로 되어있던 인증서 권한 변경해줬다1(프라이빗 인증서땜시)

그리고 sude -i 루트 뿌리로가서

이 명령어를 따라 쭈욱 순서대로 도커를 설치하고 켜주면

docker ps -a

를 입력하면 잘 설치가 되었는지 확인 가능하다

 

- Docker

컨테이너이다. (기존에 존재하는 다른 컨테이너의 network 환경을 공유, 즉 os도 같이 쓴다)

격리기술이라고 생각하자. 도커를 띄우면 가상화 네트워크(lo,eth0)가 필요하다. 

꼭 가상서버처럼 작동하지만, 다른점은 os가 올라가지 않고 순수 어플리케이션만 설치 가능하다. 

따라서 어플리케이션만 올리고 내려서 자원만 공유해서 쓰기 때문에 굉장히 빠르다. 

물리서버에 컨테이너환겨을 설치해서 활용하는데도있고,

보통은 물리서버위에 가상서버위에 컨테이너를 띄워서 쓴다. 

 

ssh클라이언트 들어가서 ifconfig -a로 확인해보면

docker0라는 브릿지가 하나 생성된게 보인다.

도커 컨테이너를 만들면, 브릿지0부터 만들어지기 때문에,

도커위의 모든 애플리케이션에서는  172.17.255.255 ip를 할당받고, 서로 통신이 할당 가능하다. 

이 ip가 eth0이다. 

 

톰캣을 써보는 명령어 모음 !!! 

 

docker search tomcat

5. Tomcat을 컨테이너로 설치 및 실행 하기

docker search tomcat      <--- https://hub.docker.com/ 에서 nginx 키워드로 검색
docker image pull tomcat:9
톰켓에서 9 이미지를 다운받기 

docker images
# docker image inspect --format="{{ .Os}}" tomcat:9       <---- 이미지의 OS 확인docker run -d -p <Host Port>:
<Container Port> --name <Container Name> <Image>:<Tag>
좀더 상세한 스펙을 보기위해.. 여러가지 정보들을 볼 수 있다. 

# docker run -d -p 80:8080 --name djlee-tomcat tomcat:9docker inspect <컨테이너 이름> | grep IP
이 이미지를 가지고 띄울수 있다. (실제로 이미지를 가지고 컨테이너를 찍어내서 만드는 과정이다, 80과 8080파트 연결해주는것 )
docker inspect djlee-tomcat
하면 상세정보를 확인 가능하다. 
 
docker port <컨테이너 이름>
docker top <컨테이너 이름>
docker exec -it <컨테이너 이름> /bin/bashecho "test djlee tomcat container" > index.html
가상서버 들어가듯이, 톰캣안으로 들어갈수 있다.
톰캣의 pid가 1번이라고 뜬것 잘 봐보자 ! (인잇프로세스가 1번이다, 톰캣이 1번이라는것은 프로세스까지 완전히 격리 시켰다는 이야기)
 

docker cp  ./index.html djlee-tomcat:/usr/local/tomcat/webapps/ROOT/
docker exec -it djlee-tomcat /bin/bash
 --> mkdir -p /usr/local/tomcat/webapps/ROOT# cat <<EOF > Dockerfile
FROM tomcat:9
MAINTAINER djlee
LABEL "name"="tomcat-djlee"ENV path=/usr/local/tomcat/webapps/ROOT
COPY index.html \$path/EXPOSE 8080
CMD ["catalina.sh", "run"]
EOF
#docker build -t djlee-tomcat:1.0 ./
docker imagesdocker run -d -p 80:8080 --name djlee-tomcat djlee-tomcat:1.0docker logindocker tag djlee-tomcat:1.0 semtli/nkia-test:1.0docker push semtli/nkia-test:1.0

 

 

 

 

회사의 master인스턴스에 연결하기 위해 인증서 키파일(.pem)을 루트에 저장해놓고, 인스턴스 실행해서 들어가보자!

sudo -i해서 루트로 진입 후 

kubectl get nodes -o wide명령어를 입력하면

쿠버네티스라는 하나의 클러스터 안에 있는 노드를 보여주는 것이다.

 

kubectl get pods --all-namespaces 명령어를 입력하면

쿠버네티스 관리를 위해서 만들어놓은 pod들을 확인할 수 있따

kubectl get pods --all-namespaces -o -wide

각각의 쿠버네티스들이 어떠한 노드에서 실행되고 있는지 확인 가능하다 

ps -ed | grep docker 보면 도커 실행 안되는거 보인다.

쿠버네티스를 도커보다 좀 더 가벼운 컨테이너디 기반의 엔진을 쓰고있다.

 

728x90
반응형