아쿠의 개발 일지

한화 시스템 부트 캠프 16주차 회고 본문

ETC/한화시스템

한화 시스템 부트 캠프 16주차 회고

디아쿠 2024. 8. 25. 21:42

이거 하고 리팩토링 하러 가야해요

 

프론트 프로젝트가 끝나고, DevOps에 대해서 배웠습니다,, 사실 저번 주 금요일부터 배웠는데 프론트 마지막이기도 하고 DevOps부분은 합쳐서 적는 게 나을 거 같아서 여기로 가지고 오게 됐어요.

 

다들 잘 지내고 계시죠? 회고록을 쓰는 저희 6기분들이 다 사라지셔서 ,, 외롭게 혼자 끄적이고 있습니다.

요즘 날씨도 너무 덥고, 비도 예상치 못하게 그냥 막 오고 이게 맞나 싶은 마음이 많은데 어쩌겠어요.

통학 두 시간 거리인 저도 오니까 여러분들도 꼭 오시길 바랍니다. 제발요. 심심해요.

 

DevOps

DevOps는 소프트웨어 개발(Development)과 운영(Operation)의 합성어로, 소프트웨어 개발과 IT 운영 간의 협업과 통합을 강조하는 문화, 철학, 그리고 일련의 관행을 말합니다. DevOps의 주요 목표는 소프트웨어 개발 속도를 높이고, 더 안정적이고 품질 높은 소프트웨어를 배포하며, 개발과 운영 간의 협력을 통해 시스템 효율성을 극대화하는 것입니다.

 

DevOps를 구현하기 위해 다양한 도구들이 사용됩니다.

  • Jenkins, GitLab CI: CI/CD 파이프라인 구축
  • Docker, Kubernetes: 컨테이너화 및 오케스트레이션
  • Ansible, Chef, Terraform: 인프라 자동화
  • Prometheus, Grafana: 모니터링 및 로깅

DevOps는 단순한 도구나 기술이 아니라, 개발과 운영의 협업을 통해 소프트웨어 개발과 배포 과정을 개선하려는 전반적인 접근 방식입니다.

 

github actions에 대해서 배우게 됐는데 ,

github에서 제공하는 CI/CD 도구로, 코드 저장소 내에서 자동화된 워크플로우를 정의할 수 있습니다.

워크 플로우는 저장소에서 발생하는 이벤트(코드 푸시, PR요청 등)에 따라 자동으로 빌드, 테스트, 배포 등의 작업을 수행하는 것입니다.

 

github actions의 주요 기능에 대해서 배웠고, 일단 깃 레포를 파서 자바 파일들을 다 올려줍니다.

오랜만에 하려니까 ,, 생각 안 나서 일단 정리 해 둠,,,

[이미 있는 프로젝트에 git 추가]
1. git repository 생성
2. 프로젝트 터미널 git init
3. git add ~ 
4.  git branch -M main  (main 브랜치에)
5. git push -u origin main (main에 푸시)

초기 셋팅을 main에 푸시해두고 (리드미 정도) 
develop 브랜치 파서 나머지들 푸시

 

환경 변수를 설정해서 아이디나 비밀번호 같은 중요한 정보들을 감추려고 할 때 사용하는 것인데,

깃허브는 시크릿을 여기서 설정 할 수 있습니다. 참고 하십쇼.

 

시나리오를 적어 보자면

- 개발도구에서 push
- github action 에서 이벤트 감지
- github action에서 워크플로우
- 워크플로우 ssh로 EC2 접속
- 다운로드 폴더 삭제
- git에 업데이트 된 코드를 받아오는 명령어 git clone 깃 주소
- 빌드 ./gradle build
- → 자바 jar 파일 나옴
- 실행중인 프로세스 종료
- 새로운 jar 파일 실행

 

이런식으로 진행이 되는 것입니다 , ! 

 

그 다음으로 말씀 드릴 것은 저 중에 있던

Ansible ?

스토리지, 서버 및 네트워킹을 자동화하는 구성 관리 플랫폼이다.

Ansible을 사용하면 이러한 구성 요소를 자동으로 설정하고 관리할 수 있어, 복잡하고 반복적인 수동 작업을 효율적으로 처리할 수 있습니다.

Ansible의 주요 구성 요소들은 다음과 같습니다:

  • Ansible Control Node
    • 설명: Ansible Control Node는 Ansible을 실행하는 컴퓨터 또는 서버입니다. 여기서 사용자는 Playbook을 작성하고, Ansible 명령을 실행하여 다른 시스템을 관리합니다.
    • 역할: Control Node는 Managed Node에 대해 작업을 수행하는 명령을 보내고, 구성 관리를 주도하는 중앙 허브 역할을 합니다.
    2. Managed Node
    • 설명: Managed Node는 Ansible에 의해 관리되는 대상 시스템들입니다. 일반적으로 서버, 네트워크 장비, 또는 스토리지 시스템이 될 수 있습니다.
    • 역할: Managed Node는 Ansible Control Node로부터 명령을 받아 그에 따라 설정이 자동화됩니다.
    3. Inventory
    • 설명: Inventory는 Ansible이 관리할 호스트 목록입니다. 이 목록은 텍스트 파일, YAML 파일, 또는 다이나믹하게 생성되는 스크립트 형태로 존재할 수 있습니다.
    • 역할: Inventory는 어떤 시스템들이 Ansible에 의해 관리되는지를 정의하고, 각 호스트의 그룹과 변수들을 설정할 수 있습니다.
    4. Module
    • 설명: Module은 Ansible에서 특정 작업을 수행하기 위한 재사용 가능한 코드 단위입니다. 파일 복사, 패키지 설치, 서비스 시작과 같은 작업을 처리합니다.
    • 역할: Ansible Playbook 또는 명령을 통해 호출되어 Managed Node에서 특정 작업을 수행합니다.
    5. Playbook
    • 설명: Playbook은 YAML 형식으로 작성된 파일로, 여러 단계의 작업을 정의하여 Ansible이 실행할 수 있도록 합니다. Playbook에는 어떤 호스트에 어떤 모듈을 사용할지, 그리고 그 순서를 정의합니다.
    • 역할: Playbook은 복잡한 구성 관리 작업을 자동화하고, 인프라 설정을 일관되게 유지하는 데 사용됩니다.

Ansible Control Node가 SSH로 접속해서 작성 되어 있는 명령어를 하나씩 실행시켜준다.

문서에 있는 명령어들을 SSH로 접속해서 하나하나 치는 것이다.?

일단 ,, SSH에 대해서 이해를 해 보려고 노력 했다.

근데 뭔가 되게 익숙한 것이다 ,, VMware에서 가상머신을 구성 하고 putty프로그램으로 어디로 접속할지 편하게 고르곤 했는데, 

저기에서 본 거였다.

putty 프로그램 : ssh 클라이언트 프로그램 (키 종류 : ppk 파일)

ssh 명령어 : (open)ssh 클라이언트 프로그램 (키 종류 : pem 파일)

 

결론으론 ,, 

앤서블은 control node가 ssh로 접속해서 쓴다는 거다

(푸티로 접속했던 것 처럼 앤서블이라는 프로그램이 managed 프로그램한테 ssh로 접속될 수 있게 해 주는 것)

Docker

일단 개념을 생각 해 보면 컨테이너를 만드는 애라고 생각하면 편하다.

컨테이너는 ? 프로세스를 격리된 환경에 실행하는 것 (프로세스: 실행중인 프로그램)이다.

이렇게 만들어진 프로세스를 컨테이너라고 하고, 도커는 리눅스 컨테이너에서 여러가지 기능을 제공한다.

 

VM과 Docker의 차이

저 3개를 쓰는 프로그램을 한 번에 실행을 해도 상관이 없는데 왜 나눠서 할까?

  • 사용자들이 들어올 때, 어느 서버가 일을 많이할지 모르는데 하나의 컴퓨터에 실행을 하면?

VM : Hypervisor(가상머신 )를 만드는 곳

  • 컴퓨터 : server
  • Host OS : 윈도우, 리눅스 운영체제 설치 , 프로그램 설치
  • Hypervisor : 가상의 컴퓨터를 만들 수 있게 된다

이게 VM
이게 Docker

 

도커를 끄면 컨테이너 자체가 사라진다. 

고장났으면 새로운 컨테이너를 다시 만들고 실행해야 한다.

 

`docker pull [이름 ex)nginx]` : 이미지 다운로드..?

`docker ps` : 실행중인 컨테이너

`docker ps -a` : 꺼졌던 컨테이너도 함께 출력

`docker images` : 다운받은 이미지..?

`docker rm -f [컨테이너 이름 or id]` : 강제 삭제

`dockr run --name nginx -d nginx:latest` : 이름 설정

`docker run --name nginx -d -p 1234:80 nginx:latest` :  **포트포워딩**

 

간단한 도커 명령어들을 봤고, , 

 

위에 보여드린 거 처럼 ,, 포트포워딩을 정말 쉽게 할 수 있더라.

 

이제 컨테이너 개발 순서에 대해서 말씀 드리겠다 ,, 너무 너무 어려웠는데 이젠 좀 이해가 된 것 같다.

컨테이너 개발 순서

  1. 디렉토리를 준비, 이미지에 포함시킬 파일들을 모은다.
  2. Dockerfile 작성
  3. 컨테이너에서 실행할 애플리케이션 코드를 작성하고 유닛 테스트 실행
  4. 이미지 빌드
  5. 컨테이너를 실행하여 동작을 확인

 

docker build --tag zzz:1.0[이름:버전] c:\test (경로)

이름과 버전은 내가 정하는 것이고, 경로는 지정해주면 된다.

그렇게 되면 이미지가 만들어지고, docker images로 확인하면 된다. 잘 만들어졌는지?

 

  • 환경 변수로 설정해서 내보내기
    • 환경 변수 설정 : ENV [변수] = [값]
    • 공개 포트 설정: EXPOSE [포트]
FROM alpine:latest
RUN apk update && apk add figlet
ADD ./message.txt /message.txt
ENV VAR01=abcd
CMD echo $VAR01 | figlet

VAR01으로 환경 변수를 설정 해 놓으면

	docker run -e VAR01=1234 zzz:1.2

로 변경 해서 실행할 수 있다.

 

이제 개발 도구에서 github에 push를 해서 도커 이미지를 빌드하고, 도커 허브에 푸시하는 것을 해 보겠다 ,,

 

1. 빌드한 거를 도커 컨테이너에 올려준다

2. 도커 데스크탑에서 켜준다

3. cmd에서 docker 로그인을 해 준다.

 

docker login -u aqulog// 로그인 -> 비밀번호
docker build --tag aqulog/올릴 이름:버전 c:\경로   // 이미지 빌드
// 아이디 / 올려줄 이름:버전 경로
docker push aqulog/올릴 이름:버전

 

네 이렇게 올려주면 되고요 ,, 쿠버네티스 환경으로 이미지 업로드 하는 방법도 배웠어요.

환경 구성하느라 울 거 같았는데 개인적 연락 하시면 도와드립니다.
이미지는 도커 허브에 있는 image 주소를 입력 해 주면 된다. 그럼 pod가 생성 되고 ,, 이게 뭔지는 다음에 알려드림...

 

이번 주차에 배운 것은 끝났습니다. 여러분들은 밀리지 않는 삶을 살길 바랍니다.

 

Problem

 

환경 구성을 하는 것도 애먹고 ,, 아직 뭘 배우는지 잘 모르겠다. 혼자 해 봐라고 던져지면 못할 거 같다

그니까 공부가 ,, 많이 필요한 거 같다.

 

Try

 

매일 배운 것은 한 번씩 해 보고 가자 어차피 집에 가면 자는데 ,, 노력 할 필요가 있다. 곧 최종 프로젝트니까 ? .. 

728x90