데브옵스 로드맵
https://roadmap.sh/devops
Learning a Programming Language
자동화를 위한 프로그래밍 역량은 필수
Python
- 초보자도 배우기 쉬움.
- 다양한 분야에서 사용됨(라이브러리가 정~말 많아서 가능)
Django를 이용한 웹 프로그래밍
Numpy를 이용한 수치 연산 프로그래밍
Pandas를 이용한 데이터 분석
IoT에서 라즈베리파이 센서 제어
- 윈도우와 리눅스를 위한 시스템 유틸리티 제작
- GUI 프로그래밍
AWS Lambda에서 이벤트 트리거를 만들 때 사용되는 언어
boto3를 이용한 클라우드 운영 자동화
유틸리티
컴퓨터 사용에 도움을 주는 여러 소프트웨어.
Go
- 성능
- 컴파일 언어 중에서
컴파일 속도가 제일 빠름.
고루틴(비동기 메커니즘)을 이용하면 이벤트 처리, 병렬 프로그래밍이 간단해짐
- 자체적인 스케줄러에 의해 관리되는
경량 스레드를 이용해서 CPU 코어 수에 관계 없이 수천 개의 고루틴을 돌려도 성능에 문제가 생기지 않음.
- 사용처
Grafana에서 Slack으로 발송하는 알림의 양식을 작성하는데 Go 언어를 사용했음.
Docker, Kubernetes를 작성하는데 사용된 언어
트위치, 뉴욕 타임즈 API 백엔드 서비스, SpaceX 원격 측정 프로그램, 이더리움의 메인 클라이언트인 Geth 모두 Go로 작성됨.
구글을 비롯해 드롭박스나 사운드클라우드 등에서도 기존의 기능들 중 상당수를 새롭게 Go를 이용해 바꿨다고 한다.
Understand different OS concepts
컴퓨터 공학에 관련된 지식들
I/O Management
- OS가 다양한 I/O 디바이스를 어떻게 관리하는지
- I/O 디바이스: 마우스, 키보드, 디스크 드라이브, LED, 네트워크 연결, 오디오 I/O 등등
Socket
- 서로 다른 두 프로세스 간을 연결해주는 엔드포인트(동일/외부 네트워크)
- Point-to-Point 방식
- IPC(Inter-Process Communication)
- 클라-서버에 IP주소와 포트 번호로 구성된 연결 포인트를 생성.
POSIX
- Portable Operating System Interface
- IEEE에서 제정한 유닉스의 API 규격.
- 유닉스와 직접적인 연관이 없어도 POSIX를 따르면 유닉스 호환 운영 체제라고 부름.
- 리눅스/macOS 모두 POSIX를 준수하기 때문에 유닉스 호환 운영 체제
initd
- 리눅스에서
PID=1로 가장 먼저 실행되는 데몬
- 이 데몬이 다른 프로세스, 스레드, 서비스, 데몬을 실행
- 시스템이 부팅될 때
/etc/init.d에 적힌 스크립트를 토대로 서비스를 자동 시작
service 명령어를 이용해 서비스를 제어(시작/중단)
systemd
- RHEL7으로 넘어오면서
initd를 대체하는 루트 데몬(PID=1)
systemctl 명령어를 이용해 서비스를 제어(시작/중단)
Concurrency
- 동시성 제어
- 여러 스레드가 병렬로 동시에 처리될 때 동작.
- 처리량을 최대로 하기 위해서
프로세스의 실행 순서, 메모리 할당, 스케줄링하는 기능.
- Locking 기법(자기가 사용하는 공유 메모리에 대해 다른 스레드가 사용하지 못하도록 선점)이 사용되는데, 이로 인해 데드락, block이 발생할 수 있음.
Learn about Managing Servers
Operating System
Linux
RHEL
- Red Hat Enterprise Linux
페도라를 기반으로 한 상업용 오픈 소스 리눅스 배포판
CentOS
- RHEL과 호환되는
무료 오픈소스 리눅스 배포판
- 레드헷이 21년 12월에 지원을 중단하면서
Rocky Linux, AlmaLinux가 대체제.
Ubuntu
데비안을 기반으로 한 무료 오픈소스 리눅스 배포판
SUSE Linux(openSUSE)
- 유럽에서 큰 인기. 국내, 미국에서는 별로.
YaST(Yet another Setup Tool)를 이용하면 GUI를 통해 시스템 관리가 가능(가장 큰 장점)
OBS(Open Build Service) 서비스. OBS 서버에 오픈 소스 프로젝트의 소스 파일들을 올리면 페도라, 우분투, 데비안 등의 각 배포판 별로 패키지를 자동으로 생성해주고, 리포지토리를 제공(또 다른 장점).
- 많은 오픈 소스 프로젝트들이 각 배포판용 패키지를 만들고 저장소를 호스팅하는 데에 OBS를 사용하고 있다.
Unix
FreeBSD
Learn to live in Terminal
Learn Bash Scripting
- 배시 스크립트 작성은 필수
- 자동화도 가능할 뿐더러 반복적인 작업에서의 휴먼 에러를 줄일 수 있음.
Text Manipulation Tools
awk
- C언어를 기반으로 한 프로그래밍 언어
- 보통 특정 패턴 포함되어 있는 파일들을 검색하고 적절한 액션을 취해주고 싶을 때 사용
sed
- 특정 패턴을 포함하는 파일을 찾거나 내용을 변경, 삽입, 삭제할 때 사용
- vi 편집기 없이도 명령줄에서 파일 수정 가능
grep
- 특정 패턴을 포함하는 라인을 출력
- 다른 명령어와 파이프라인으로 연계해서 많이 사용
sort
cut
- file 이나 표준 입력에서 받은 문자열을 잘라내서 새로운 문자열을 만드는 명령어
uniq
- 입력 내용에서 중복된 항목을 제거
- 파이프라인과 연계해서 많이 씀
fmt
- 원하는 형식의 포맷대로 내용을 포맷해서 출력
- 라인별 글자 수 지정, 문장별 한 줄 씩 출력 등
tr(translate characters)
- 파일 속 문자를 원하는 규칙을 통해 변환(입력 리다이렉션을 통해 파일을 읽어들임)
- 중복 제거, 글자 제거, 소문자를 대문자로 변경 등
nl(number line)
wc
- 특정 파일내에서 존재하는 바이트(Bytes)수, 단어(Words)수, 행(Lines)수를 카운트하여 화면에 출력
egrep
- grep의 확장 버전으로
추가적인 정규표현식 메타문자들을 지원
fgrep
- 모든 문자를 문자 그대로(정규표현식도 문자 그대로) 취급
terminal multiplexers
tmux
- 하나의 스크린에서 여러 개의 터미널을 만들고 액세스하고, 제어할 수 있도록 해주는 터미널 멀티플랙서
- 원격 서버로 접속했을 때 터미널 화면을 분할해서 사용하고 싶을 때 사용
Process Monitoring
ps
- 터미널에 있는 모든 프로세스에 대한 정보를 보여줍니다.
top
- 시스템 프로세스를 정렬해서 리스트로 보여줍니다.
- 맨 위에는 전체 프로세스가 OS에 대해서 리소스를 어느정도 차지하고 있는지를 알려줍니다.
htop
- top 명령어와 비슷한데, 수평/수직 스크롤이 가능하고 마우스로 상호작용이 가능.
atop
- 역시 top과 비슷한데, top과 비교해 프로세스, cpu, 메모리, 디스크, 네트워크에 이르기까지 좀 더 많은 하드웨어 리소스의 요약 정보를 제공
lsof
- list open files
- 프로세스에 의해 열려 있는 파일에 대한 정보들을 보여줍니다.
nmon
- 성능 모니터링 커맨드라인 툴
- CPU, 메모리, 네트워크, 디스크, 파일 시스템, NFS, 프로세스, 리소스
nmon 분석 엑셀 파일을 통해서 그래프로 가시화 가능
iostat
sar
- System Activity Report
- CPU, 메모리, 디스크 입출력, 네트워크 사용 정보
vmstat
- CPU, 프로세스, 메모리, 스왑, 디스크 등 정보 표시
traceroute
- 명령어를 실행하는 컴퓨터에서 목적지 서버로 가는 네트워크 경로 확인
- ICMP 프로토콜 이용
- 최종 목적지까지 가기까지 각 구간에서의 속도를 표시해줘서 느린 구간이 어디인지 파악하는데 굉장이 용이
ping
mtr
- traceroute + ping
- 낮은 TTL로 구간 별로 ping
- traceroute보다 더 많은 정보 제공(응답 속도, 응답 시간, 통계)
nmap
- 네트워크 상의 모든 호스트 탐색
- CIDR를 이용하면 여러 호스트 탐색 가능
- 보안감사나 네트워크 상의 가동중인 서비스의 모니터링에 유용
netstat
- 네트워크 연결, 라우팅 테이블, 인터페이스 정보 및 통계 등의 정보 제공
airmon
- 칼리 리눅스에서 주로 사용
- 무선 인터페이스의 모드를 변경(모니터 모드, 관리 모드)
- 무선 인터페이스 운영과 관련된 프로그램의 목록을 보여주거나 종료시킬 수 있음.
ufw
tcpdump
- 네트워크 상에 흐르는 트래픽에서 패킷을 잡아내 사람이 읽을 수 있는 형태로 보여줌
airodump
- 칼리 리눅스에서 주로 사용
- 공중에 떠다니는 무선 트래픽의 패킷을 볼 수 있음
iptables
- 패킷 필터링 도구
- 방화벽 구성, NAT 구성에 사용
dig
- Domain Information Groper
nslookup, host를 대체하는 명령어
- 도메인과 관련된 네임 서버의 정보를 보여줌.
scp
- SSH를 이용하여 호스트 간 파일이나 디렉토리를 전송
Others
strace
- 특정 프로그램으로 호출된 시스템 콜이나 시그널을 기록
- 예를 들어 특정 프로그램으로 kill 명령을 날렸다면 로그가 기록됨
dtrace
- dtrace 스크립트 작성: 이벤트를 정의(probe)하고 정의된 이벤트가 실행(dtrace)될 때 작성된 로직이 실행(action)
systemtap
- 실행중인 리눅스 커널의 작업을 동적으로 모니터링
dtrace와 유사
- systemtap 스크립트 작성
uname
- 시스템 정보 출력
- 운영 체제, 커널, 하드웨어 아키텍처, 버전 등의 정보를 출력
df
du
Networking, Security and Protocols
HTTP
- 인터넷 상에서 전송되는 내용들이 어떻게 요청되고 전송되는지를 정의한 프로토콜
HTTPS
- HTTP + SSL/TLS
- 평문이 보내질 때 암호화됨
FTP
- 2개의 TCP 연결 사용(제어: 21, 데이터: 20)
- 파일 전송 프로토콜
SSL/TLS
- SSL은 TLS의 이전 버전: 기존에 SSL을 개발하던 Netscape가 더 이상 참여하지 않게 되면서 TLS로 명칭이 변경
SSH
- 네트워크 커뮤니케이션 프로토콜
- 두 호스트가 암호화된 네트워크에서 커뮤니케이션이 가능
- SFTP = SSH + FTP
Port Forwarding
- 특정 포트로 들어오는 데이터 패킷을 다른 포트로 바꿔서 전송
- 게이트웨이를 통해 사설망 안에 있는 특정 서비스로 라우팅 시켜 줄 때 주로 사용
What is and how to setup a X?
Reverse proxy

- 사용자가 인터넷에 데이터를 요청하면 리버스 프록시가 이 요청을 받아 내부 서버에서 데이터를 받은 후 사용자에게 전달
- 내부 서버는 WAS를 의미하고 WAS에 직접 접근한다는 것은 DB에 접근이 가능해진다는 의미이기 때문에 보안상 치명적
- 로드 밸런싱 기능도 가능함
- 클라이언트는 리버스 프록시에게 요청하기 때문에 서버의 정보를 알 수 없다.
Forward Proxy

- 사용자가 직접 인터넷에 연결되는 것이 아니라 프록시 서버를 통해 인터넷에 연결됨
- 캐싱 기능이 있어 자주 사용하는 데이터라면 프록시 서버까지만 접근하면 되므로 성능 향상이 가능
- 서버는 포워드 프록시를 통해서 요청을 받기 때문에 클라이언트가 감춰진다.
Caching Server
- 클라이언트가 요청한 컨텐츠들을 기억하고 있다가 동일한 요청이 들어왔을 때 캐싱 서버를 통해 신속하게 응답
Load Balancer
- 클라이언트의 요청에 대해서 여러 서버로
분산
- 서버가 하나 중단된다면 다른 서버로 요청 전송하며
가용성 보장
Firewall
- 인바운드/아웃바운드 정책을 통해서 안전한 트래픽만 접근 허용
Web Server
- NginX vs Apache
: NginX의 경우 여러 연결을 동시에 처리할 수 있는 정교한 아키텍처로 짜여져 있어 모듈 개발이 Apache에 비해 어려움.
: 정적 컨텐츠 제공 성능은 NginX가 2.5배 정도 좋음
: 동적 컨텐츠 제공 성능은 동일
: 두 웹 서버 모두 다양한 OS를 지원하지만 NginX의 경우 Windows에서의 안정성은 떨어짐.
Learn Infrastructure as Code
인프라를 YAML, JSON 같은 마크업 언어를 통해서 관리하는 것을 말함.
IaC의 장점
-
휴먼 에러 감소
: 초기 구축 리소스는 조금 더 들 수 있으나 한 번 정확하게 작성해 놓으면 휴먼 에러를 현저히 줄일 수 있음.
-
버전 관리, 롤백, 공유, 재사용 가능
: 코드를 사용할 때의 장점들을 그대로 이용할 수 있음.
Service Mesh
서비스 메시란 API를 사용해서 마이크로 서비스 간의 통신을 원활하게 할 수 있도록 설계된 인프라의 한 계층입니다.
서비스 메시 솔루션은 마이크로 서비스 환경에서 어플리케이션의 각각 다른 파트들(컨테이너)이 데이터를 서로 잘 공유하도록 제어하는 역할을 담당합니다.
서로 다른 기능들이 원활하게 소통하도록 도와줌으로써 최적화 및 어플리케이션이 안정적으로 확장될 수 있도록 도와줍니다.
Consul
- Hashicorp사에서 개발한 서비스 메시 솔루션
- MSA의
서비스 검색, 상태 확인 및 정책 적용을 관리
- ID 기반 정책 및 암호화를 통해 서비스 간 트래픽을 보호
- 각 서비스들에는
consul agent가 실행되고, agent들은 하나 이상의 consul server와 통신. consul server에는 데이터가 저장되고 복제된다. consul 자체는 한 서버에서 동작되지만 데이터의 손실을 막기 위해 3~5대의 서버가 클러스터를 이룬다.
Istio

- 서비스 코드 변경 없이 로드밸런싱, 서비스 간 인증, 모니터링 등을 적용하여 마이크로 서비스를 쉽게 관리할 수 있다.
데이터 플레인의 각 서비스에 Envoy 프록시가 배포되어 서비스로 들어오고 나가는 모든 트래픽을 통제하고, 컨트롤 플레인의 Istiod 모듈을 통해 Envoy를 관리한다.
Containers
Docker
- 마이크로서비스 환경을 구축할 수 있도록 해주는 컨테이너 런타임
- 도커 허브에 저장되어 있는 컨테이너 이미지를 통해 손쉽게 독립적인 컨테이너를 실행할 수 있음
dockerfile을 작성해서 컨테이너 이미지를 직접 빌드할 수 있음
YAML 파일을 작성하고 docker compose를 이용하면 YAML 파일에서 구성한 설정대로 컨테이너가 실행됨.
Configuration Mgmt.
효율적인 형상 관리 가능
Ansible
- 여러 호스트에게 동시에 같은 작업을 한 번에 수행할 수 있도록 해준다.
인벤토리를 작성해 호스트에 대한 정보를 파일로 관리할 수 있음.
플레이북을 작성해 CLI가 아닌 IaC 형태로 관리 가능
Container Orchestration
Kubernetes(k8s)
- 다수의 컨테이너를 효율적으로 관리
- Docker 지원 중단으로 인한 이슈
- 쿠버네티스는 원래 컨테이너 런타임과 통신할 때
CRI라는 API를 이용해서 통신하는데, 도커는 이를 지원하지 않아서 도커심(Dockershim)이라는 것이 사용되어 왔음.
- 하지만 최신 버전부터는
도커심 지원이 중단.
- 도커가 생성하는 이미지는 쿠버네티스에서 호환 가능
- 개발은
도커로 진행하되 이를 실행하는 컨테이너 런타임을 바꾸면 됨.
- 대체 컨테이너 런타임:
containerd, CRI-O
Infrastructure Provisioning
Terraform
멀티 클라우드 환경에서 대단히 효율적
ruby를 기반으로 한 테라폼 언어를 통해 리소스 생성 및 관리
CI(Continuous Integration): 지속적 통합
- 버전 관리 레포에 여러 플랫폼에서의 코드 변경 사항을 통합
- 성능, API, 브라우저, 디바이스, 코드 분석, 보안 테스트 자동화
협업과 코드 품질 개선
CD(Continuous Deployment): 지속적 배포
빌드, 테스트, 배포의 과정 자동화
- 버전 제어에서 코드를 풀링해서 빌드 실행
- 단계 게이트에서 자동화된 보안, 품질 및 규정 준수 확인과 필요한 경우 이를 뒷받침하는 승인 활성화.
- 코드로 자동화된 필요 인프라 단계를 실행해 클라우드 인프라 구축 또는 해체
타깃 컴퓨팅 환경으로 코드 이동
- 환경 변수를 관리하고 타겟 환경에 맞게 구성
- 애플리케이션 구성요소를 웹 서버, API, 데이터베이스 서비스와 같은 적절한 서비스로 푸시
- 새 코드 푸시에 필요한 서비스 엔드포인트를 호출하거나 서비스를 재시작하기 위해 필요한 단계 실행
- 지속적 테스트 실행과 테스트 실패 시 롤백
- 제공 상태에 대한 로그 데이터 및 알림 제공
- 구성 관리 데이터베이스를 업데이트하고 IT 서비스 관리 워크플로우에 완료된 배포에 대한 알림 전송
Gitlab CI
- SaaS 모델로 제공되는 CI/CD 무료/유료 솔루션
- Gitlab 레포, 깃헙 레포, Bitbucket 클라우드를 사용하는 환경 모두 GitLab CI를 사용할 수 있음(유료 버전).
- 무료 버전의 경우 CI/CD 기능 사용을 월 400분으로 제한
- 유닉스 계열만 지원
- 지원하는 플러그인이 제한적인 대신 CI/CD를 도와주는 편리한 기능들이 내장되어 있음.
Jenkins
- 무료 오픈소스 CI/CD 솔루션
- 유닉스 계열, 윈도우, 맥 모두 지원
- 1700여개의 플러그인 지원
- 커뮤니티 활성화가 잘 되어 있음.
GitLab vs Jenkins
https://www.clickittech.com/devops/gitlab-vs-jenkins/
GitHub Actions
- GitHub에서 제공하는 CI/CD 솔루션
- 개발자라면 GitHub 계정은 누구나 가지고 있기 때문에 진입장벽이 낮음.
- GitHub 레포에서 일어나는 모든 활동에 CI/CD 적용
Circle CI
- GitLab CI와 같이 클라우드 기반으로 유사한 점이 많음
- 차이점은 버전 관리 기능이 없으며, 디버깅 기능이 있음.
Learn how to monitor software and infrastructure
Infrastructure Monitoring
Prometheus
PromQL을 이용하는 시계열 데이터베이스 기반 무료 모니터링 소프트웨어
- 다른 모니터링 시스템과의 가장 큰 차이점은
풀(pull) 방식
- 보통 모니터링 시스템은 호스트에서 에이전트가 모니터링 서버로 매트릭을 보내는 푸시(push) 방식
- 프로메테우스의 경우 모니터링을 할 호스트에
Exporter를 설치하고 방화벽의 특정 포트를 열어놓으면 프로메테우스 서버에서 풀 방식으로 해당 포트를 통해 HTTP Get 요청으로 매트릭을 수집
- 각 호스트에 Exporter만 설치되어 있으면 프로메테우스 서버 한 곳에서 제어가 가능하기 때문에 관리가 용이
서비스 디스커버리 기능을 이용하면 EC2 Instance나 k8s pod로 부터 매트릭 수집 가능
Pushgateway를 통해 푸시(push) 방식으로 매트릭을 수집할 수도 있음.
Grafana
- 프로메테우스와 같은 모니터링 서버에 수집된 데이터들을 시각화하는 소프트웨어
Datadog
- 클라우드 기반 모니터링 솔루션
대규모 어플리케이션에 적합한 모니터링 솔루션
- 인프라 모니터링 뿐만 아니라
애플리케이션 성능 모니터링, 로그 관리, UX 모니터링까지 다양한 기능 제공
Application Monitoring
Jaeger
- 복잡한 분산 시스템에서
트랜잭션에 대한 모니터링 및 트러블슈팅 가능
New Relic
Datadog은 클라우드 인프라 모니터링과 보안 쪽에 집중
New Relic은 데스크탑, 웹, 모바일 애플리케이션의 모니터링에 집중
실시간 모니터링이 가능하기에 실시간이 중요시 되는 환경이라면 New Relic이 좋음.
- 비용 측면에서는
Datadog이 훨씬 유리.
Datadog vs New Relic
https://www.eweek.com/enterprise-apps/datadog-vs-new-relic/
Logs Management
Elastic Stack
- 모든 유형의 데이터(특히 비정형 데이터)를 저장, 실시간으로 검색, 분석 및 시각화 할 수 있도록 도와주는 Elastic의 오픈소스
로그 수집 솔루션
- Elastic Search + Logstash/Beats + Kibana(ELK)
Elastic Search: 대규모의 데이터(특히 비정형 데이터)를 빠르게 검색, 분석, 저장
Logstash: 데이터 수집, 변환, 운송
Beats: Logstash와 유사하나 변환 기능이 제외되어 보다 가볍게 사용 가능
Kibana: 데이터 시각화
Loki
- 로그 수집 솔루션으로 ELK가 운영하기 어렵고 비용 감당이 안될 경우
대체제.
Grafana에서 개발한 오픈 소스 중앙 집중식 로그 집계 플랫폼.
소규모 환경에 적합. Go로 개발되어 성능 우수.
LogQL 쿼리 언어를 이용.
Cloud Providers
Digital Ocean
- 기술적인 면에서는 떨어질지 모르나
UI가 직관적이고 상당히 경량화 되어 있으며, 메이저 퍼블릭 벤더사에 비해 가격이 저렴하다.
Cloud Design Patterns
시스템 아키텍처를 설계할 때 발생할 수 있는 전형적인 문제에 대해 설계 방법, 해결 방안을 알기 쉽게 분류하여 노하우로 이용할 수 있도록 정리한 것
고려사항
- 가용성(Availability)
- 데이터 관리(Data Management)
- 디자인 & 구현(Design & Implement)
- 관리 & 모니터링(Management & Monitoring)