envoy proxy 사용하기

# envoy 는 프로시 서버로 요청을 원하는 곳으로 라우팅(포워딩)해준다.
# https://github.com/envoyproxy/envoy


##########


# mac 에서 envoy build
# brew llvm 버전 https://formulae.brew.sh/formula/llvm
brew install coreutils wget cmake libtool go bazel automake ninja llvm@7 autoconf

# 업그레이드 에러가 나오는 패키지들에 대해선 업그레이드를 수행 
brew upgrade coreutils wget cmake go ninja

# evnoy 소스 클론
git clone https://github.com/envoyproxy/envoy

# bazel 로 빌드
# worksapce 는 현재 envoy 소스 루트 디렉토리이고
# workspace 에서 상대위치 //source/exe 에 BUILD 파일이 있고
# BUILD 파일내에서 envoy-static 타겟으로 빌드
bazel build //source/exe:envoy-static

# bazel 빌드중 libz.a 실패해서 포기ㅠ


##########


# docker envoy 사용하기
# envoy 도커 이미지 받기
docker pull envoyproxy/envoy

# envoy 컨테이너 실행
# 디폴트로 9901 은 admin 접속하고, 10000 로 리슨하고 있다.
docker run --name envoy -p 9901:9901 -p 10000:10000 -dit envoyproxy/envoy

# envoy 컨테이너 삭제
docker rm -f envoy

# envoy 컨테이너 접속
docker exec -it envoy /bin/bash

# 디폴트 설정
cat /etc/envoy/envoy.yaml

# 10000 으로 요청하면 envoy 가 구글로 라우팅(포워딩) 한다.
http://127.0.0.1:10000/

# 이제 envoy.yaml 설정을 수정해 보자
# 참고로 docker envoy 이미지는 Ubuntu 버전이다.
# cat /etc/issue
# Ubuntu 16.04.6 LTS \n \l
# 최소한의 용량으로 vim 과 같을 툴은 기본적으로 설치되어 있지 않다.
# vim 을 설치하기 위해선 패키지 관리자 apt-get 을 업데이트하고 설치해야 한다.
# apt-get update && apt-get install -y vim
# vim 없으 아래명령으로 파일을 덮어 쓰자.
# daum.net 으로 라우팅을 변경해보자.
# admin 도 0.0.0.0 으로 모든 IP 에서의 접근을 허용하자.
cat > /etc/envoy/envoy.yaml << zzz
admin:
  access_log_path: /tmp/admin_access.log
  address:
    socket_address:
      protocol: TCP
      address: 0.0.0.0
      port_value: 9901
static_resources:
  listeners:
  - name: listener_0
    address:
      socket_address:
        protocol: TCP
        address: 0.0.0.0
        port_value: 10000
    filter_chains:
    - filters:
      - name: envoy.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.config.filter.network.http_connection_manager.v2.HttpConnectionManager
          stat_prefix: ingress_http
          route_config:
            name: local_route
            virtual_hosts:
            - name: local_service
              domains: ["*"]
              routes:
              - match:
                  prefix: "/"
                route:
                  host_rewrite: www.daum.net
                  cluster: service_daum
          http_filters:
          - name: envoy.router
  clusters:
  - name: service_daum
    connect_timeout: 0.25s
    type: LOGICAL_DNS
    # Comment out the following line to test on v6 networks
    dns_lookup_family: V4_ONLY
    lb_policy: ROUND_ROBIN
    load_assignment:
      cluster_name: service_daum
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: www.daum.net
                port_value: 443
    tls_context:
      sni: www.daum.net
zzz


# 설정 파일을 수정 후 envoy 재시작한다.
# https://www.envoyproxy.io/docs/envoy/latest/operations/hot_restarter
# --restart-epoch 로 재시작을 할 수 있지만 프로세스를 중지(ctrl+c)하면 컨테이너가 종료된다.
# /usr/local/bin/envoy -c /etc/envoy/envoy.yaml --restart-epoch 1 -l trace

# 그래서 변경된 설정파일 적용을 위해선 evnoy container 를 재시작한다.
docker stop envoy
docker start envoy

comments:

댓글 쓰기