일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- aws #modernization #eks #k8s
- 티스토리챌린지
- merge
- Git
- crossfit_geeks #크로스핏 #crossfit #당산크로스핏 #크로스핏긱스 #running #역도 #오운완 #크로스핏터 #Django가 고장날때까지
- Trino
- trino #hive #sync
- Push
- 쿠버네티스
- 오블완
- k8s
- Exception
- Python #PEP
- Glossary #Python
- Python3 #PEP
- til #loguru #str #format
- fetch
- 카프카
- pyenv
- 타입 #type
- nodeport
- pull
- Today
- Total
Django가 고장날때까지
네트워크 스터디 1주차 본문
24년 11월 11일 기준 - 완주함
- 멤버글 모음
https://gasidaseo.notion.site/3-13a50aec5edf8013984fe0ba0c0e3b39
https://gasidaseo.notion.site/24-3-df0466c474ff40528e37b24bfdfe9d0f
(’24) 쿠버네티스 네트워크 스터디 3기(매운맛) [모집 마감] | Notion
모집 마감되었습니다. 많은 관심과 지원에 감사드립니다.
gasidaseo.notion.site
<요약 및 몰랐던 부분 정리>
지식의 흐름 정리:
프로세스 -> 격리된 프로세스(도커로 쉽게 구축할 수 있었던 기술) -> 도커를 사용하지 않고 프로세스를 격리하는 방법을 살펴봄 -> chroot를 통해서 초창기 컨테이너의 모습을 살펴봄 -> 문제점 발견(탈옥이 가능) -> 이를 해결 하기위해 -> pivot_root 명령어로 호스트의 루트파일 시스템을 컨테이너에서 사용할 루트 파일 시스템으로 바꾸고 -> unshare 명령어를 사용해서 Linux에 새로운 네임스페이스를 생성해서 부착가능한 mount 네임스페이스를 생성하는 것과 같이 결합해서 사용 -> 이럴 경우 결국 탈옥이 불가능함
다시 본질로 돌아가서 잊으면 안되는 부분이 도커를 사용한다는 것은 격리된 애플리케이션 환경을 만들어준다는 것이기 때문에 이 과정에서 당연히 파일시스템, 네트워크와 관련된 개념이 나오는 것임
그렇다면 이제 이 격리된 자원들을 어떻게 관리할 것인가?라는 물음이 당연히 생기게 됨 그러면서 -> cgroup을 살펴보게 되었음.
추가적으로 격리된 프로세스 환경 내에서 네트워크 통신에대해서 추가적으로 살펴봄.
1. 소켓은 file 이다.
예를 들어 file에 입출력을 수행할 때 file이 가리키는게 네트워크라면 -> TCP로 나가게 된다. (file이 가리키는게 bluetooth, IrDA(Infrared Data Association)를 가리킬 수 도 있음)

프로세스가 입출력 행위의 주체가 된다. 프로세스가 file에 대해 open, create, close, delete 그 외에 RWX
TCP Socket (TCP 라는 대상을 추상화한 File에 대한 입출력 방법론에 대해 배우는 것)
file에서 데이터 단위
Stream, file append data
user mode application socket은 stream
kernel mode -> data 단위(L4) - segment / (L3) packet

cf) https://www.youtube.com/watch?v=3jQ2dBpiqPo&t=317s
https://en.wikipedia.org/wiki/Everything_is_a_file
"Everything is a file"라는 개념은 Unix 및 그 파생 운영체제에서 입력/출력을 처리하는 방식입니다. 이 개념에 따르면, 문서, 하드 드라이브, 모뎀, 키보드, 프린터, 그리고 일부 프로세스 간 및 네트워크 통신까지도 파일 시스템 네임스페이스를 통해 단순한 바이트 스트림으로 노출됩니다. 즉, 이러한 자원들이 모두 파일처럼 다뤄진다는 뜻입니다.
이 접근 방식의 장점은 동일한 도구, 유틸리티 및 API 세트를 다양한 자원과 파일 유형에 사용할 수 있다는 점입니다. 파일이 열리면 파일 경로를 주소 체계로 사용하는 파일 디스크립터가 생성됩니다.파일 디스크립터는 파일 작업이 수행되는 바이트 스트림 I/O 인터페이스입니다. 파일 디스크립터는 익명 파이프나 네트워크 소켓과 같은 객체에 대해서도 생성되므로, 이 기능을 더 정확하게 표현하면 "모든 것은 파일 디스크립터다"라고 할 수 있습니다.

출처: https://www.honeybadger.io/blog/how-unicorn-talks-to-nginx-an-introduction-to-unix-sockets-in-ruby/
최근에 이직한 회사는 private gitlab 서버로 구성이 되어 있어서, 자체 gitlab 서버내 ci를 구축하기 위해서는 도커 기반의 runner를 구축해야했는데, 이 과정에서

종진님 말씀대로 도커 컨테이너 내에서 도커를 실행해서 이미지 빌드나 실행등을 수행할 수 있도록 해주는 개념으로 Docker in Docker 로 이해했습니다. 그렇기 때문에 도커 소켓파일을 컨테이너 내부에 마운트 해줘야지 실행이 가능하고, 상용환경에서 사용하기에는 글에나온 옵션 2가 적절해서 2번 방식을 도입해보려고 하고 있습니다.
https://docs.gitlab.com/runner/register/index.html#registering-runners-with-docker
https://docs.gitlab.com/runner/install/docker.html

명령어 -v /var/run/docker.sock:/var/run/docker.sock은 Docker 컨테이너 실행 시 호스트 시스템의 Unix 소켓을 컨테이너 내부로 마운트하는 것입니다. 여기서 /var/run/docker.sock은 호스트 시스템에서 Docker 데몬이 사용하는 Unix 소켓 파일입니다. 이 파일은 Docker 클라이언트와 데몬 간의 통신을 처리하는데 사용됩니다.
이렇게 해야지 host 쪽에 속해있는 Docker 데몬이 Docker 클라이언트와 통신할 수 있다는 것을 바로 배울 수 있었음.
2. cgroups(control group)
cgroups는 시스템 자원의 사용을 제한하고 관리하는 기능을 제공하여 자원 할당을 세밀하게 조절할 수 있습니다.
네트워크 네임스페이스
네트워크 네임스페이스는 네트워크 스택을 분리하여 각 컨테이너가 고유한 네트워크 환경을 가지게 합니다. 이를 통해 네트워크 격리가 가능하며 보안성이 크게 향상되었습니다
pod에서 cpu request를 쓰면 docker –cpu-shares를 사용
docker run -d --cpu-shares 1024 --name cpu1 vish/stress -cpus "4"
해당 글에서 자세하게 설명되어 있는데, 아직 제가 쿠버네티스 지식이 부족해서 ㅜ 이해하면 다시 보충하겠습니다.
https://hellomuzi.tistory.com/33
k8s docker환경에서의 cpu request, limit
요약 kubernetes pod requests.cpu와 limits.cpu가 사용하는 docker의 설정이 다르다. cpu limit을 치는 상황에는 app container의 cpu가 throttle되어 requested는 보장하나, 실제 퍼포먼스가 저하될 수 있다. 서비스의 퍼
hellomuzi.tistory.com

3. 네트워크 네임스페이스 내 통신 과정 정리
네트워크 실습에서는 도커가 알아서 설정해주는 부분 default 라우팅 테이블 설정, 라우팅 테이블 내 MASQUERADE 설정을 통해서 bridge interface를 통해서 통신할 수 있도록 설정하는 부분에대해서 알아봤습니다. 원래는 도커가 알아서 해주는 부분이라서 전혀 알지 못했는데, 이 설정들을 실습을 통해서 따라함에 따라, 어떻게 도커 컨테이너 네트워크가 가능한것인지 알게되었습니다.
MASQUERADE
IP Masquerade(또는 MASQ, IPMASQ)란 리눅스의 NAT(Network Address Translation) 기능으로써 내부 컴퓨터들이 리눅스 서버를 통해서 인터넷 등 다른 네트워크에 접속할 수 있도록 해주는 기능입니다.
내부 컴퓨터들이 생성한 모든 네트워크 요청은 MASQ를 통해서 리눅스 서버의 외부 공인IP로 변환되어 인터넷에 연결되기 때문에, 외부에서는 리눅스 서버의 IP만 알 수 있을 뿐, 내부 컴퓨터의 존재를 전혀 알 수 없습니다. 이는 높은 보안성이라는 장점을 제공하지만, 반면에 외부에서 먼저 내부컴퓨터와 통신을 시도할 수 없기 때문에 상당한 제약으로 작용할 수 있습니다.
이러한 제약은 포워딩(iptable 이용)을 통해서 해소할 수 있습니다. 즉, 외부에서 특정 포트나 프로토콜로 리눅스 서버에 요청할 경우 지정한 내부 컴퓨터로 연결하도록 규칙을 지정 수 있습니다
출처: https://nsinc.tistory.com/100

<실습 주요 내용> 네트워크 네임스페이스 분리해서 bridge interface 기반으로 통신 테스트

이렇게 해도 되지 않음


라우팅 테이블 잡히는것 확인한다음(default via 11.11.11.1 dev reth0)
pkts 0 -> 1로 변하는것 확인함


방화벽에서 쉽게 얘기하는 NAT 정보 - conntrack

실습시 보여지는 값 헷갈릴 수 있는 부분 표시


- 4라는 값이 어떻게 나왓는지 매핑
cf)
https://docs.docker.com/engine/network/packet-filtering-firewalls/
<주요 리눅스 명령어 정리>
1. chroot: chroot 명령어는 지정된 디렉토리를 새로운 루트 디렉토리(/)로 설정하여, 해당 디렉토리 안에서 실행되는 프로세스가 마치 시스템의 루트 디렉토리처럼 인식하도록 만듭니다. 이를 통해 격리된 환경을 만들 수 있습니다.

2. unshare: unshare 명령어는 프로세스를 현재 프로세스의 네임스페이스와 분리하여 독립된 네임스페이스에서 실행되도록 합니다. 네임스페이스는 프로세스, 파일 시스템, 네트워크 등의 리소스를 격리할 수 있는 기능입니다.

3. ldd(List Dynamic Dependencies): ldd 명령어는 실행 파일이나 공유 라이브러리가 사용하는 동적 라이브러리(Shared Library)를 나열해줍니다. 이를 통해 특정 바이너리가 어떤 라이브러리에 의존하고 있는지 확인할 수 있습니다.

<개선해야하는 점>
- 요약에 앞서 올바르지 않은 용어 사용은 앞으로 조금 더 개선해 가도록하겠습니다. 단어 하나, 영어 대소문자하나하나도 정확하게 쓰려고 하겠습니다.
- 약간 구조화된 형태보단 하나의 이야기를 풀어서 글을 쓸 수 있도록 해보겠습니다. 또한 기계적인 지식 전달이 아니라, 실제로 제가 공부한 것을 다른 분들이 읽었을 때 잘 이해해서, 그 분들의 지식의 깊이가 넓어지고 깊어지는 것을 도울 수 있도록 하겠습니다.
- 제가 블로그를 잘 써본적이 없어서, 어떻게 정리해야하는지 이번기회에 조금씩 개선해야할 것 같습니다 ㅜㅜ
- 실습을 1주차 영상을 보면서 진행했는데, 캡쳐를 몇개 못한 부분이 있습니다 ㅜㅜ
- 실습 위주로 많이 남겨야 함.
- 보여주기 식으로 글을 정리하는 것은 옳지 않지만, 약간 글의 짜임새가 부족합니다. 앞으로 개선하도록 하겠습니다.
<느낀 점>
- 도커라는 기술이 워낙 쉽게 사용가능하다보니, 이 과정의 내부에서 이뤄지는 부분을 정확하게 알지 못한 체 사용하고 있었는데, 이번 기회에 더 잘 알게되는 계기가 되었습니다.
- 강의 영상 3개를 다 다시보니 이제 명확하게 이해가 되었습니다.
- 글을 잘 정리하기위해서는 훨씬 더 많은 공부와 노력이 필요하다는 것을 알게 되었습니다.
# 과제 정리 수행하지 못한 과제가 있는데, 스터디 진행하면서 틈틈히 할 수 있도록 하겠습니다.
[도전과제1] Jenkins 컨테이너로 해당 호스트의 Docker 데몬을 사용하는 파이프라인 구성 및 해당 동작이 가능한 원리에 대해서 정리
- 제가 gitlab runner 관련해서 설명한 부분과 같은 원리입니다.
[도전과제6] 2024년 KISA 보안가이드에 도커 관련 부분을 직접 점검 설정해보고 내용 정리
- 최근에 회사에서 CSAP 인증과 관련해서 작업한 부분이 있습니다.



위의 내용을 참고해서 작업을 진행했습니다.
[도전과제2] 이게 돼요? 도커 없이 컨테이너 만들기 3 : Overlay 파일시스템(이미지 ‘중복 문제’ 해결) 실습 따라해보고 정리
[도전과제3] 도커 컨테이너에서 USER 네임스페이스 격리 실습 후 정리
- 쿠버네티스 환경에서 파드에 USER 네임스페이스 격리 실습 후 정리
https://docs.docker.com/engine/security/userns-remap/
[도전과제4] 네임스페이스 중 time 과 cgroup 에 대한 정리와 간단 실습 시나리오 작성
[도전과제5] cgroupv2 를 이용하여 CPU, Memory, Disk IO 제한 설정 해보기
About cgroup v2
On Linux, control groups constrain resources that are allocated to processes. The kubelet and the underlying container runtime need to interface with cgroups to enforce resource management for pods and containers which includes cpu/memory requests and limi
kubernetes.io
[도전과제7] Sysbox Container Runtime 을 쿠버네티스 환경에 설치 후 파드에서 사용해보기

https://github.com/cri-o/cri-o/blob/main/tutorials/userns.md
cri-o/tutorials/userns.md at main · cri-o/cri-o
Open Container Initiative-based implementation of Kubernetes Container Runtime Interface - cri-o/cri-o
github.com
문제 해결하면서 진행해보려고 시도해보고 있습니다 ㅜ
'Docker 및 k8s' 카테고리의 다른 글
24년 10월 8일 AWS Operation Modernization Day(오프라인) - 역삼 센터필드 (0) | 2024.10.09 |
---|---|
네트워크 스터디 5주차 (2) | 2024.10.06 |
네트워크 스터디 4주차 (2) | 2024.09.29 |
네트워크 스터디 3주차 (0) | 2024.09.15 |
네트워크 스터디 2주차 - Pause Container 와 k8s CNI(Flannel) (0) | 2024.09.01 |