kubernetes Istio구성정보

Istio Concept & Data Flow
-
Istio의 전체 Concept & Data Flow

-
Concept
- ServiceMesh를 이용해 다양한 트래픽을 제어하는 역할
-
http / websocket / http 등 트래픽 제어/관리에 대한 부하분산 수행
-
Component별 역할
- Data Plane
- Service A / B에 구성된 Pod에는 Proxy용 Envoy Sidecar 컨테이너가 배포
-
Control Plane
- Mixer: 정책 설정 / ACL / 인증 역할
- Pilot: ingress routing, traffic mirroring, traffic shifting, canary deployments, circuit breaking, fault injection 역할 수행
- Galley: yaml을 Istio용으로 변환 후 Pilot으로 전송
- Citadel: 데이터 전송 시 암호화 전송(TLS) 역할, 현재 내부 통신에는 암호화 과정이 없어서 사용하지 않음
-
구성 시 유의사항
- Istio 기반의 traffic shaping을 적용하려면, k8s에서 사용하는 Ingress(or Service NodePort)를 사용하면 적용이 안 되고, Service는 ClusterIP로 적용하고, Istio ingressgateway에서 port를 정의해주어야 함.
Info
Servicemesh: MSA 기반의 아키텍처는 각각 개별 기능을 수행하는데, 분산 서비스 배포의 크기와 복잡성이 증가하면서 시스템을 이해하고 관리하기 더 어려워짐. 클러스터 내부와 외부의 통신 라우팅도 복잡해지기 때문에 이러한 복잡성을 줄이기 위해 프록시를 사용하여 모든 트래픽을 확인 후 사용자가 설정한 구성에 따라 애플리케이션 트래픽을 관리하는 역할.*
Istio 설치 절차
- 설치
$> curl -L https://istio.io/downloadIstio | sh - $> cd istio-1.9.2 $> ./istioctl install --set profile=default This will install the Istio 1.9.2 profile with ["Istio core"gateways"] components into the cluster. Proceed? (y/N) y ✔ Istio core installed ✔ Istiod installed ✔ Ingress gateways installed ✔ Installation complete - Istio 기반의 proxy를 설치하기 위해 namespace에 Istio용 Envoy 설치
$> kubectl label namespace default istio-injection=enabled namespace/default labeled - Istio profile별 제공 기능

- Istio 서비스 상태 확인
$> kubectl get all -n istio-system NAME READY STATUS RESTARTS AGE pod/istio-ingressgateway-78d7b9b7db-zpxxf 1/1 Running 2 19d pod/istiod-85c8645bbc-4jkbj 1/1 Running 1 19d NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/istio-ingressgateway LoadBalancer 10.233.14.72 <pending> 15021:31094/TCP,80:32134/TCP,443:31338/TCP,15012:30093/TCP,15443:30233/TCP 20d service/istiod ClusterIP 10.233.43.248 <none> 15010/TCP,15012/TCP,443/TCP,15014/TCP 20d service/tracing NodePort 10.233.13.45 <none> 16686:30008/TCP 17d NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/istio-ingressgateway 1/1 1 1 20d deployment.apps/istiod 1/1 1 1 20d NAME DESIRED CURRENT READY AGE replicaset.apps/istio-ingressgateway-78d7b9b7db 1 1 1 20d replicaset.apps/istiod-85c8645bbc 1 1 1 20d NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE horizontalpodautoscaler.autoscaling/istio-ingressgateway Deployment/istio-ingressgateway <unknown>/80% 1 5 1 20d horizontalpodautoscaler.autoscaling/istiod Deployment/istiod <unknown>/80% 1 5 1 20d
Addon 설정
- Addon 종류
- Kiali: Istio 모니터링을 위한 대시보드
- Jaeger / Zipkin: 분산 시스템 모니터링
- Zipkin: Twitter에서 개발한 오픈소스
- Jaeger: Uber에서 개발하고 CNCF 프로젝트로 진행 중인 오픈소스 (k8s 환경에서는 Jaeger가 좀 더 효율적)
- Zipkin: Twitter에서 개발한 오픈소스
-
Addon 설치
$> wget http://192.168.100.10:28080/... $> kubectl apply -f ./sample/ $> kubectl get all -n istio-system NAME READY STATUS RESTARTS AGE pod/istio-ingressgateway-78d7b9b7db-zpxxf 1/1 Running 2 19d pod/istiod-85c8645bbc-4jkbj 1/1 Running 1 19d pod/jaeger-7f78b6fb65-jcrgz 1/1 Running 1 17d pod/kiali-dc84967d9-cqn8v 1/1 Running 1 19d pod/prometheus-7bfddb8dbf-vsddf 2/2 Running 4 19d NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/istio-ingressgateway LoadBalancer 10.233.14.72 <pending> 15021:31094/TCP,80:32134/TCP,443:31338/TCP,15012:30093/TCP,15443:30233/TCP 20d service/istiod ClusterIP 10.233.43.248 <none> 15010/TCP,15012/TCP,443/TCP,15014/TCP 20d service/jaeger-collector ClusterIP 10.233.35.73 <none> 14268/TCP,14250/TCP 17d service/kiali NodePort 10.233.21.50 <none> 20001:30007/TCP,9090:31990/TCP 20d service/prometheus ClusterIP 10.233.24.217 <none> 9090/TCP 20d service/tracing NodePort 10.233.13.45 <none> 16686:30008/TCP 17d service/zipkin ClusterIP 10.233.34.17 <none> 9411/TCP 17d NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/istio-ingressgateway 1/1 1 1 20d deployment.apps/istiod 1/1 1 1 20d deployment.apps/jaeger 1/1 1 1 17d deployment.apps/kiali 1/1 1 1 20d deployment.apps/prometheus 1/1 1 1 20d NAME DESIRED CURRENT READY AGE replicaset.apps/istio-ingressgateway-78d7b9b7db 1 1 1 20d replicaset.apps/istiod-85c8645bbc 1 1 1 20d replicaset.apps/jaeger-7f78b6fb65 1 1 1 17d replicaset.apps/kiali-dc84967d9 1 1 1 20d replicaset.apps/prometheus-7bfddb8dbf 1 1 1 20d NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE horizontalpodautoscaler.autoscaling/istio-ingressgateway Deployment/istio-ingressgateway <unknown>/80% 1 5 1 20d horizontalpodautoscaler.autoscaling/istiod Deployment/istiod <unknown>/80% 1 5 1 20d -
대시보드 외부 접속하기
- Kiali:
http://{%서버IP}:30007 - Jaeger:
http://{%서버IP}:30008 -
삭 제
$> istioctl x uninstall --purge $> kubectl delete namespace istio-system -
시스템 설정을 위한 Component list
| 항 목 | 용 도 | 기 타 |
|---|---|---|
| gateway | http / tcp를 연결하기 위해 구성하는 로드밸런서 | |
| virtualservice | service | 게이트웨이에 바인딩 후 트래픽을 구성된 여러 엔드포인트로 전달 (트래픽 비율 설정) |
| virtualservice | version(a.k.a subset) | 특정 서비스에 대해 애플리케이션 바이너리의 버전 변경을 실행하는 집합 |
| virtualservice | source | 서비스를 호출하는 다운스트림용 클라이언트 |
| virtualservice | host | 클라이언트가 서비스 연결할 때 사용하는 주소 |
| destinationRule | 라우팅 규칙을 처리한 후 연결할 네트워크 서비스를 설정 | |
| tcproute | tcp트래픽에 대해 라우팅 규칙을 위한 조건 설정 | |
| tcproute | match | 활성화할 규칙조건 |
| tcproute | route | 연결할 대상 |
- Example yml
- gateway 설정 (tcp/30011에 대해 gateway 설정)
$> vi gateway.yml --- apiVersion: networking.istio.io/v1beta1 kind: Gateway metadata: name: gateway namespace: test spec: selector: app: test servers: - hosts: - '*' port: name: tcp number: 30011 protocol: TCP - VirtualService 설정 (tcp/30011이 들어오면 service111-1, service111-2의 tcp/2580으로 연결하되 50%씩 트래픽 분할 처리)
$> vi vs.yaml --- apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: test-vs namespace: test spec: gateways: - gateway hosts: - prg111 tcp: - match: - port: 30011 route: - destination: host: prg111-1 port: number: 2580 subset: v1 weight: 50 - destination: host: prg111-2 port: number: 2580 subset: v2 weight: 50 - destinationrule 설정 (service111에 대해 v1, v2 설정)
$> vi rule.yml --- apiVersion: networking.istio.io/v1beta1 kind: DestinationRule metadata: name: test-rule namespace: test spec: host: prg111 subsets: - labels: version: 'v1' name: v1 - labels: version: 'v2' name: v2 trafficPolicy: loadBalancer: simple: ROUND_ROBIN tls: mode: DISABLE