고기 대신 SW 한점/MSA

[Service Mesh] istio - injection 방법 알아보기

지식한점 2022. 11. 17. 15:19
반응형

Service Mesh(여기서는 istio)를 사용하는 이유를 들어보자면, MSA(Micro Service Arch.)구조에서는 너무나 많은 마이크로 서비스들이 생성될 수 있습니다. 그것은 서비스 단위를 설계하여 쪼개는 설계자에 달려있으나 이론적으로 아주 작게 분리하면 감당하기 힘들 정도의 서비스들로 나눌수도 있습니다. 이런 경우 외부에서 들어오는 트래픽이나, 컨테이너들끼리의 통신의 가시성을 확보하고 제어를 상대적으로 쉽게하는 기술이 필요하게 되었고 이를 위해 등장한 것이 서비스 메쉬(mesh)입니다. 여기서는 istio를 활용하여 서비스 디스커버리, 네트워크 모니터링, 컨트롤 등이 가능하게 시도하는 것입니다. 이를 가능하게 하는 것이 바로 sidecar 입니다. 각 컨테이너마다 통신을 담당하는 proxy 컨테이너를 pod내에 배치하여 네트워크를 제어할 수 있게 됩니다. 즉, pod내의 네트워크 인터페이스를 proxy(envoy) 와 컨테이너가 공유하게 되며 iptables를 조작해 인바운드 트래픽과 아웃바운드 트래픽을 미리 선처리 할수 있게 방법을 제공합니다. 

 

 

사이드카 인젝션

사이드카를 injection하는 방법은 수동과 자동으로 구성될 수 있으며, istio 공식 문서(https://istio.io/latest/docs/setup/additional-setup/sidecar-injection/) 를 참조하면 부족함 없이 잘 나와있습니다. 옮겨 보자면,

 

1. namespace lable을 통해서 자동으로 사이드카를 인젝션 하는 방법 
   먼저 서비스가 아래의 예제와 같이 배포된 서비스가 있는 상태에서 

배포된 서비스가 싱글 컨테이너 이다

아래 사항으로 labeling을 진행하면 된다. 그러면 sidecar injection이 pod가 생성될 때마다 같이 생성됩니다.

$ kubectl label namespace default istio-injection=enabled --overwite
$ kubectl get namespace -L istio-injection

 

2. istioctl을 이용하여 수동으로 사이드카를 인젝션하는 방법

파드 배포를 위한 sample deployment 하나를 아래와 같이 준비합니다.

#nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
     name: nginx-deployment
     labels:
       app: nginx
spec:
    replicas: 1
    selector:
       matchLabels:
            app: nginx
    template:
       metadata:
            labels:
               app: nginx
       spec:
           containers:
           - name: nginx
              image: nginx: 1.14.3
              ports:
              - containerPort: 80
$ istioctl kube-inject -f nginx-deployment.yaml | kubectl apply -f -
$ kubectl get pod -A

 

시스템 확인  -default, istio-system,kube-node-lease-kube-public, kube-system

 

 

특정 서비스 또는 Pod에만 사이드가 인젝션을 하고 싶다면 Pod 배포시 label option을 지정하면 됩니다. 아래는 공식 문서에 나와 있는 것으로 pod template에 sidecar.istio.io/inject="false" 또는 sidecar.istio.io/inject="true"로 설정하면 해당 파드는 사이드카 인젝션이 되지 않고 배포되거나 사이드카 인젝션이 생성되어 배포되게 된다.

#nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
     name: nginx-deployment
     labels:
       app: nginx
spec:
    replicas: 1
    selector:
       matchLabels:
            app: nginx
    template:
       metadata:
            labels:
               app: nginx
               sidecar.istio.io/inject: "true" # namespace nginx-deployment에 사이드카 적용
       spec:
           containers:
           - name: nginx
              image: nginx: 1.14.3
              ports:
              - containerPort: 80

반응형

'고기 대신 SW 한점 > MSA' 카테고리의 다른 글

MSA - Aggregate introduce & design  (0) 2023.06.20