2 be week (Load Balancing)

cch_chan·2022년 9월 28일
1

GCP

목록 보기
10/13

로드밸런싱(Load Balancing)이란?

컴퓨터 네트워크 기술의 일종으로 둘 혹은 셋 이상의 중앙처리장치 혹은 저장장치와 같은 컴퓨터 자원들에게 작업(Work), 즉, 부하(Load)를 나누는 것을 의미한다. 이로써 가용성 및 응답시간을 최적화시킬 수 있다.

=> "한 놈(한 서버)이 일을 다 처리하면 부담스러우니, 여러 놈(여러 서버)한테 일을 나누겠다!"

Load Balancer의 주요 기능

  • 부하 분산
  • 오토 스케일링
    • 조건에 맞춰 필요시 server에 컴퓨터 수를 늘리거나 줄여서 부하 관리가 가능. (Scale out, Scale in)
  • Health Check
    • 해당 포트에 트래픽을 보내 애플리케이션이 올바르게 작동하는지 여부를 판별
  • 보안 서비스 WAF, NAT
    • Web Application Firewall(WAF) : 웹의 비정상 트래픽을 탐지하고 차단하기 위한 방화벽
    • Cloud NAT(Network Address Translation) : 외부 연결에 노출되는 IP를 관리하여 위험 최소화

GCP 로드밸런서의 종류 특징

HTTP(s) Load balancer

  • Global 외부 HTTP(s) 로드 밸런싱

    • Global

      • backend service resorce의 region이 달라도 괜찮음
    • Cloud Run, App Engine, Cloud Functions 등 서버리스 백엔드 서비스 활용가능

      • serverless NEG(network endpoint groups)를 통해 연결 가능

  • 여러 백엔드 서비스에 경로 지정이 가능함

  • *WebSocket 지원

  • 내부 HTTP(s) 로드 밸런싱

    • Regional
    • 서버리스는 Cloud Run만 사용가능
    • 여러 백엔드 서비스에 경로 지정이 가능함
    • *WebSocket 지원

Web socket?

HTTP 통신은 기본적으로 클라이언트 요청(request)이 있을때만 서버가 응답(response)하는 방식인 단방향 통신이기 때문에 HTTP로 Streaming 실시간 데이터 교환시 Header가 불필요하게 커지기 때문에 생겨난 웹버전 socket 프로토콜입니다.

웹 환경에서 연속된 데이터를 처리하기 위해 사용 (ex. 채팅, 주식)

  • 특징

    • 양방향 통신
      • 데이터 송수신을 동시에 처리할 수 있는 통신 방법 TCP와 같은 handShake 방식이용
    • Stateful protocol
      • Web socket에 경우 한번 연결되면 영구적이라 필요 없이 발생되는 연결 트래픽을 피할 수 있음.
    • HTML5 이후 부터 적용가능

    HTTPs

  • HTTP(Hyper Text Transfer Protocol)
    서버 -> 브라우저로 전송 되는 정보가 암호화 되지 않음
    -> 패킷 도난시 사용자 데이터를 도난 당할 수 있음.

  • HTTPS(Hyper Text Transfer Protocol Secure)
    우선 HTTPs의 s는 Secure에 약자이고, HTTP 프로토콜에서 보안을 추가한 형태이며, TLS/SSL(보안 소켓 계층)을 사용하여 [서버 -> 브라우저]로 이동 할때 사용자의 정보를 암호화해서 보내게 됨으로써 혹시라도 데이터를 도난 당해도 제 3자가 정보를 볼 수 없도록함

SSL(Secure Sockets Layer)

  • SSL 이란 보안 소켓 계층으로 인터넷 상 데이터를 안전하게 전송하기 위한 인터넷 암호화 통신 프로토콜이며, L6 표현계층으로 어떤 계층의 데이터라도 암호화 가능하다.

  • SSL 어떻게 작동하는가?

    • 클라이언트가 서버에 인증 요청
    • 서버가 공개키로 된 SSL 인증서 전달
    • 클라이언트는 SSL 인증서를 복호화해서 검증 후 정상이면 서버와 원하는 데이터를 주고 받기 위한 대칭키를 생성하고 대칭키를 해독할수 있는 키를 전달
    • 서버가 확인하면 이후 데이터는 대칭키를 이용해서 데이터를 주고 받음
  • 대칭키와 공개키를 조합해서 쓰는 이유

    • 공개키만 이용하는건 데이터를 안전하게 주고 받을 수 있는 대신 속도가 느리고 비용이 크게 듬
    • 대칭키만 이용하는건 대칭키에 경우 암호화를 푸는 키를 주고 받아야 하기 때문에 암호화 되지 않은 상태로 주고 받는건 위험요소가 큼
  • GCP SSL 인증서 생성

    • 자체 관리형 SSL
      • 사용자가 직접 프로비저닝과 갱신
      • 직접 비공개키와 CA인증서 생성 필요
    • Google 관리형 SSL
      • 도메인만 소유하고 있으면 Google에서 SSL 인증서를 자동으로 프로비저닝
      • 와일드 카드 도메인 지원 x 도메인을 최대 100개까지 지원
      • 리전 외부 HTTP(s) LB, 내부 HTTP(s)LB에는 지원 x

Google HTTP(s) 외부 로드밸런서에 강점

구글이 직접 설치한 해저 네트워크망을 사용하기 때문에 타 벤더사와 다르게 서버로 들어오는 트래픽을 구글이 전 세계에 배포한 엣지 노드 중 가장 가까운 노드에 접속한 후, 구글의 광케이블 백본망으로 목표 서버로 전송한다. (글로벌 로드밸런싱을 지원)

타 벤더사 network edge service : AWS Global Accelerator


  • 외부 TCP/UDP 로드 밸런싱
    • 외부 ip
    • Regional
    • 서버리스 x
    • routing 경로 설정 불가능
      • 이유 : L4에서는 패킷의 내용을 살펴볼 수 없기 때문에 섬세한 routing이 불가능)
  • 내부 TCP/UDP 로드 밸런싱
    • 내부 ip
    • Regional
    • 서버리스 x
    • routing 경로 설정 불가능
  • TCP vs UDP

    TCPUDP
    연결방식연결형 서비스비연결형 서비스
    패킷교환가상 회선 방식데이터그램 방식
    전송 순서 보장보장함보장하지 않음
    신뢰성높음낮음
    전송 속도느림빠름

-> TCP는 handskake가 강제 되는 단점 때문에 온라인 게임같은 지연시간 없는 실시간 스트리밍이 필요한 경우에는 UDP를 사용

  • Handskake 단점
    tcp는 ip주소와 포트로 연결을 식별하기 때문에 클라이언트의 ip가 바뀔때마다 연결이 끊어지고 다시 3way handshake 과정을 거쳐야하고 그 과정에서 레이턴시가 발생

  • SSL/TCP 프록시 로드 밸런싱
    • Global
    • non-HTTP traffic
    • 서버리스 x
    • Intelligent routing
      • 용량이 충분하고 본인과 가까운 백엔드 인스턴스로 자동으로 routing

SSL proxy vs TCP proxy
기본적으로 구조는 동일하지만 SSL을 통해 암호화하느냐 마느냐로 갈린다.


Global HTTP 로드밸런서 생성

목표 아키텍처

https://velog.velcdn.com/images/cks8483/post/18b10e45-c1d3-4814-8146-bf8c9c9ba6df/image.png

실습 목표

Global L7 HTTP 로드 밸런서를 만들어보고 인스턴스 그룹별 path지정을 통해 클라우드 웹 서비스 구조파악과 백엔드 버킷 사용해보기.

추가적으로 gcloud 활용

  • 환경 설정 (region, zone 설정)
    gcloud config set compute/region asia-northeast3
    gcloud config set compute/zone asia-northeast3-b
  • 인스턴스 템플릿 만들기
    • nginx.sh 생성

      cat << EOF > nginx.sh
      #! /bin/bash 
      apt-get update 
      apt-get install -y nginx 
      service nginx start 
      sed -i -- 's/nginx/Google Cloud Platform - '"\$HOSTNAME"'/'
      /var/www/html/index.nginx-debian.html 
      EOF
    • nginx-template 생성

      gcloud compute instance-templates create nginx-template \
      --metadata-from-file startup-script=nginx.sh
    • apache2.sh 생성

      cat << EOF > apache2.sh
      #! /bin/bash
      			sudo apt-get update
      			sudo apt-get -y install apache2
      			sudo cat <<EOF > /var/www/html/login/index.html
      			 <html><title>Login</title>
      			<body><p>Login</p>
      			<p>id</p>
      			<p>pw</p>
      			</body>
      			</html>
      EOF
  • 인스턴스 그룹 생성
    • nginx-template을 활용한 인스턴스 그룹 2개 생성
      gcloud compute instance-groups managed create nginx-group 
      --base-instance-name nginx  
      --size 2  
      --template nginx-template
    • apache-template 이용한 그룹 생성
      gcloud compute instance-groups managed create apache-group \
      --base-instance-name apache \
      --size 2 --template apache-template
  • firewall rule 생성
    • port tcp 80 port 생성

      gcloud compute firewall-rules create tcp-rule-80 --allow tcp:80
  • health check 생성
    gcloud compute http-health-checks create http-check
    gcloud compute http-health-checks create http-login-check \
    --request-path=login
  • backend bucket 만들기
    • cloud storage bucket 생성
      gcloud storage buckets create gs://cat-images-bucket
    • file 전송
      gsutil cp kitten.png  gs://cat-image-bucket/images/
    • backend bucket 생성
      gcloud compute backend-buckets create bucket-backend \
      --gcs-bucket-name=cat-images-bucket
  • 백엔드 서비스
    • backend service(nginx,apache) 생성

      gcloud compute backend-services create nginx-backend \
      --protocol HTTP --http-health-checks http-check --global
      gcloud compute backend-services create apache-backend \
      --protocol HTTP --http-health-checks http-login-check --global
    • backend service(nginx, apache) 인스턴스 그룹과 연결

      gcloud compute backend-services add-backend nginx-backend \
      --instance-group nginx-group \
      --instance-group-zone asia-northeast3-b \
      --global
      gcloud compute backend-services add-backend apache-backend \
      --instance-group nginx-group \
      --instance-group-zone asia-northeast3-b \
      --global
  • URL Map 생성
    • HTTP 로드밸랜서

      gcloud compute url-maps create web-map \
        --default-service nginx-backend
    • url map path role 추가

      gcloud compute url-maps add-path-matcher web-map \
      --path-matcher-name = path-matcher-2 \
      --new-hosts=* \
      --default-service = nginx-backend \
      --backend-bucket-path-rules="/images/* = bucket-backend"
      '''
      
  • 프론트 엔드
    • HTTP target proxy 생성 (URL map에 proxy 연결)

      gcloud compute target-http-proxies create http-lb-proxy --url-map web-map
    • Forwarding Rule 생성

      gcloud compute forwarding-rules create http-content-rule \
      --global \
      --target-http-proxy http-lb-proxy \
      --ports 80

결과물

  • backend Path 구분을 통한 routing

    • default (nginx)

    • /login/* (apache2)

    • /images/kitten.png (bucket-images)


trouble shooting

url map에서 /path로 라우팅했을때 not found

백엔드 서비스로 주소 지정을 해주었음에도 url을 찾지 못해서 not found가 나옴

해결 방법
default로 정해진 /var/www/html에서 index.html을 찾지 못해서 Not Found가 나왔기 때문에 home 디렉토리를 생성하고 index.html file에 넣어주면 해결

backend bucket 권한 문제

해결방법
권한 문제가 발생하였고, 아래 명령어로 모든 유저가 오브젝트를 볼 수 있는 권한을 줘서 해결

gsutil iam ch allUsers:objectViewer gs://cat-images-bucket

gcloud CLI에 장점

처음에는 옵션이나 명령어 같은 부분을 하나 하나 찾아 써야해서 오히려 콘솔보다 느릴 수 도 있겠다 싶지만 2번 3번 이상이 된다면 오히려 콘솔에서 설정 부분(머신타입, 방화벽 등) 사소하게 놓칠 수 있지만 코드로 한다면 오히려 오류 없이 만들 수 있고 속도 면에서 장점있을거 같다 싶었습니다.

소감

이번 기회에 로드밸런싱에 대해 다 알게 되었다고는 못하겠지만 로드밸런서 특징별 대체적으로 어떤 구조와 기능을 가지고 있는지 알게되는 시간이 됐고 다음 번에는 이걸 활용해서 다른 프로젝트에도 적용이 가능하지 않을까 생각합니다.

profile
꾸준히 새로운 기술을 배워나가는중입니다.

0개의 댓글

관련 채용 정보