오늘의 인기 글
최근 글
최근 댓글
Today
Total
05-09 15:52
관리 메뉴

우노

[Istio] 트래픽 구조 본문

DevOps/Istio

[Istio] 트래픽 구조

운호(Noah) 2023. 2. 28. 16:35

들어가기 앞서,

  • 해당 포스트에선, Istio의 트래픽 구조와
  • 트래픽 주요 컴포넌트인 Gateway, Virtual Service, Destination Rule에 대해서 간단히 다뤄보겠습니다.
  • 예제 코드는 https://istio.io/latest/docs/examples/bookinfo/ 를 참고했습니다.

Istio 트래픽 구조

  • 실습 환경엔 Istio가 사전 설치되어 있다고 가정하겠습니다.
  • Istio 설치 시, 외부 IP가 할당된 LoadBalancer 타입의 Service가 자동으로 생성됩니다.
    • istio-system이라는 Namespace의 istio-ingressgateway라는 Service로 생성됩니다.
  • 따라서, 상단 그림에선 생략되어 있지만, Client는 istio-ingressgateway라는 Service의 외부 IP를 통해 Gateway에 접근하게 됩니다.
  • 뿐만 아니라, Istio 설치 시, istio-system이라는 Namespace에 istio-ingressgateway라는 Pod도 자동으로 생성되며,
  • Gateway와 VirtualService 생성 시, 실제로 별도의 pod를 생성하는게 아닌,
  • istio-ingressgateway라는 Pod 내부의 envoy 설정이 변경됩니다.

애플리케이션 관련 자원 생성

  • 애플리케이션 관련 자원(Service, ServiceAccount, Deployment)은 사전 생성되어있다고 가정하겠으며,

  • 해당 자원과 관련된 개념 설명은 생략하겠습니다.

  • Service

      apiVersion: v1
      kind: Service
      metadata:
        name: productpage
        labels:
          app: productpage
          service: productpage
      spec:
        ports:
        - port: 9080
          name: http
        selector:
          app: productpage
  • ServiceAccount

      apiVersion: v1
      kind: ServiceAccount
      metadata:
        name: bookinfo-productpage
        labels:
          account: productpage
  • Deployment

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: productpage-v1
        labels:
          app: productpage
          version: v1
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: productpage
            version: v1
        template:
          metadata:
            annotations:
              prometheus.io/scrape: "true"
              prometheus.io/port: "9080"
              prometheus.io/path: "/metrics"
            labels:
              app: productpage
              version: v1  # 이후, DestinationRule에서 사용됩니다.
          spec:
            serviceAccountName: bookinfo-productpage
            containers:
            - name: productpage
              image: docker.io/istio/examples-bookinfo-productpage-v1:1.18.0
              imagePullPolicy: IfNotPresent
              ports:
              - containerPort: 9080
              volumeMounts:
              - name: tmp
                mountPath: /tmp
            volumes:
            - name: tmp
              emptyDir: {}

Gateway

  • 이제 애플리케이션이 실행되고 있으므로,

  • Kubernetes 클러스터 외부(예: 브라우저)에서 애플리케이션에 액세스할 수 있도록 해야합니다.

  • 이를 위해 Gateway가 사용됩니다.

      apiVersion: networking.istio.io/v1alpha3
      kind: Gateway
      metadata:
        name: bookinfo-gateway
      spec:
        selector:
          istio: ingressgateway # Istio 설치 시 생성되는, 외부IP가 열려있는 istio-ingressgateway Service와의 연결을 위한 설정입니다.
        servers:
        - port:   # host들에게 http로 트래픽을 받겠다는 설정입니다.
            number: 80
            name: http
            protocol: HTTP
          hosts:  # 어떤 host들에 대한 접근을 허용할지에 대한 설정입니다.
          - "*"

Virtual Service

  • Gateway로 들어온 트래픽을 정의한 라우팅 규칙에 따라 적절한 Service로 라우팅하는 설정입니다.

  • 아래는 Virtual Service의 예제입니다.

      apiVersion: networking.istio.io/v1alpha3
      kind: VirtualService
      metadata:
        name: bookinfo
      spec:
        hosts:     # 어떤 host들에 대해 라우팅을 진행할지에 대한 설정입니다.
        - "*"
        gateways:  # 상단에서 생성한 Istio Gateway와의 연결을 위한 설정입니다.
        - bookinfo-gateway
        http:
        - match:   # URI를 어떤식으로 허용할지에 대한 설정입니다.
          - uri:
              exact: /productpage
          - uri:
              prefix: /static
          - uri:
              exact: /login
          - uri:
              exact: /logout
          - uri:
              prefix: /api/v1/products
          route:   # 어떤 Service에 라우팅할지에 대한 설정입니다.
          - destination:
              host: productpage
              port:
                number: 9080

Destination Rule

  • Service로 라우팅된 트래픽을 어떤 Pod로 보낼지를 정의하는 설정입니다.

    • Pod에 할당한 Label에 따라서 해당 Pod에 트래픽을 보낼 수 있습니다.
    • Pod간의 로드밸런싱이나 여러 정책을 정의하는 것이 가능합니다.
    • 하나의 Detination Rule은 하나의 Service에 대해서만 정의할 수 있습니다.
  • Service가 관리하는 Pod가 1개이거나 어떤 Pod에 트래픽이 가던지 상관 없다면, 굳이 Destination Rule을 정의할 필요는 없습니다.

    • Destination Rule을 정의하지 않는다면, Service 내의 모든 Pod들 중 하나로 무작위 라우팅됩니다.
  • 아래는 Destination Rule의 예제입니다.

      apiVersion: networking.istio.io/v1alpha3
      kind: DestinationRule
      metadata:
        name: productpage
      spec:
        host: productpage
        subsets:
        - name: v1
          labels:
            version: v1  # 라우팅하길 원하는 Pod에 할당된 Label을 설정합니다.

참고

'DevOps > Istio' 카테고리의 다른 글

[Istio] AuthorizationPolicy란?  (0) 2023.11.05
Comments