인생을 코딩하다.

[k8s] Docker에서 k8s Service mesh parttern 의 구현체인 Istio 설치 본문

Infra

[k8s] Docker에서 k8s Service mesh parttern 의 구현체인 Istio 설치

Hyung1 2022. 1. 28. 23:28
728x90
반응형

안녕하세요. 오늘은 docker에서 k8s istio를 설치하는 것에 관해 글을 작성해보도록 하겠습니다.

배경

현재, 저는 스프링 클라우드(스프링 부트 + 넷플릭스 OSS) 적용에 사용되는 컴포넌트 중 하나인 Eureka를 사용하고 있습니다. 

 

하지만, 스프링 클라우드(스프링 부트 + 넷플릭스 OSS)를 이용한 경우에는 스프링 클라우드로 각 서비스를 먼저 구축하고 마이크로서비스 애플리케이션 자체도 코드 내부에 스프링 클라우드 사용을 위한 클라이언트 코드가 탑재되어야 합니다. 또한 Eureka는 현재 deprecated되었기도 하구요.

 

하지만, eureka가 아닌, k8s Service mesh parttern 의 구현체인 Istio를 적용하는 경우에는 마이크로 서비스마다 함께 배포되는 사이드카 프락시에 운영 관리를 위한 기능이 별도로 담겨있기 때문에 마이크로서비스는 순수 비즈니스 로직에 집중할 수 있습니다. 따라서 erueka -> istio로 리팩토릭 하기롤 결정하였습니다.

eureka와 istio에 관해서는 아래의 두 글을 참고하여 주시면 감사하겠습니다.

Docker desktop 준비사항

1.  먼저 docker desktop의 설정 버튼을 누르고 resource 에서 CPU 4cpu 이상, RAM 할당을 8G 로 늘려줍니다.

2. 그 다음으로 Enable kubernetes를 체크하고 apply를 클릭하면 Kubrenetes가 download 되고 활성화됩니다.

3. 터미널에서 kubectl get nodes 명령어로 클러스터가 잘 활성화 돼었는지 확인해봅니다.

istioctl 설치

터미널에서 brew install istioctl 명령어를 입력하여 설치 후 , istioctl version 명령어로 설치가 잘 되었는지 확인해봅니다.

brew  install istioctl 
 istioctl version 

istio sample 예제 clone

git clone https://github.com/istio/istio.git 를 터미널에 입력하고 clone한 후에, cd istio를 입력하여 줍니다.

istio 설치

istio 를 활성화한 kubenetes cluster 에 설치해보겠습니다.

 

istioctl operator init 명령어를 입력하여 설치해줍니다.

IstioOperator apply

ingress gateway 를 활성화 하기 위해서 demo profile로 IstioOperator 를 apply 합니다.

 

kubectl create ns istio-system  명령어를 입력해줍니다. 만약 이미 존재한다면, kubectl apply -f - <<EOF 입력해줍니다.

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  namespace: istio-system
  name: example-istiocontrolplane
spec:
  profile: demo # profile demo로 하면 컴포넌트들을 설치합니다.
  components:
    pilot:
      k8s:
        resources:
          requests:
            memory: 3072Mi # pilot 에는 메모리를 넉넉하게 할당하였다. 
    egressGateways:
    - name: istio-egressgateway # 외부로 나가는 트래픽을 egressgateway를 통하도록 활성화 합니다.
      enabled: true
EOF

위의 예시로 설치하면 다음과 같은 컴포넌트들이 설치가 됩니다..

  • istio-egressgateway
  • istio-ingressgateway
  • istiod

istio-ingressgateway

envoy 로 되어 있으며 들어오는(ingress) 트래픽을 전달하는 역할을 수행합니다.. istio 가 없을 때 ingress controller (주로 nginx 로 구동되는)가 이 역할을 수행합니다. (경우에 따라 nginx ingress controller + envoy istio ingress gateway 조합으로도 구성하기도 합니다.)

istio-egressgateway

마찬가지로 envoy 로 동작하며 밖으로 나가는(egress) 트래픽을 제어하는 역할을 수행합니다. 클러스터 외부에 있는 인프라에서 제한된 ACL 을 필요로 할 때 egress-gateway 가 구동되는 위치를 일부 node들로 제한하고 이 Node 들에 대해서만 ACL 을 열어주는 용도로 사용될 수 있습니다.

istiod

istio 의 컨트롤 플랜 (pilot - discovery , citadel - certification, galley - configuration management)입니다.

추가 컴포넌트 설치

이전 버전에서는 demo 프로필로 설치하면 kiali, 등등의 컴포넌트가 많이 설치되었는데 최신버전에서는 추가 컴포넌트는 따로 설치해줘야 합니다.

 

이렇게 변경된 이유는 kiali, zipkin, Prometheus와 같은 컴포넌트는 istio 의 core 컴포넌트가 아니고 이 컴포넌트들은 버전업이 빨라서 demo profile 에 같이 포함시켰더니 버전업 대응하기가 어려웠다고 합니다.. 따라서 그 때그때 필요한 사람들이 add components 하라고 안내하고 있습니다.

 

cd istio/samples/addons 명령어를 입력하여 addons 경로에서 

  • kubectl apply -f prometheus.yaml
  • kubectl apply -f kiali.yaml
  • kubectl apply -f grafana.yaml
  • kubectl apply -f jaeger.yaml

위의 네 가지 명령어를 입력해줍니다.

설치 확인

Service

kubectl get svc -n istio-system 를 입력하여 service가 잘 설치가 되었는지 확인해봅니다.

Pods

kubectl get pod -n istio-system를 입력하여 Pod가 잘 설치가 되었는지 확인해봅니다.

네임스페이스에 istio-injection 라벨 추가

사이드카를 활성화할 default namespace 에 istio-injection=enable 라벨을 적용합니다.

 

kubectl label namespace default istio-injection=enabled

 

작성 중..

728x90
반응형
Comments