클라우드 컴퓨팅/인프라 기초

[24.07.03] 인프라 기초 3

우잉~ 2024. 7. 3. 18:00

인프라 기초 - 2 복습

- 데이터를 처리하는 기술 : IT

 

- 인프라는 CPU, 메모리, 네트워크, disk(storage)가 필요하고, 데이터를 처리하기 위한 파일 시스템이 필요하다.

- 인프라를 관리하기 위해서는 커널  필요

- 커널에서는 프로세스를 실행할 수 있다.

- 그런데? 프로세스를 실행하기 위해서는 파일 시스템에 파일이 저장되어 있어야 한다.

- 내가 실행하고 싶은 파일이 없을 경우는 어떻게 해야 하는가? -> 외부 레포지토리에 저장된 내용을 가져와 설치한다.

- 이 때 많은 바이너리와 라이브러리가 함께 설치되는데, 바이너리+라이브러리를 소프트웨어 패키지라고 부른다.

- 소프트웨어 패키지를 설치하고 프로세스를 실행할 수 있다.

 

웹 컨테이너 구조

 



AWS Well-Architecture

- 신뢰성

- 비용최적화

- 성능

- 보안

 


 

systemd

- 시스템 시작(부팅) 후 서비스 프로세스를 관리하는 역할을 갖는다.

- 서버 프로세스 제어 방법을 제공한다.

- 사용자 서비스를 실행하여 제어하는 역할

 

systemctl

- systemd 기능을 사용하기 위한 명령어.

- units라는 다양한 유형의 systemd 개체를 관리할 수 있다. ex.service, socket, mount, target 등

* 네트워크 매니저(NetworkManager): 네트워크 자원을 관리해주는 데몬. systemctl로 관리할 수 있다. ex. nmcli

 

프로세스 관리는

systemd, 격리된 프로세스를 실행시켜주는 docker로 할 수 있다.

수동으로도 프로세스를 올릴 수 있지만, 그룹을 만들어서 사용자에게 편의성을 제공하는 도구를 이용한다.

 

systemctl -l

- 유닛 목록 확인

유닛 목록 확인

 

systemctl status sshd -l

- ssh 데몬 유닛 상태 확인

현재 ssh 데몬이 활성화되어 있다.

 

- ssh 데몬의 위치는 /etc/ssh에 있다.

- ssh 주요 데몬은 두 가지 ssh_config(client), sshd_config(server)

 


ssh 데몬 환경 수정하여 세션 접속 테스트

/etc/ssh/ssh_config.d 파일 수정. 포트 번호 2222로 변경.

 

* 실습 시작 전 테스트하기 위해 ssh를 루트로 로그인하게 설정했다.

01-permitrootlogin.conf 파일에 PermitRootLogin가 yes로 설정되어 있는 것을 확인할 수 있음. 실제로는 root로 접근하면 안 된다!

 

변경된 포트를 systemd에게 알려야하기 때문에 재시작한다. 이미 메모리에 적재되어 있기 때문에 재시작을 통해 변경된 정보를 재시작하여 새로 메모리에 올려야 한다.

> systemctl restart sshd

 

에러 발생. 

 

리눅스 보안 설정(selinux)이 있음. 그래서 포트번호를 2222로 변경할 수 없다.

보안 설정 내린 후 다시 재시작.

보안 설정 해제 방법 >

setenforce 0

 

* 포트번호를 새로 바꾸게 되면 현재 터미널이 22번 포트로 통신하기 때문에 세션이 끊겨야 한다.

그런데 mobaxterm에서는 통신이 잘 되는 모습을 확인할 수 있다. 캐시 기능을 써서 유동적으로 세션을 설정할 수 있는 기능을 업데이트했을 것으로 추정한다.

 

이에 대한 Powershell 실습. 연결이 되지 않는다.

 

해결 방법은?

ssh에는 포트를 설정할 수 있는 옵션이 있다 '-p'

> ssh -p 2222 호스트네임@아이피

 

보안 관련된 문구가 뜨고 yes를 입력하면 접속되는 것을 확인했다.

 

 

 


httpd 데몬 환경 설정 변경해보기

> /etc/httpd/conf/httpd.conf 폴더에서 포트 번호 바꾸기

> systemctl start httpd

> systemctl restart httpd

구동을 한 번도 안 했다면 start, 한 번이라도 해서 실행했다면 restart

> [ip주소]:8000 접속

8000번 포트로 접속 완료

 

 

git 사용하기

git 패키지를 설치하고

레포지토리에 있는 파일을 설치하고 싶으면 git clone [주소]를 입력한다.

> git clone [주소]

 

clone 명령을 이용해 받아온 것은 현재 디렉터리에 생성이 된다.

받아온 demo 프로젝트

 

도커 설치를 위한 install_docker.sh를 실행해야 한다. 하지만 현재 실행 권한이 없기 때문에 실행 권한을 부여해야 한다.

install_docker.sh 퍼미션 변경 전
install_docker.sh 퍼미션 변경 후

 

docker 패키지 설치

 

* 상대 경로를 인식하지 못하는 이유? 인식하지 못하는 것은 아님!

실행 스크립트를 읽을 때 PATH라는 환경 변수에 접근하게 된다.

PATH 환경변수 출력

이 PATH에 저장된 값을 참조하여 파일의 위치를 찾고 실행되는 원리를 가지고 있다.

상대 경로를 통해 실행할 경우, 직접 입력한 상대 경로에 원하는 실행 파일의 스크립트가 존재하지 않으면 충돌하여 에러가 발생한다.

파일을 실행할 때는 절대 주소를 사용하는 것이 바람직하나, './'를 사용하여 상대경로를 사용할 수도 있다.

 

docker 패키지를 다운로드 받으면서 여러 레포지토리에서 다양한 라이브러리를 다운로드하는 것을 볼 수 있다.

다양한 레포지토리에서 가져온 라이브러리

 

도커 버전 확인

> docker version

docker 버전 확인

 

 

컨테이너 실행

> docker run -d -p 8888:80 httpd

- run 명령으로 컨테이너를 실행한다. 

- 8888포트는 호스트 포트, 80은 컨테이너 포트

- 컨테이너 내부 포트인 80번 포트에 8888포트로 접속하겠다는 뜻

 

httpd 이미지를 컨테이너로 실행

 

 

에러 발생

 

 

 

 

 

 

SCM(Source Code Management)

VCS(Version Control System)

 

VCS 3가지

- local: 레포지토리를 로컬에 둔다. 로컬 레포지토리에 파일 저장하여 꺼내 쓸 수 있게끔 구성한다.

문제점은 협업이 힘들다. 로컬에만 저장되어 있으니 나만 쓰기 편하고 공유가 힘들다.

 

- central: 중앙집중식 서버를 두고 이곳에 레포지토리를 배치. check out, check in

문제점은 중앙 서버가 다운되었을 때 지옥의 맛을 맛볼 수 있다.

ex. svn

 

- distributed: 레포지토리를 중앙에만 두는 게 아니라 로컬에도 둘 수 있다. local+remote repository.

ex. git

 

!! 백업은 별개의 요소 !!

 

github / gitlab / bitbucket

호스팅 서버를 내부에 구축해주는 것이 gitlab이다.

access key 같은 것을 github에 업로드하게 되면 보안 문제가 발생할 수 있다.

 

local repository

생성

> git init

 

로컬 레포지토리 생성 완료

 

파일 상태 확인

> git status

현재 커밋이 존재하지 않는다.

 

stage 상태 전환. 커밋 목록에 추가

> git add

현재 디렉터리 모든 파일을 커밋 목록에 추가

 

commit 생성 or 파일 저장 or 커밋 저장

> git commit -m '메시지'

커밋 생성

* 메시지를 꼭 붙이는 것을 권장

 

 

remote repository

생성

> git remote add [별칭] [url]

원격 레포지토리 생성

url 변경

> git remote set-url [별칭] [url]

 

받아오기

> git pull

 

넣기

> git push

 

삭제

> git remote remove 별칭

 

 

branch

브랜치 목록 출력

> git branch

브랜치란?

독립된 공간에서 코드가 개발될 수 있게끔 설계된 장치

 

브랜치 변경

> git checkout

 

 

* git flow: 브랜치 관리 전략

 

* Gitlab push -> Jenkins

 

 


 

최상위 사용자(슈퍼 사용자)인 root가 사용자를 생성하고 퍼미션을 적절하게 조정할 수 있다.

새로운 사용자를 생성하고 이 사용자를 소유 그룹으로 넣어보자.

 

 

리눅스는 /etc/passwd 파일로 사용자를 관리한다.

이 파일을 이용하여 암호를 관리하게 됨.

사용자 목록 출력

 

여기서 콜론(:)은 구분자로 사용된다. 필드를 나눔.

[사용자:패스워드:UID:GID:주석:사용자 홈 디렉터리:로그인 쉘]

예전에는 패스워드가 모두 출력됐는데, 보안상으로 필드값을 사용하지 않게 바뀌어서 x라고 출력되었다.

UID: User ID. 사용자의 고유 번호.

일반 사용자는 1000 이상의 숫자로 표기하고, 시스템 사용자는 1000 이하의 숫자로 표기.

0: root UID

1~200: 시스템 프로세스에 정적으로 할당되는 시스템 계정 UID.

201~999: 이 시스템의 파일을 소유하지 않은 시스템 프로세스에 할당되는 UID. 동적 할당.

 

GID: 사용자의 소유 그룹 번호

마지막 필드인 로그인 쉘에 적힌 'nologin'이란? 로그인이 필요 없는 사용자

 

아파치 웹 서비스가 동작할 때

아파치 프로세스를 실행한 사용자의 권한이 파일에 부여가 되어 있어야 그 파일에 접근을 해서 파일 내용을 가져다올 수 잇는 것이다...........................................................

 

 

사용자 생성

> useradd [유저 이름]

useradd 사용

새로운 사용자의 UID는 1001번을 부여받았다. 일반 사용자는 1000 이상부터 시작하기 때문이다. 

새 사용자 testuser UID 확인

사용자 수정

> usermod -u 2000 testuser: UID 변경하기

 

그룹 생성

> groupadd

 

 

퍼미션 관련 실습

 

 

현재 /var/www/html에 있는 index.html의 퍼미션 600

 

other는 읽기, 쓰기, 실행 권한이 부여되어 있지 않기 때문에 403 Forbidden 페이지가 뜬다.

chown을 사용해 소유자와 소유 그룹을 변경하면 httpd가 index.html에 접근이 가능해진다.

소유자, 소유 그룹을 apache로 변경
접속 성공

 


 

 

xfs 파일 시스템 실습

<실습 내용>

1. 디스크 추가

2. 새로 추가한 디스크 나누기(파티셔닝)

3. 파일 시스템 구성(포맷)

4. 포맷된 파일 시스템을 특정 위치에 연결(마운트)

5. 마운트 해제(유마운트)

6. 파일 시스템 테이블에 디스크 등록하기

 

 

 

설정 > 저장소

SATA 컨트롤러에 새로운 디스크 추가

* 새로운 디스크를 장착한다고 생각하면 된다.

 

새로 만든 디스크 선택
새로운 SATA 디스크 추가

 

디스크 목록 출력

> lsblk

새로 추가한 1.00GB 사이즈의 sdb 디스크 확인

맨 처음에 생성한 rocky SATA 디스크가 두 개로 나뉜 것(파티셔닝)도 확인할 수 있는데,

하나는 부팅 전용 디스크, 나머지는 그 외가 저장되는 디스크이다.

 

두 번째로 붙인 디스크의 이름은 sd'b'로 생성, 파티셔닝도 되어있지 않다.

이 후 새롭게 붙이는 디스크의 이름은 cdef...로 될 것이다.

 

파티셔닝하기

> fdisk /dev/sdb

fdisk는 디스크 파티션을 생성할 수 있는 명령어이다.

fdisk 명령어 사용

현재 파티션을 확인하기 위해 p 입력 (print)

 

파티션 추가하기 n (new add partition)

 

- 파티션 타입

- 파티션 넘버

- 첫 번째 섹터

- 마지막 섹터

 

파티션의 시작은 2048부터 시작할 수 있다. 왜?

0~2047: meta data

 

/dev/sdb1 파티션이 생성된 것을 p를 입력해 출력해보기

 

파티션을 생성하고 꼭 저장해야 한다.

w 입력하면 저장하고 커맨드가 빠져나와진다.

 

커널에 파티션을 새로 생성했다고 꼭 알려줘야 한다.

> partprobe /dev/sdb

 

 

파일 시스템 생성(포맷)

 

mkfs 명령어를 이용해 파일 시스템을 생성

 

 

 

파일 시스템 특정 디렉터리에 연결(마운트)

파일 시스템을 이용하여 파일 저장을 하는 방법: 특정한 디렉터리 경로로 연결해야 함.

이 디스크를 특정 디렉터리 경로로 연결하는 과정을 마운트(mount)라고 한다.

/data 디렉터리에 /dev/sdb1 마운트

파일 시스템 확인

파일 시스템 상태 확인

마운트한 디렉터리에 저장되는 디렉터리, 파일은 sda가 아니라 sdb에 저장이 된다.

* 파티셔닝할 때 10진수로 하지 말고 2의 제곱으로 설정하는 것이 잉여자원이 남지 않는다.

 

 

디스크 해제

파일 시스템을 구성하는 파일 시스템 테이블

 

 

 

* swap이란?

영역. 공간

메모리는 프로세스로 동작하기 위해서 파일 시스템에 있는 걸 가져다가 메모리에 적재하고 씨피유 쓰레드 어쩌구 해서 실행됨.

메모리를 다 써버렸어!

 

메모리가 부족한 상태에서 무언가 처리를 해야하는데 이런 작업을 수행할 수 있게끔 swap 영역을 이용

결국 swap 영역은 메모리가 부족할 때를 대비하는 영역이다. = 메모리를 대신하는 영역

메모리 비싼 거 쓰지 말고 그냥 swap 써버리면 안 되나요?

안 된다. 속도가 아주아주아주 느리다.

지연 시간이 많이 발생하게 된다. 

가급적이면 swap을 사용하는 상황이 많이 벌어져서는 안 됨.

디스크 구성을 할 때 필요한 메모리 공간을 예상하고 구축을 해야한다.

swap은 언제 활용해야 할까?

메모리를 사용할 때 빠르게 처리해야 할 프로세스가 있을 경우, swap에 잠시 저장하고 메모리에서 빠르게 처리한 뒤 다시 옮긴다.

하지만? 가급적이면 메모리를 많이 확보하는 것이 제일 좋음.

 

* 쿠버네티스를 설치할 때는 swap 영역을 허용하고 있지 않기 때문에 제거해줘야 한다.

 

마운트 해제하기

> umount /dev/디스크

 

* 마운트 해제 시 주의할 점

마운트 된 디렉터리에 위치해 있을 때 umount를 할 수 없다...

 

* vi 단축기 꿀 팁!

i:  insert mode 진입

a: 커서 놓인 곳의 바로 뒤 insert mode

Shift+a: 커서 놓인 줄의 맨 뒤 insert mode

o: 커서 위치한 곳의 아랫줄에서 insert mode

Shift+o: 커서 위치한 곳의 윗줄에서 insert mode

Ctrl+f: 다음 페이지 이동

Ctrl+b: 이전 페이지 이동

 

insert mode에서 작동하는 단축키

Ctrl+w: 띄어쓰기별로 지우기

yy: 한줄 복사

dd: 한줄 삭제

p: 붙여넣기

 

 

파일 시스템 테이블 추가

> vi 편집기를 이용하여 /etc/fstab 파일에 디스크를 추가해야 한다.

/etc/fstab은 무슨 역할을 하는지?

: 리눅스가 부팅될 때 마운트할 파일 시스템 정보. 만약 이 테이블이 잘못 설정될 경우 부팅->마운트 과정을 진행하다 에러가 나서 부팅이 멈출 것이다... 정확하게 입력해야 한다

 

테이블 구조: [파일 시스템 장치    마운트할 위치     파일 시스템 종류     디스크 옵션   덤프   파일 체크 옵션]

* 덤프(dump): 0 - 백업 X / 1 - 백업 가능한 파일 시스템

* 파일 체크 옵션: 0 - 부팅 시 파일 시스템 점검 X / 1 - 루트(/) 파일 시스템을 점검한 뒤 부팅 / 2 - 루트(/)를 제외한 나머지 파일 시스템 점검 뒤 부팅

파일 시스템 테이블 추가

 

* 파일 시스템도 데몬을 이용함. reload 해야만 적용이 된다.

> systemctl daemon-reload

 

 


표준 입츨력과 파이프라인

 

- 표준 입력(standard input)

- 표준 출력(standard output)

- 표준 에러 출력(standard error output)

 

 

표준 입력(<)

* cat 명령어는 터미널에 파일 내용을 출력하기 때문에 굳이 표준 입력이 필요하진 않다.

터미널에 출력한다.

표준 입력(stdin) 결과

 

표준 출력(>)

결과 값을 파일로 저장한다. vi 편집기로 수정도 가능하다.

표준 출력(stdout) 결과

 

 

 

출처 위키백과 https://ko.m.wikipedia.org/w/index.php?title=%ED%91%9C%EC%A4%80_%EC%8A%A4%ED%8A%B8%EB%A6%BC&diffonly=true#%ED%91%9C%EC%A4%80_%EC%9E%85%EB%A0%A5_(stdin)

 

표준 입력/표준 출력/표준 에러 출력은 다른 채널을 가지고 있다.

텔레비전 채널과 유사하다고 생각하면 될 것 같다. 5번은 sbs, 7번은 kbs, 11번은 mbc처럼 같은 시간에 다른 프로그램을 방영하는 것처럼 

0번이 표준 입력 채널, 1번이 표준 출력 채널, 2번 채널이 에러 채널로 나뉜다.

 

* 터미널에 출력되는 출력 채널은 1번이다. (default)

그래서 에러를 리다이렉션하기 위해서는 채널(2)을 명시해야 한다.

 

 

리다이렉션을 여러 개 사용할 수도 있다.

ex) CMD >  file1 2>error.log 

채널 1번은 file1에 저장하고, 에러는 errer.log에 저장.

 

0, 1 채널은 생략 가능하다.

 

CMD 1>file1

CMD 0< file2

 

표준 출력과 표준 에러 출력을 한 파일에 리다이렉션하기 위해서는?

 2>&1이라 표현한다.

 

리다이렉션으로 파일을 덮어 씌울 수도 있다.

만약에 추가를 하고 싶으면? '>>' 사용

ex. number.txt에 123이라는 정보가 담겨져 있을 때,  $ echo 789 >> number.txt

출력 결과

123

789

 

 

Network Bonding

네트워크 이중화 기술

한 시스템에 장애가 생겼을 경우, 똑같이 구성된 다른 시스템으로 바꿀 수 있도록 만들어진 구조이다.

365일 구동되어야 하는 인프라를 하나의 시스템으로만 운영한다면, 장애가 발생했을 때 크리티컬한 이슈를 겪을 수 있을 것이다.

카페 1호점 2호점 같은 느낌으로 생각하면 될 듯하다.

1호점에 홍수가 나서 운영을 하지 못할 때 2호점으로 가면 되는 것처럼...

이중화 기술은 높은 가용성빠른 속도를 가졌다는 장점을 가지고 있다.