클라우드 엔지니어/클라우드 캠프과정

쿠버네티스 서비스 매쉬(Service Mesh ,kiali,prometheus,Istio)

해아's 2022. 10. 28. 14:38
Service Mesh
  0) MSA
	MicroService Architecture의 줄임말
	하지만 마이크로서비스란 작고, 독립적으로 배포 가능한 각각의 기능을 수행하는 서비스
	마이크로서비스는 완전히 독립적으로 배포가 가능하고, 다른 기술 스택(개발 언어, 데이터베이스 등)이 사용 가능한 단일 사업 영역에 초점을 둔다.
	독립된 서비스는 API를 통해서만 상호작용한다.
	*관련용어 : CQRS, DDD <- 개발과 관련된 용어, 반대되는 말 모놀리식 아키텍처
  1) 서비스 매쉬란?
	마이크로 서비스를 위한 인프라 계층
	레거시 코드의 변경 없이 각 서비스에 대해 가시성, 트래픽 관리, 보안 기능 등을 추가
	복잡하고 방대한 규모의 마이크로서비스에 대한 관리 용이
  2) 이스티오(Istio)란?
	서비스 매쉬 오픈소스
	기존의 응용프로그램 위에 레이어링되어 다양한 동작들을 수행
    (1) 이스티오가 제공하는 기능들
	클러스터 내부에서 TLS 암호화를 이용한 서비스간 안전한 통신 제공
	HTTP, gRPC, WebSocket 및 TCP 트래픽에 대한 로드 밸런싱
	재시도, 다양한 라우팅 규칙, fault injection 등을 통해 세부 트래픽 동작을 제어
	클러스터 내의 모든 트래픽에 대한 메트릭 수집과 로그 추적
    (2) 이스티오의 아키텍처
	https://istio.io/latest/docs/ops/deployment/architecture/
      [1] 데이터 플레인
	각 서비스를 Envoy proxy와 함께 배포(사이드카 패턴 방식)
	서비스로 또는 서비스로부터 나가는 모든 네트워크 패킷을 변환, 전달 및 모니터링
      [2] 컨트롤 플레인
	회로 차단, 로드 밸런싱, 타임아웃 등의 기본 구성 정보를 저장
	기본 구성 정보에 맞게 각 서비스의 프록시를 동작
  3) 이스티오 명령어(프로그램) 설치
	curl -L https://istio.io/downloadIstio | sh -
	echo "export PATH=$HOME/istio-버전/bin:$PATH" >> ~/.bashrc
	source .bashrc
	istioctl --help
  4) 이스티오 컨트롤 플레인 설치하기
	클러스터에 이스티오의 컨트롤 플레인을 설치합니다.
	옵션 없이 설치시 istiod와 ingress gateway만 있는 default profile을 다운합니다.
	istioctl x uninstall --purge <- 이거는 삭제하는거
	istioctl install --set components.cni.enabled=true -y
	istio-system namespace에 컴포넌트들 생성됨을 확인
  5) Istio Automation Injection
	istio는 데이터 플레인 구성을 위해 각 pod안에 proxy를 생성
	proxy를 생성하는 다양한 방법이 있지만
	자동으로 프록시 컨테이너를 Inject해주는 방법을 주로 사용
	프록시 생성을 원하는 네임스페이스에 레이블링을 해주면
	pod 생성과 함께 자동으로 proxy가 생성
    (1) addon 설치
	kubectl apply -f istio-1.15.2/samples/addons/prometheus.yaml
	kubectl apply -f istio-1.15.2/samples/addons/kiali.yaml
    (2) 테스트
      [1] 레이블 지정
	kubectl label ns 네임스페이스이름 istio-injection=enabled
       [2] 컨테이너 재생성
	파드를 확인했을 때 우리가 지정한 컨테이너 말고 istio-proxy라는 컨테이너가 같이 실행됨
      [3] kiali 서비스 변경
	istio-system 네임스페이스로 변경
	kiali 서비스의 타입을 ClusterIP에서 NodePort로 변경
		kiali 대시보드 접속
	Graph에서 네임스페이스 선택 -> 버튼 클릭
	3계층 아키텍처에서 데이터 조회 후 다시 그래프 확인
  6) kiali 대시보드 설정
	그래프에서 다음과 같이 체크

istio 를설치하면 사이드카 패턴으로 istio 컨테이너가 같이 실행되서 istio프록시를 통해 패킷이 모두 왔다갓다 한다.

설치하면 인그레이스 패킷만 체크하는데 추후 이그레이스 패킷도 추가해야한다.

 

 

네임스페이스에 레이블을 지정하여 istio 가 찾아서 자동으로 모니터링하게 한다.

kubectl label ns 네임스페이스이름 istio-injection=enabled
#kubectl label ns prod istio-injection=enabled
#kubectl label ns dev istio-injection=enabled

 

어제실습한 3티어 서버를 가지고 구성을 한다.

 

1. mysql서버에 라벨추가

apiVersion: v1
kind: Pod
metadata:
  namespace: prod
  name: mysql-server
  labels:
      app: mysql #라벨로 어플을 묶는다
      type: dbms
      version: db_0
spec:
  containers:
  - name: mysql
    image: mysql
    ports:
    - containerPort: 3306
    envFrom:
    - secretRef:
        name: sec-mysql  #mysql 설정파일을 불러오자
    volumeMounts:
    - mountPath: /var/lib/mysql
      name: mysql-pvc-pv
  volumes:
  - name : mysql-pvc-pv
    persistentVolumeClaim:
      claimName: mysql-pvc


---
#mysql 서비스 생성
apiVersion: v1
kind: Service
metadata:
  namespace: prod
  name: svc-mysql
  labels:
    app: mysql #라벨로 어플을 묶는다
    type: dbms
spec:
  selector:
    app: mysql
  ports:
  - port: 3306
    containerPort: 3306

2. was서버에 라벨추가

apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: prod
  name: web-deploy
  labels:
    type: web
    app: frontend #라벨로 묶는거임!!!
spec:
  selector:
    matchLabels:
      servertype: web-cpu
      type: web
      app: frontend
      version: web_latest
  replicas: 2
  template:
    metadata:
      labels:
        servertype: web-cpu
        type: web
        app: frontend #라벨로 묶는거임!!!
        version: web_latest
    spec:
      containers:
      - name: web
      #...더있음 줄인거임
      
      
서비스에서도 앱이름을 지정해야함
apiVersion: v1
kind: Service
metadata:
  namespace: prod
  name: svc-web
  labels:
      app: frontend
spec:
  selector:
    servertype: web-cpu
  ports:
  - name: tcp-http
    port: 80
    containerPort: 80

3. web도 라벨로 묶어준다.

 

 

그러면 결과

 

 

 

참고자료

 

728x90
반응형