일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- CI/CD
- GitLab
- helm
- linkerd
- CD
- deploy
- Monitoring
- scraping
- 웹 해킹
- Resource
- sonarqube
- gitlab ci
- Grafana
- gitlab cd
- CI
- eks
- docker
- 스크레이핑
- DevOps
- 크롤링
- 웹 취약점
- Service Mesh
- ECR
- Jenkins
- 모의해킹
- opentelemetry
- argocd
- Kubernetes
- Crawling
- Prometheus
- Today
- Total
ㅡ.ㅡ
[Service Mesh] Istio 본문
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 |