ㅡ.ㅡ

[Service Mesh] Istio 본문

Network

[Service Mesh] Istio

ekwkqk12 2022. 2. 2. 16:20

Istio Flow

Ingress Gateway > Gateway + VirtualService + Destination Rule > Service > Pod

Istioctl

# 네임스페이스 생성
ktl create ns istio-system

# istioctl 설치
curl -L https://istio.io/downloadIstio | sh -
sudo cp -v bin/istioctl /usr/local/bin/
itl version
itl install -f istio-ingress.yaml

# Istio와 관련된 리소스 삭제
istioctl x uninstall --purge

# Mesh service를 사용할 Istio 활성화 라벨 추가
kubectl label namespace 네임스페이스명 istio-injection=enabled --overwrite

Istio-ingressgateway

APP 통신의 최상단으로 진입점을 의미
1 : Envoy Proxy의 AccessLog 설정
2 : 기본값으로 설정된 isito-ingressgateway를 비활성화하며 istio-ingressgateway-1이라는 이름으로 LB Type의 NLB생성

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  namespace: istio-system
  name: multiple-ingress-istio-controll-plane
spec:
  # 1
  meshConfig:
    accessLogFile: /dev/stdout

  # 2
  components:
    ingressGateways:
    - name: istio-ingressgateway
      enabled: false
    - name: istio-ingressgateway-1
      enabled: true
      label:
        istio/ingress: istio-ingressgateway-1
      k8s:
        serviceAnnotations:
          service.beta.kubernetes.io/aws-load-balancer-backend-protocol: tcp
          service.beta.kubernetes.io/aws-load-balancer-type: "external"
          service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: instance
          service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "443"
          service.beta.kubernetes.io/aws-load-balancer-name: prv-1388-istio-ingress-gw1
          service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
          service.beta.kubernetes.io/aws-load-balancer-target-group-attributes: "preserve_client_ip.enabled=true"
          service.beta.kubernetes.io/aws-load-balancer-cross-zone-load-balancing-enabled: "true"
        service:
          ports:
            - name: status-port
              port: 15021
              protocol: TCP
              targetPort: 15021
            - name: http
              port: 80
              protocol: TCP
              targetPort: 8080
            - name: https
              port: 443
              protocol: TCP
              targetPort: 8443
            - name: tcp-istiod
              port: 15012
              protocol: TCP
              targetPort: 15012
            - name: tls
              port: 15443
              protocol: TCP
              targetPort: 15443

APP / Istio Resource

Gateway

트래픽을 받을 출발지에 대한 정보(호스트, 포트, 프토토콜 등)를 정의
진입점인 Istio ingress gateway에 생성한 라벨과 클라이언트가 요청할 호스트 주소를 명시

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: 이름
spec:
  selector:
    istio-ingressgateway 라벨
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "호스트 주소"

DestinationRule

App의 Service에서 Pod로 전달되는 트래픽에 라우팅 규칙(로드벨런싱 등)을 정의
서비스에서 파드로 트래픽을 전달할 라우팅 방식을 지정

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: 1388-dnr
spec:
  host: 서비스명
  trafficPolicy:
    loadBalancer:
      simple: ROUND_ROBIN

Virtualservice

GateWay에 정의된 출발지와 매칭되는 트래픽을 APP의 Service로 전달하는 라우팅 규칙(URI, Port 등) 정의
요청을 받은 게이트웨이와 목적지로 전달해줄 Destination Rule을 지정
동일 네임스페이스의 서비스일 경우 서비스명만 명시 가능, 다를 경우 FQDN 방식으로 명시

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: 1388-vs
spec:
  hosts:
  - "호스트 주소"
  gateways:
  - 게이트웨이 이름
  http:
  - match:
    - port: 80 
    - uri:
        prefix: "/"
    route:
    - destination:
        host: 서비스명
        port:
          number: 7070

APP/Subnet

APP에 버전을 라벨로 설정하여 트래픽량을 분배하는 방식(카나리 블루그린등에 활용한다고 하는거 같음)
Circuit Break 기능은 https://istio.io/latest/docs/tasks/traffic-management/circuit-breaking/ 참고

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: 1388-vs
spec:
  hosts:
  - "호스트 주소"
  gateways:
  - 게이트웨이 이름
  http:
  - match:
    - port: 80 
    - uri:
        prefix: "/"
    route:
    - destination:
        host: 서비스명
        subset: v1
        port:
          number: 7070
      weight: 80
    - destination:
        host: 서비스명
        subset: v2
        port:
          number: 7070
      weight: 20
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: 1388-dnr
spec:
  host: 서비스명
  subsets:
  - name: v1
    labels:
      version: v1
    trafficPolicy:
      loadBalancer:
        simple: ROUND_ROBIN
  - name: v2
    labels:
      version: v2

Istio Addon(Kiali, jaeger, Prometheus)

아래 이미지와 같이 addons 폴더 내 grafana를 제외하고 모두 설치합니다.

Kiali와 jaeger는 Ingress를 통해 접속

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  namespace: istio-system
  name: istio-app-ingress
  annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/target-type: ip
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/group.order: '1'
    alb.ingress.kubernetes.io/group.name: prv-1388-ingress
    alb.ingress.kubernetes.io/success-codes: 200,301,302
spec:
  rules:
    - host: 호스트 주소
      http:
        paths:
        - path: /
          pathType: Prefix
          backend:
            serviceName: kiali
            servicePort: 20001
    - host: 호스트 주소
      http:
        paths:
        - path: /
          pathType: Prefix
          backend:
            serviceName: tracing
            servicePort: 80

Prometheus는 Prom-stack에서 모니터로 수집하는 방식을 사용(prom-stack 미사용 시 그냥 같이 설치 후 Ingress에 추가하시면 됩니다)

apiVersion: monitoring.coreos.com/v1
kind: PodMonitor
metadata:
  name: envoy-stats-monitor
  namespace: istio-system
  labels:
    monitoring: istio-proxies
    release: istio
spec:
  selector:
    matchExpressions:
    - {key: istio-prometheus-ignore, operator: DoesNotExist}
  namespaceSelector:
    any: true
  jobLabel: envoy-stats
  podMetricsEndpoints:
  - path: /stats/prometheus
    interval: 15s
    relabelings:
    - action: keep
      sourceLabels: [__meta_kubernetes_pod_container_name]
      regex: "istio-proxy"
    - action: keep
      sourceLabels: [__meta_kubernetes_pod_annotationpresent_prometheus_io_scrape]
    - sourceLabels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port]
      action: replace
      regex: ([^:]+)(?::\d+)?;(\d+)
      replacement: $1:$2
      targetLabel: __address__
    - action: labeldrop
      regex: "__meta_kubernetes_pod_label_(.+)"
    - sourceLabels: [__meta_kubernetes_namespace]
      action: replace
      targetLabel: namespace
    - sourceLabels: [__meta_kubernetes_pod_name]
      action: replace
      targetLabel: pod_name
---
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: istio-component-monitor
  namespace: istio-system
  labels:
    monitoring: istio-components
    release: istio
spec:
  jobLabel: istio
  targetLabels: [app]
  selector:
    matchExpressions:
    - {key: istio, operator: In, values: [pilot]}
  namespaceSelector:
    any: true
  endpoints:
  - port: http-monitoring
    interval: 15s

Grafana&Kiali

metric : Prometheus를 사용하여 데이터를 저장(https://grafana.com/orgs/istio/dashboards)

access log : 로키를 사용하여 데이터를 저장(https://grafana.com/grafana/dashboards/14876) 해당 대시보드 사용시 grafana 버전 체크 필수!

Kiali : 메트릭 Flow 및 앱의 로그 등 다양한 정보를 확인 가능

'Network' 카테고리의 다른 글

[ServiceMesh] Emissary Ingress/Linkerd  (0) 2021.12.11
[Service Mesh] Linkerd  (0) 2021.11.14