2 be week (Load Balancing)

cch_chan·2022년 9월 28일
0

GCP

목록 보기
10/14
post-custom-banner

로드밸런싱(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
꾸준히 새로운 기술을 배워나가는중입니다.
post-custom-banner

0개의 댓글