6. Istio: 서비스 메쉬의 선두주자
서비스 메쉬?
서비스 메쉬(Service Mesh)는 마이크로서비스 아키텍처에서 서비스 간의 통신을 관리하고, 보안을 강화하며, 트래픽을 제어하는 인프라 계층이다. 서비스 메쉬는 특히, 복잡한 네트워크 환경에서 서비스 간의 상호작용을 간편하게 해준다. 머 좋은건 알겠고 직접 설치해보고 사용해보고 맛보는게 최고다.
설치부터 시작이다. 역시 헬름을 이용해서 설치하겠다.
https://istio.io/latest/docs/setup/install/helm/
$ helm repo add istio https://istio-release.storage.googleapis.com/charts
$ helm repo update
$ helm upgrade --install istio-base istio/base -n istio-system --create-namespace --set defaultRevision=default
$ helm upgrade --install istiod istio/istiod --create-namespace -n istio-system
$ helm upgrade --install istio-ingress istio/gateway --create-namespace -n istio-system --set labels.istio=ingressgateway
$ kubectl get svc/istio-ingress -n istio-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
istio-ingress LoadBalancer 10.97.94.104 192.168.49.2 15021:31021/TCP,80:31031/TCP,443:31926/TCP 72m
service를 조회했을 때 EXTERNAL-IP가 192.168.49.2가 뜬다면 정상이다. 만약 이게 안뜬다면 metallb가 문제인거니 metallb를 확인해보면 될거같다.
PORT(S)를 해석해보면
1. 31021으로 트래픽이 들어오면 k8s cluster에서 15021로 리다이렉트하고
2. 31031로 트래픽이 들어오면 k8s cluster에서 80으로 리다이렉트하며
3. 31926으로 트래픽이 들어오면 k8s cluster에서 443으로 리다이렉트
라는 뜻이다. 80은 HTTP통신에 쓰고 443은 HTTPS 그리고 15021은 healthcheck 포트이다. 우리가 주의 깊게 봐야할 부분은 15021과 80번 포트이다.

위 그림에서
- web -> domain: 은 route53에서
- domain -> ec2: 은 loadBalancer에서
- ec2 -> minikube:은 linux port-forwarding에서
해결할 수 있다. 지금 연결고리가 다 끊어져있는데 이부분을 연결해주는 것이 핵심이다.
https를 사용하기 위해서 acm 또한 발급 받도록 하자.

타겟 그룹을 만들어줄 차례다.
- HealthCheckPort: 31021
- HealthCheckPath: /healthz/ready
- HTTPPort: 31031


타겟 그룹과 lb를 만들었으면 이제 Route53에 등록하자.


wildcard와 아무것도 없는 것으로 2개로 만들면된다.
마지막으로 linux에서 port-forwarding setting으로 마무리하자.
# sudo iptables -t nat -L --line-numbers
$ export SERVICEMESH_PORT=31031
$ export HEALTHCHECK_PORT=31021
$ export NETWORK_INTERFACE=ens5
$ export MINIKUBE_IP=192.168.49.2
$ echo "================================"
$ echo "[INFO] port-forwarding..."
# healthcheck portforwarding
$ sudo iptables -A PREROUTING -t nat -i ${NETWORK_INTERFACE} -p tcp --dport ${HEALTHCHECK_PORT} -j DNAT --to ${MINIKUBE_IP}:${HEALTHCHECK_PORT}
$ sudo iptables -A FORWARD -p tcp -d ${MINIKUBE_IP} --dport ${HEALTHCHECK_PORT} -j ACCEPT
# servicemesh portforwarding
$ sudo iptables -A PREROUTING -t nat -i ${NETWORK_INTERFACE} -p tcp --dport ${SERVICEMESH_PORT} -j DNAT --to ${MINIKUBE_IP}:${SERVICEMESH_PORT}
$ sudo iptables -A FORWARD -p tcp -d ${MINIKUBE_IP} --dport ${SERVICEMESH_PORT} -j ACCEPT
그런데 한가지 문제가 있다.(?) 문제라고하면 문제인데, 이 port-forwarding은 일회성이라는거다. 즉 재부팅 되면 사라지게된다. 매번 EC2인스턴스를 재시작할 때마다 port-forwarding과 minikube를 시작해줘야 한다. 이거 귀찬타고하면 진짜 귀찮은 문제라 재부팅할 때마다 실행할 수 있도록 리눅스 서비스 등록을 진행하자.