우노
[Istio] 트래픽 구조 본문
들어가기 앞서,
- 해당 포스트에선, 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