[이렇게 사용하세요!] #3 네이버 클라우드 플랫폼에서 Istio를 이용하여 Service Mash 구현하기

송창안
NAVER CLOUD PLATFORM
11 min readNov 21, 2019

--

안녕하세요, 네이버 클라우드 플랫폼 Evangelist 송창안입니다.

지난 #1, #2에서 배웠던 내용을 바탕으로 오늘은 ‘네이버 클라우드 플랫폼’ Istio를 이용해 Service Mesh 구현하기’ 실제 데모 실습을 진행해보겠습니다.

(영상을 참고하실 분은 상단의 링크를 클릭해보시기 바랍니다!)

먼저 NKS를 구성하는 단계를 진행해야합니다.

데모를 진행하기 위해 워커 노드를 4개의 CPU에 메모리가 8기가 되는 모델로 지정해보았습니다. 노드 수는 기본적은 3개로 구성이 되며, 구성 후에는 마스터 노드 3개 와 워커 노드 3개로 구성되는 구조가 됩니다.

​생성에는 수 분이 걸리게 되며, 생성 후 접속 가이드 및 설정 파일 버튼에서 쿠버네티스 설정 파일을 다운로드를 합니다.

​그리고 관리 노드에 설정 파일을 가져오기 위해서 복사를 하여 관리 노드에 옮기는 과정을 진행합니다.

​bashrc 파일에 아래와 같이 설정해두었으며, 아까 복사한 쿠버네티스 파일을 이동시킵니다.

1. Istio 1.3.0 버전을 관리 노드에 다운로드합니다.

curl -L https://git.io/getLatestIstio | ISTIO_VERSION=1.3.0 sh -

2. Kubectl 1.12.7 버전을 관리 노드에 다운로드합니다.

curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.12.7/bin/linux/amd64/kubectl

3. 다운로드가 완료가 되면, kubectl에 실행 권한을 설정합니다.

chmod +x ./kubectl

4. kubectl을 PATH에 옮깁니다.

mv ./kubectl /usr/local/bin/kubectl

5. Cluster role binding 권한을 설정합니다.

# kubectl — kubeconfig=$KUBE_CONFIG create clusterrolebinding tiller-cluster-admin \ — clusterrole=cluster-admin \ — serviceaccount=kube-system:default

6.helm을 설치합니다.

# curl -L https://git.io/get_helm.sh | bash # helm — kubeconfig=$KUBE_CONFIG init

6.1 워커 노드의 상태를 확인합니다.

7. Istio를 위한 namespace를 생성합니다.

kubectl — kubeconfig=$KUBE_CONFIG create namespace istio-system

8. Istio를 설치하기 위해 압축이 풀린 1.3.0으로 이동합니다.

cd istio-1.3.0

9. 이후 Istio 관련 명령어를 사용하기 위해 PATH를 미리 지정합니다.

export PATH=$PWD/bin:$PATH

10. Helm에 대한 서비스 계정을 작성하고 클러스터 관리자 역할을 부여합니다.

kubectl — kubeconfig=$KUBE_CONFIG apply -f install/kubernetes/helm/helm-service-account.yaml helm — kubeconfig=$KUBE_CONFIG init

11. helm을 통해, istio를 설치를 하며, 모니터링 도구인 kiali, servicegraph 그리고 grafana 설치 옵션에 포함 시킵니다.

helm — kubeconfig=$KUBE_CONFIG template install/kubernetes/helm/istio \ — name istio — namespace istio-system — set tracing.enabled=true — set grafana.enabled=true — set global.mtls.enabled=true — set kiali.enabled=true — set servicegraph.enabled=true | kubectl — kubeconfig=$KUBE_CONFIG apply -f -

12. istio-init 설치를 합니다.

helm — kubeconfig=$KUBE_CONFIG template install/kubernetes/helm/istio-init \ — name istio-init — namespace istio-system | kubectl — kubeconfig=$KUBE_CONFIG apply -f -

11번과 12번에서 계속 반복하는 에러를 확인하지만, 이유에 대해서는 나중에 메트릭이 수집이 안되는 문제이며 설치가 잘 되는 것을 확인합니다.

13. 53을 반환하는지 확인하며, 만약 (cert-manager가 활성화되어 있지 않으면 58이 확인되게 됩니다.)

kubectl — kubeconfig=$KUBE_CONFIG get crds -n istio-system | grep ‘istio.io\|certmanager.k8s.io’ | wc -l

14. default namespace에서 demo bookinfo를 구성합니다.

kubectl — kubeconfig=$KUBE_CONFIG apply -f <(istioctl — kubeconfig=$KUBE_CONFIG kube-inject -f samples/bookinfo/platform/kube/bookinfo.yaml) kubectl — kubeconfig=$KUBE_CONFIG get services

15. 애플리케이션에 대해 Ingress 게이트웨이 라우팅을 정의

kubectl — kubeconfig=$KUBE_CONFIG apply -f samples/bookinfo/networking/bookinfo-gateway.yaml

설정하게 되면, Kubernetes Service에서는 로드밸런스 서비스와 연동하여 로드벨런서가 동작하고 이후 이스티오 게이트웨이 포드와 연결됩니다.

16. mutual TLS를 활성화시켜 줍니다.

kubectl — kubeconfig=$KUBE_CONFIG create -f samples/bookinfo/networking/destination-rule-all-mtls.yaml

17. 해당 예제의 pod와 service를 확인합니다.

kubectl — kubeconfig=$KUBE_CONFIG get services kubectl — kubeconfig=$KUBE_CONFIG get pods

18. Ingressgateway 정보를 확인합니다.

kubectl — kubeconfig=$KUBE_CONFIG -n istio-system get service istio-ingressgateway

도메인 네임을 통해 접근하여 확인할 수 있도록 합니다.

19. istioctl을 통해 DestinationRules을 확인 과정을 수행합니다.

istioctl — kubeconfig=$KUBE_CONFIG get destinationrules

20. 성능 측정 및 service mesh 관련 모니터링 도구를 포트 포워딩을 통해 localhost에서 확인합니다.

예제에서는 kiali(키알리)만 사용하여 서비스의 흐름만 보여드렸지만 grafana(그라 파나), jaeger(예거) 를 통해, 사용된 메트릭과 호출 흐름에 대해서 추적을 쉽게 할 수 있습니다.

21. grafana

kubectl — kubeconfig=$KUBE_CONFIG -n istio-system port-forward $(kubectl — kubeconfig=$KUBE_CONFIG -n istio-system get pod -l app=grafana -o jsonpath=’{.items[0].metadata.name}’) 3000:3000 &

22. jaeger

kubectl — kubeconfig=$KUBE_CONFIG -n istio-system port-forward $(kubectl — kubeconfig=$KUBE_CONFIG -n istio-system get pod -l app=jaeger -o jsonpath=’{.items[0].metadata.name}’) 16686:16686 &

23. Kiali 관련 설정

#NAMESPACE=istio-system

24. Kiali ID/PASSWD 을 추가로 넣어줍니다.

# KIALI_USERNAME=$(read -p ‘Kiali Username: ‘ uval && echo -n $uval | base64) Kiali Username: admin # KIALI_PASSPHRASE=$(read -sp ‘Kiali Passphrase: ‘ pval && echo -n $pval | base64) Kiali Passphrase:

passwd admin 을 하겠습니다.

생성한 ID/PASSWD를 키알리 서비스에 적용시키는 부분입니다.

# cat <<EOF | kubectl — kubeconfig=$KUBE_CONFIG apply -f — apiVersion: v1 kind: Secret metadata: name: kiali namespace: $NAMESPACE labels: app: kiali type: Opaque data: username: $KIALI_USERNAME passphrase: $KIALI_PASSPHRASE EOF

25. kiali 키알리 서비스에 대해서 포트 포워딩을 진행합니다.

kubectl — kubeconfig=$KUBE_CONFIG -n istio-system port-forward $(kubectl — kubeconfig=$KUBE_CONFIG -n istio-system get pod -l app=kiali -o jsonpath=’{.items[0].metadata.name}’) 20001:20001 &

해당 도네임으로 접근을 하며, 파이어폭스를 이용해 내부의 웹페이지로 접근합니다.

이어 도네임 슬레시 프러뎍션페이지로 접속합니다.

다음과 같은 예제 페이지를 확인할 수 있으며 앞에 설명드린 내용과 같이 전체 페이지가 프러덕션 페이지에 왼쪽이 디테일 서비스 그리고 오른쪽이 리뷰에 해당하는 서비스가 표현됩니다.

키알리 서비스에 대한 GUI 인터페이스이며, 현재 4개의 서비스가 동작하는 것을 확인할 수 있습니다. 녹색 표시가 현재의 흐름을 뜻합니다.

현재는 따른 정책 설정을 구성한 것이 없기 때문에 전체의 서비스가 흐름에 표시됩니다.

창을 한 개 더 열어서 서비스에 대한 정책을 지정하겠습니다. ‘간단한 lstio를 활용한 service mesh 정책 구성’입니다.

● 50:50으로 연결

kubectl — kubeconfig=$KUBE_CONFIG apply -f samples/bookinfo/networking/virtual-service-reviews-50-v3.yaml

야물 파일을 보면 wegight를 주어서 각 버전 별로 접근하는 것을 확인할 수 있으며, 페이지에서도 확인이 가능합니다.

흐름과 같이 리뷰 v2는 접근하지 않으며, v1과 v2로 접근하는 흐름을 확인할 수 있습니다. 이후 정책을 삭제합니다.

● v2를 ‘jason’이라는 유저에게만 제공하기

kubectl — kubeconfig=$KUBE_CONFIG apply -f samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml

야물 파일을 확인하면 http의 match 룰을 통해서 특정 유저에 대해서 정해지는 형식을 구현할 수 있으며, 아닌 경우에는 v1으로 구성하겠다는 뜻을 확인할 수 있습니다.

구성되는 v1만 호출되기 때문에 흐름에서도 v1만 표시되는 것을 확인할 수 있습니다.

하지만, ID 로그인 후에는 v2도 호출되는 것을 확인할 수 있습니다. 정책을 삭제하도록 합니다.

마지막으로 v1 서비스 연결을 하게 되면, 모든 서비스는 v1으로 동작하는 것을 확인할 수 있습니다.

kubectl — kubeconfig=$KUBE_CONFIG create -f samples/bookinfo/networking/virtual-service-all-v1.yaml

글을 마치며…

세 편에 걸쳐 ‘네이버 클라우드 플랫폼에서 Istio를 이용해 Service Mash를 구현하기’ 관련 개념, 시나리오와 실습 데모까지 배워보았습니다.​

긴 시리즈의 글을 끝까지 읽어주셔서 감사합니다. 다음에도 유익한 콘텐츠로 다시 찾아뵙겠습니다!

--

--

송창안
NAVER CLOUD PLATFORM

안녕하세요? Naver Cloud Platform Evangelist 송창안입니다. 복잡한 클라우드 기술을 여러분과 함께 확인 하며, 쉽게 풀어가보고 싶습니다.