2023~17 Ch07 컨피그맵과 시크릿: 애플리케이션 설정 7.1 컨테이너화된 애플리케이션 설정컨테이너 내 애플리케이션에 설정 사항을 전달하는 방법* 컨테이너에 명령줄 인수 전달* 각 컨테이너를 위한 환경 변수 설정* 볼륨을 컨테이너에 마운트하여 설정7.2 컨테이너에 명령줄 인자 전달1) 도커 파일로 이미지를 띄울 때 인자 전달fortuneloop.sh: INTERNAL 변수 간격으로 /var/htdocs/index.html 에 fortune 문구를 저장#!/bin/bashtrap "exit" SIGINTINTERVAL=$1echo Configured to generate new fortune every $INTERVAL secondsmkdir -p /var/htdocswhile :do echo $(date) Writing fortune to /var/htdo.. 2024. 11. 21. Ch 06 볼륨: 컨테이너에 디스크 스토리지 연결 6.1 볼륨 소개컨테이너의 파일 시스템은 컨테이너끼리 독립적이며 컨테이너가 재시작할 때마다 초기화볼륨은 파드가 생성되고 삭제될 때 같이 생성, 삭제되며 컨테이너의 파일시스템 경로에 마운트하여 데이터 저장 가능- WebServer 컨테이너: 생성된 html을 서빙하는 서버- ContentAgent 컨테이너: html 생성하는 서버- LogRotator 컨테이너: 사용자와 상호작용시 로그를 남기는 서버 를 운용할 때, 컨테이너 내 파일시스템만 이용하면 각각의 컨테이너에서 다른 컨테이너의 파일시스템에 접근 불가(ContentAgent 컨테이너 내 파일 경로에 html 을 저장했다고 하더라도 WebServer 컨테이너에서 접근 불가)대안으로 WebServer 컨테이너, ContentAgent 컨테이너 사이에 .. 2024. 11. 17. Ch10 Scheduler 10.1 스레드(Thread)의 개념 이해물리적인 스레드: CPU 코어를 논리적으로 나누어 놓은 스레드논리적인 스레드: 소프트웨어적으로 생성된 스레드물리적인 스레드는 진짜로 동시에 돌아가고 - 병렬성,논리적인 스레드는 여러 물리적 스레드를 빠른 속도로 번갈아 가며 실행되기 때문에 동시에 돌아가는 것 처럼 보인다 - 동시성 10.3 Scheduler를 위한 전용 Operator1) subscribeOn() Flux.fromArray(new Integer[] {1, 3, 5, 7}) .subscribeOn(Schedulers.boundedElastic()) .doOnNext(data -> log.info("# doOnNext: {}", data)) .doOnSubscri.. 2024. 11. 5. Ch09 Sinks 9.1 Sinks 란? - Publisher 와 Subscriber 의 역할을 모두 할 수 있는 리액티브 스트림즈 구성 요소- Reactor 3.5 부터 Processor 가 없어지고 Sinks만 지원- Sinks의 주 용도는 "signal을 프로그래밍 코드를 통해 명시적으로 전달하는 것"- create(), generate() operator는 싱글 스레드 기반에서 signal 을 전송하는데 사용하고, Sinks는 멀티스레드 방식으로 signal 을 전송하는데 사용함(thread-safety)1) create Operator를 사용하는 경우public class Example9_1 { public static void main(String[] args) throws InterruptedExcept.. 2024. 11. 3. Ch08 Backpressure 8.1 Backpressure Publisher 가 데이터를 emit 하는 속도가 Subscriber 가 처리하는 속도보다 훨씬 더 빠를 때, 오버플로우나 시스템 다운 발생 가능 이러한 문제를 해결하기 위한 수단이 BackPressure 8.2 Reactor에서의 Backpressure 처리 방식 1) 데이터 개수 제어 Subscriber 가 처리할 수 있는 수준의 데이터 개수를 Publisher 에게 지정(전달) 하는 방법 @Slf4j public class Example8_1 { public static void main(String[] args) { Flux.range(1, 5) .doOnRequest(data -> log.info("# doOnRequest: {}", data)) .subscrib.. 2024. 10. 22. Ch05 서비스: 클라이언트가 파드를 검색하고 통신을 가능하게 함 5.1 서비스 소개 서비스가 필요한 이유파드는 노드에 스케줄링 된 뒤 고유의 IP 주소를 할당 받기 때문에 클라이언트는 파드의 정확한 IP 주소를 미리 알 수 없을 뿐더러, 미리 안다고 하더라도 노드 장애, 스케일링 때마다 달라지는 파드들의 개별 IP 목록을 계속 신경 쓸 수 없음✅ 동일한 서비스를 제공하는 파드에 대해 고정 IP 를 할당하여 클라이언트가 해당 IP::포트 에 연결할 수 있도록 함 (서비스 리소스)서비스 생성 0) 특정 라벨 셀렉터를 가지는 서비스 yaml 작성 서비스 IP: 80 번 포트를 app=kubia 라벨을 갖는 파드의 8080 포트에 연결하겠다는 의미 apiVersion: v1kind: Servicemetadata: name: kubiaspec: ports: - port:.. 2024. 10. 13. Ch04 레플리케이션과 그 밖의 컨트롤러: 관리되는 파드 배포 4.1 파드를 안정적으로 유지하기 라이브니스 프로브1) 파드 내 컨테이너에 크래시가 발생하면 Kubelet 이 자동으로 컨테이너를 재시작2) 크래시가 발생하여 종료된 것이 아니더라도 무한 루프, 교착 상태에 빠져있거나 OutofMemoryErrors 를 뱉어내는 등 오류가 있을 수 있기 때문에 애플리케이션 외부에서 해당 컨테이너 상태를 지속적으로 체크하는 시스템 필요 (라이브니스 프로브) 라이브니스 프로브 종류1) HTTP GET 프로브: 특정 ip, 포트, 경로로 HTTP 요청 후 응답 결과가 실패(4xx, 5xx) 혹은 응답 없음일 경우 컨테이너 재시작2) TCP 소켓 프로브: 컨테이너의 지정 포트에 TCP 연결 시도하여 연결 실패할 경우 컨테이너 재시작3) Exec 프로브: 컨테이너 내에서 임의의.. 2024. 10. 10. Ch07 Cold Sequence 와 Hot Sequence 7.1 Cold 와 Hot 의 의미 Hot: 작업을 새로 시작하지 않고 기존 상태를 유지한다는 의미 (e.g Hot Swap, Hot Deploy) Cold: 기존의 연결을 끊고 같은 작업을 반복한다는 의미 (e.g Cold Wallet) 7.2 Cold Sequence 구독을 할 때마다 Publisher 가 데이터를 emit 하는 과정을 처음부터 다시 시작하는 데이터 흐름 (A가 구독하면 처음부터 emit, 추후에 B가 구독하면 다시 처음부터 emit) Flux coldFlux = Flux .fromIterable(Arrays.asList("A", "B", "C")) .map(String::toLowerCase); coldFlux.subscribe(each -> log.info("# Subscriber.. 2024. 10. 2. Ch03 파드: 쿠버네티스에서 컨테이너 실행 3.1 파드 소개 파드 한 개 혹은 두 개 이상의 컨테이너를 포함하는 컨테이너 그룹 배포가 이루어지는 단위 하나의 컨테이너 내 다중 프로세스 vs 다중 컨테이너 비교 컨테이너 내 다중 프로세스를 실행한다면 프로세스의 실행과 로깅이 모두 개발자 책임이 되어버리는 문제가 있기 때문에 하나의 프로세스 당 하나의 컨테이너로 분리해서 관리하는 것이 좋음 파드 내 컨테이너들이 동일하게 공유하는 부분 네트워크 네임스페이스, UTS 네임스페이스 (동일한 호스트 이름, ip 주소, 포트 공간) IPC 네임스페이스 파드 내 컨테이너들에게 분리되어있는 부분 PID 네임스페이스 (ps aux를 통해 컨테이너 안에서 실행되는 프로세스만 보기) 파일 시스템 (볼륨 개념을 통해 공유 가능) 하나의 파드에 여러 개의 컨테이너를 모두.. 2024. 9. 30. Ch02 도커와 쿠버네티스 첫 걸음 2.1 도커를 사용한 컨테이너 이미지 생성, 실행, 공유하기1) Docker File 작성 및 컨테이너 안에서 실행시킬 애플리케이션 준비 2) 컨테이너 이미지 생성 도커 데몬에 Docker file 및 필요한 애플리케이션 파일을 업로드 + 빌드 수행이 때, 로컬에 필요한 이미지 레이어가 존재하지 않는다면 도커 허브에서 기반 이미지 레이어를 pull 하여 빌드 docker build -t kubia . // 현재 디렉토리(.)에 있는 도커파일을 기반으로 이름이 kubia 인 이미지 생성 3) 컨테이너 이미지 실행 docker run --name kubia-container -p 8080:8080 -d kubia// kubia 이미지를 이용해서 kubia-container 를 생성 + 실행// -d: 백그.. 2024. 9. 26. 이전 1 2 다음