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"
kiali 화며ㄴ
grafana

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 요청에서 파드로 인입할때

  1. Ingress로 들어옵니다.

  2. XFF 값을 실제 Client 값으로 변경하고 srcIP 와 dIP 를 모두 SNAT, DNAT 해줍니다.

  3. IPTABLE 에 따라 PROXY로 라우팅 되고 PORT 값이 바뀌어서 PROXY로 트래픽이 이전됩니다.

  4. IPTABLE에서 다시 SNAT 을 LOCAL로 하고, Destination port 도 application으로 변경합니다.

  5. 동일한 과정으로 response가 처리가 됩니다.

Last updated