# 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
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
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