7주차 - Istio Traffic 보안 & 통신 흐름
1.[실습] Application 배포

Product
Review
Rating
Detail
각각 다른 서비스들이 존재하고 배포를 해보겠습니다.
# 모니터링
watch -d 'kubectl get pod -owide;echo;kubectl get svc'
# Bookinfo 애플리케이션 배포
echo $ISTIOV
cat ~/istio-$ISTIOV/samples/bookinfo/platform/kube/bookinfo.yaml
kubectl apply -f ~/istio-$ISTIOV/samples/bookinfo/platform/kube/bookinfo.yaml
# 확인
kubectl get all,sa
# product 웹 접속 확인
kubectl exec "$(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}')" -c ratings -- curl -sS productpage:9080/productpage | grep -o "<title>.*</title>"
# 로그
kubetail -l app=productpage -f

# Istio Gateway/VirtualService 설정
cat ~/istio-$ISTIOV/samples/bookinfo/networking/bookinfo-gateway.yaml
kubectl apply -f ~/istio-$ISTIOV/samples/bookinfo/networking/bookinfo-gateway.yaml
# 확인
kubectl get gw,vs
istioctl proxy-status
# productpage 파드의 istio-proxy 로그 확인 Access log 가 출력 - Default access log format : 링크
kubetail -l app=productpage -c istio-proxy -f


# 접속 확인
kubectl get svc -n istio-system istio-ingressgateway
curl -s http://localhost:$IGWHTTP/productpage
curl -s http://192.168.10.101:$IGWHTTP/productpage
curl -s http://192.168.10.102:$IGWHTTP/productpage

2. [실습] kiali 배포 & grafana 배포
kubectl apply -f ~/istio-$ISTIOV/samples/addons # 디렉터리에 있는 모든 yaml 자원을 생성
kubectl rollout status deployment/kiali -n istio-system
# 확인
kubectl get all,sa,cm -n istio-system
kubectl get svc,ep -n istio-system
# kiali 서비스 변경
kubectl patch svc -n istio-system kiali -p '{"spec":{"type":"NodePort"}}'
# kiali 웹 접속 주소 확인
KIALINodePort=$(kubectl get svc -n istio-system kiali -o jsonpath={.spec.ports[0].nodePort})
echo -e "KIALI UI URL = http://$(curl -s ipinfo.io/ip):$KIALINodePort"
# Grafana 서비스 변경
kubectl patch svc -n istio-system grafana -p '{"spec":{"type":"NodePort"}}'
# Grafana 웹 접속 주소 확인 : 7개의 대시보드
GRAFANANodePort=$(kubectl get svc -n istio-system grafana -o jsonpath={.spec.ports[0].nodePort})
echo -e "Grafana URL = http://$(curl -s ipinfo.io/ip):$GRAFANANodePort"
# Prometheus 서비스 변경
kubectl patch svc -n istio-system prometheus -p '{"spec":{"type":"NodePort"}}'
# Prometheus 웹 접속 주소 확인
PROMENodePort=$(kubectl get svc -n istio-system prometheus -o jsonpath={.spec.ports[0].nodePort})
echo -e "Prometheus URL = http://$(curl -s ipinfo.io/ip):$PROMENodePort"



3. [실습] Request Routing
라우팅이 동적으로 되는 설정입니다.
특정 버전으로만 라우팅하게 구성해보도록 하겟습니다.
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: productpage
spec:
hosts:
- productpage
http:
- route:
- destination:
host: productpage
subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: ratings
spec:
hosts:
- ratings
http:
- route:
- destination:
host: ratings
subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: details
spec:
hosts:
- details
http:
- route:
- destination:
host: details
subset: v1
---
# istio vs(virtualservices) 확인
kubectl get vs
NAME GATEWAYS HOSTS AGE
bookinfo ["bookinfo-gateway"] ["*"] 85m
# 모든 마이크로서비스에 대해 v1 의 서브셋(subset) 에 전송되게 virtualservices 적용
kubectl apply -f virtual-service-all-v1.yaml
# istio vs(virtualservices) 확인 >> KIALI 에서 reviews v2,v3 향하는 트래픽 경로가 사라진다!
kubectl get virtualservices
NAME GATEWAYS HOSTS AGE
bookinfo ["bookinfo-gateway"] ["*"] 85m
details ["details"] 9s
productpage ["productpage"] 9s
ratings ["ratings"] 9s
reviews ["reviews"] 9s

흠 DR이라는 DETAIL 태그가 뜨진 않았다...

4. [실습] Fault Injection
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: ratings
spec:
hosts:
- ratings
http:
- match:
- headers:
end-user:
exact: jason
fault:
delay:
percentage:
value: 100.0
fixedDelay: 7s
route:
- destination:
host: ratings
subset: v1
- route:
- destination:
host: ratings
subset: v1
# virtualservices 적용
kubectl apply -f virtual-service-ratings-test-delay.yaml
이 실습도 정상적으로 표기되지 못했다.... 흠...
5. [실습] Traffic Shifting( 배포전략)
-> 이것 두개도 위에서의 실패때문에 적용하지 못했다.
6. Istio 보안

목적성
Zero Trust, 즉 서비스간 통신에 통신에 대한 주체를 검증하는 절차를 가지는 것입니다.
인증서 관리
Configuration API 서버로 인증, 권한, 이름 정보를 가집니다.
프록시는 클라이언트와 서버간의 보호를 위해 PEP으로 작동합니다.
TLS vs mTLS
TLS는 서버쪽에 인증서를 클라이언트에서 확인 하는 절차로 통신 내용을 암호화하는데 주요한 목적성이 있습니다.
mTLS 는 클라이언트의 인증서도 확인하면서 서로에 대한 신원을 확인하는 절차를 가지고 액세스 권한을 확인합니다. MIMA 이라는 ON PATH ATTACK 에 대해서 무력화 시킬 수 있습니다.
7. Istio 트래픽 흐름
Istio가 없으면 kernel을 한번만 통과해도 되지만, istio를 사용하게되면 kernel을 세번 통과하게 되는 것을 볼 수 있습니다.
지연과, 프로세싱, 복잡한 구조가 추가됩니다.
7.1 Client 요청에서 파드로 인입할때

Ingress로 들어옵니다.
XFF 값을 실제 Client 값으로 변경하고 srcIP 와 dIP 를 모두 SNAT, DNAT 해줍니다.
IPTABLE 에 따라 PROXY로 라우팅 되고 PORT 값이 바뀌어서 PROXY로 트래픽이 이전됩니다.
IPTABLE에서 다시 SNAT 을 LOCAL로 하고, Destination port 도 application으로 변경합니다.
동일한 과정으로 response가 처리가 됩니다.
Last updated