DevOps

    [Linux] 리눅스 표준 스트림과 파이프라인, 리다이렉션

    표준 스트림(Standrad Stream) 유닉스 이전의 대부분의 운영 체제에서, 프로그램은 명시적으로 적절한 입력 장치와 출력 장치에 연결해줄 필요가 있었다. 이 작업은 각 OS 마다 처리 방식이 달랐기 때문에 매우 방대한 작업이었다. 수많은 시스템에서 환경 설정을 제어하거나, 파일 테이블에 접근하거나, 필요한 데이터 셋을 결정하기 위해 펀치 카드 리더기나 자기 테이프 드라이브, 라인 프린터, 카드 펀치, 대화식 터미널을 적절하게 제어할 필요가 있었다. 이런 상황에서, 유닉스의 획기적인 발전 중 하나는 장치의 추상화였다. 프로그램은 더 이상 어떤 장치와 연결되는지 알 필요가 없었다. 유닉스는 기존의 복잡성을 데이터 스트림이라는 개념으로 해소 시켰다. 데이터 스트림은 순차적인 데이터 바이트들을 파일의 끝..

    [Linux] 프록시 서버의개념, NGINX 리버스 프록시와 캐싱

    리버스 프록시란 무엇인가? 리버스 프록시는 웹 서버 앞에 위치하며 클라이언트(예: 웹 브라우저) 요청을 해당 웹 서버로 전달하는 서버이다다. 리버스 프록시는 일반적으로 보안 , 성능 및 안정성을 높이는 데 도움이 되도록 구현된다. 리버스 프록시의 작동 방식과 제공할 수 있는 이점을 더 잘 이해하기 위해 먼저 프록시 서버가 무엇인지 정의해 보겠다. 프록시 서버란 무엇인가? 프록시, 프록시 서버 또는 웹 프록시라고도 하는 정방향 프록시는 클라이언트 시스템 그룹 앞에 있는 서버이다. 이러한 컴퓨터가 인터넷의 사이트 및 서비스에 요청을 하면 프록시 서버는 해당 요청을 가로챈 다음 중개인처럼 해당 클라이언트를 대신하여 웹 서버와 통신한다. 예를 들어 일반적인 정방향 프록시 통신과 관련된 3대의 컴퓨터 이름을 지정..

    [DevOps] 소켓과 포트의 특징, HTTP버전별 특징

    소켓(Socket)이란 무엇인가? 일반적으로 서버는 특정 컴퓨터에서 실행되며 특정 포트 번호에 바인딩된 소켓이 있다. 서버는 클라이언트가 연결 요청을 하기 위해 소켓을 수신 대기한다. 클라이언트 측에서: 클라이언트는 서버가 실행 중인 시스템의 호스트 이름과 서버가 수신 중인 포트 번호를 알고 있는데 연결 요청을 만들기 위해 클라이언트는 서버의 시스템 및 포트에서 서버와 연결을 시도하게 된다. 또한 클라이언트는 이 연결 중에 사용할 로컬 포트 ​​번호에 바인딩되도록 서버에 자신을 식별해야 한다. 일반적으로 시스템에서 할당한다. 모든 것이 순조롭게 진행되면 서버가 연결을 수락한다. 수락하면 서버는 동일한 로컬 포트에 바인딩된 새 소켓을 가져오고 remote endpoint도 클라이언트의 주소와 포트로 설정하..

    [K8s] 쿠버네티스 Deployment를 이용한 RollingUpdate

    Deployment RollingUpdate를 설명하기에 앞서 무중단 배포에 대해서 얘기 좀 해보겠다 무중단 배포 DevOps에서 말하는 CI&CD 지속적 통합 지속적 배포이다 예를 들자면 쇼핑몰의 서비스를 진행 중인데 고객 관련 로직을 수정을 해서 WAS를 업데이트 즉 새로운 버전으로 배포를 해야 한다 하지만 업데이트 시점에 구 버전을 다운시키고 신 버전을 업 시키게 되면 그 중간에 트래픽 전송을 못하는 시점이 생겨버린다 이 시간에 만약에 쇼핑몰을 이용한다면 어떻게 될까 쇼핑몰을 이용하는 사용자는 원활하게 서비스를 이용하지 못하며 서비스 운영자는 그 시간에 거래가 불가능하기에 금전적 손실이 어마어마하게 발생할 것이다 위의 예시는 조금 최악의 상황을 가정하여 들은 예시지만, 충분히 있을 법한 예시이다. ..

    [K8s] 쿠버네티스 Deployment의 개념

    Deployment 디플로이먼트(Deployment)는 파드와 레플리카셋(ReplicaSet)에 대한 선언적 업데이트를 제공한다. 디플로이먼트에서 의도하는 상태를 설명하고, 디플로이먼트 컨트롤러(Controller)는 현재 상태에서 의도하는 상태로 비율을 조정하며 변경한다. 새 레플리카셋을 생성하는 디플로이먼트를 정의하거나 기존 디플로이먼트를 제거하고, 모든 리소스를 새 디플로이먼트에 적용할 수 있다. 사용 사례 레플리카셋을 롤아웃 할 디플로이먼트 생성. 레플리카셋은 백그라운드에서 파드를 생성한다. 롤아웃 상태를 체크해서 성공 여부를 확인한다. 디플로이먼트의 PodTemplateSpec을 업데이트해서 파드의 새로운 상태를 선언한다. 새 레플리카셋이 생성되면, 디플로이먼트는 파드를 기존 레플리카셋에서 새로..

    [K8s] 쿠버네티스 ReplicaSet의 개념

    ReplicaSet은 Pod 복제본을 생성하고 관리한다 더 이상 N개의 Pod을 생성하기 위해 생성명령을 N번실행할 필요가 없다 ReplicaSet오브젝트를 정의하고 원하는 Pod의 개수를 replicas속성으로 선언한다 클러스터관리자대신 Pod수가부족하거나 넘치지 않게 Pod 수를 조정 레플리카셋을 사용하는 시기 쿠버네티스 공식 docs에서 말하는 레플리카셋은 지정된 수의 파드 레플리카가 항상 실행되도록 보장한다. 그러나 디플로이먼트는 레플리카셋을 관리하고 다른 유용한 기능과 함께 파드에 대한 선언적 업데이트를 제공하는 상위 개념이다. 따라서 우리는 사용자 지정 오케스트레이션이 필요하거나 업데이트가 전혀 필요하지 않은 경우라면 레플리카셋을 직접적으로 사용하기보다는 디플로이먼트를 사용하는 것을 권장한다...

    [K8s] 쿠버네티스 Label과 Selector

    Label 쿠버네티스 오브젝트를 식별하기 위한 key:value 쌍의 메타데이터이다 Selector Label을 이용해 쿠버네티스 리소스를 필터링하고 원하는 리소스 집합을 구하기 위한 label query이다 그렇다면 언제 필요한가 한번 아래의 그림으로 설명해보겠다쿠버네티스 상에서 실행되고 있는 모든 Pod라고 할 때 사실 이 Pod들의 구분은 경계가 없다 그래서 예를 들어보면 내가 주문요청을 지정된 주문 Pod으로만 리다이렉트 하고 싶다 할 때 어떤 Pod이 주문 Pod인지 정의할 수 있어야 한다 일종의 주문 Pod의 집합이라고 생각하면 되겠다 또한 똑같이 주문요청이 있다면 배달 요청도 있을 텐데 똑같이 배달 Pod 들의 경계 즉 집합을 만들어주면 된다 이런 식으로 쿠버네티스에 많은 리소스들이 있는데..

    [K8s] 쿠버네티스 Pod간의 네트워크

    1. Pod안에 서로 다른 컨테이너끼리 localhost로 통신한다 하나의 Pod에 서로 다른 포트로 컨테이너 2개를 선언 2. 서로 다른 Pod끼리 Pod IP로 통신한다. Pod A에 있는 컨테이너 -> Pod B에 있는 컨테이너로 요청 전송/응답 확인 (파드 안에서 실행될 컨테이너는 준비되어있는 이미지이다) 진행 순서를 다시 한번 확인해 보자면 Pod 선언과 환경변수 설정 Pod 생성/배포 Pod IP 할당 및 컨테이너 실행 확인 컨테이너 환경변수 목록 확인 컨테이너 간 localhost 통신 다른 Pod의 Pod IP로 통신 포트포워딩을 통해 각 컨테이너로 요청/응답 확인 컨테이너 안에서의 엔드포인트 응답은 /sky, /tree, /rose, /hello 4개의 엔드포인트로 확인해볼 거다 총 실행..