본문 바로가기
Cloud/MSA & Istio

Istio #3 - 설치와 bookinfo 예제 실습

by 근육곰돌이 2022. 8. 23.
728x90

Istio 실습 - bookinfo

 

istio를 직접 설치하고, 간단한 예제 (MSA 구성된) 서비스를 기동 시켜볼까합니다.

설치 환경은 네이버클라우드의 쿠버네티스 환경을 사용합니다.

(istio 설치 관계로 "네이버클라우드" 쿠버네티스 환경 설치는 생략하겠습니다.)

아래의 istio 실습은 2021년 12월말로 작성된 istio 1.12.1버전을 기준으로 작성됨을 유의해서 보시기 바랍니다.

 

사전 준비

  • 클러스터 구성 : Master Node 1대, Worker Node 1대 (여러대도 상관없습니다. 사실 없어도 무방합니다.)
  • 네이버 클라우드 내부 네트워크 (ACG) 정책설정 (istio 설치를 위함)

 

1. Istio 설치

  1. istio 다운로드
$ cd ~

// 최신 버전 다운로드
$ curl -L https://istio.io/downloadIstio | sh -


// 특정 버전을 지정하여 다운받으시고 싶으신 분들께서는 아래의 명령을 이용하시기 바랍니다.
$ curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.6.8 TARGET_ARCH=x86_64 sh -
  1. "istioctl" bin 경로 지정
$ cd istio-1.12.1
$ export PATH=$PWD/bin:$PATH
  1. istio 설치
$ istioctl install --set profile=demo -y
✔ Istio core installed
✔ Istiod installed
✔ Egress gateways installed
✔ Ingress gateways installed
✔ Installation complete
  1. istio의 sidecar injection 활성화

어떤 서비스 구축에 앞서 istio의 sidecar injection기능을 활성화하여야 한다.

istio는 Pod에 sidecar(envoy)를 (porxy)기반으로 트래픽을 컨트롤하는 구조이기 때문에

pod가 생성될때 자동으로 sidecar가 생성되도록 injection기능을 활성화 하는것이다.

(이에 대한 자세한 내용은 다음에 다루도록 하겠습니다.)

$ kubectl label namespace default istio-injection=enabled
namespace/default labeled
  • 라벨 추가 확인
$ kubectl get ns --show-labels 
NAME              STATUS   AGE   LABELS
default           Active   35d   istio-injection=enabled   <-- 추가 완료
istio-system      Active   44h   <none>
kube-node-lease   Active   35d   <none>
kube-public       Active   35d   <none>
kube-system       Active   35d   <none>

 

 

2. Sample App 배포 - BookInfo 서비스 설치

Istio의 Sample 어플리케이션 배포는 istio공식에서 지원하는 sample을 기반으로 하려고합니다.

bookinfo 서비스는 위의 그림처럼 되어 있습니다.

아참 저기 samples 경로는 위의 istio다운로드하면서 같이 다운받아졌습니다.

  1. bookinfo 애플리케이션 배포
$ kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
service/details created
serviceaccount/bookinfo-details created
deployment.apps/details-v1 created
service/ratings created
serviceaccount/bookinfo-ratings created
deployment.apps/ratings-v1 created
service/reviews created
serviceaccount/bookinfo-reviews created
deployment.apps/reviews-v1 created
deployment.apps/reviews-v2 created
deployment.apps/reviews-v3 created
service/productpage created
serviceaccount/bookinfo-productpage created
deployment.apps/productpage-v1 created

애플리케이션 배포는 productpage, detail, rating, review (v1~v3)이 배포 되었음을 알 수 있습니다.

$ kubectl get pod
NAME                              READY   STATUS    RESTARTS   AGE
details-v1-79f774bdb9-g9rs5       2/2     Running   4          42h
productpage-v1-6b746f74dc-pw2v4   2/2     Running   4          42h
ratings-v1-b6994bb9-xkbrd         2/2     Running   2          20h
reviews-v1-545db77b95-drxj7       2/2     Running   4          42h
reviews-v2-7bf8c9648f-n9dc6       2/2     Running   2          20h
reviews-v3-84779c7bbc-9kmpx       2/2     Running   4          42h

$ kubectl get svc
NAME               TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
details            ClusterIP   10.106.32.181    <none>        9080/TCP         42h
kubernetes         ClusterIP   10.96.0.1        <none>        443/TCP          35d
productpage        ClusterIP   10.98.30.185     <none>        9080/TCP         42h
ratings            ClusterIP   10.100.102.52    <none>        9080/TCP         42h
reviews            ClusterIP   10.110.228.242   <none>        9080/TCP         42h

여기서 svc를 보시면 모든 서비스는 ClusterIP로 구성되어 있으며,

이는 내부접근만 가능하고, 외부에서는 접근이 불가한상태입니다. (API 게이트웨이를 만들어야 겠죠?)

내부 접근으로 확인해보고 싶으신 분은 아래 명령으로 productpage를 접근해보십시오

$ kubectl exec "$(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}')" -c ratings -- curl -sS productpage:9080/productpage | grep -o "<title>.*</title>"

<title>Simple Bookstore App</title>

 

  1. Istio gateway 설정 (외부 접근 열기)

istio는 서비스를 외부로 노출시키기 위해서는 istio의 gateway를 사용합니다. (k8s의 ingress, service를 미사용)

istio의 gateway는 k8s 커스텀 리소스 타입으로, istio로 들어오는 traffic의 통로가 됩니다.

또한 gateway는 pod형식이며 Load Balancer타입으로 서비스 된다.

istio gateway를 등록 후 gateway를 통해 서비스할 호스트를 Virtual Service로 등록됩니다.

구분 데이터 흐름
기본 Client --> Istio Gateway --> Istio Virtual Service --> K8s Service
Bookinfo 상세 Client --> istio-ingressgateway (kind: Service) --> istio-ingressgateway (king: Pod) -->
bookinfo-gate (kind: gateway) --> bookinfo (kind: Virtual Service) -->
productpage (kind: service) --> productpage (kind: pod)

 

좀더 세부적으로 bookinfo gateway의 yaml를 파보자..ㅠㅠ !!

(개발자는 파야한다.!! --> 특히 line by line으로 해야한다!!)

$ cat samples/bookinfo/networking/bookinfo-gateway.yaml 
apiVersion: networking.istio.io/v1alpha3
kind: Gateway    <--- 커스텀 kind
metadata:
  name: bookinfo-gateway
spec:
  selector:
    istio: ingressgateway # use istio default controller  <-- selector 타입으로 istio-gateway를 사용하였기 때문에 gateway의 트래픽을 받을 Virtual Service가 등록되어야 함!!
  servers:
  - port:
      number: 80       <-- 80으로 Listen
      name: http
      protocol: HTTP   <-- http로 Client트래픽을 받도록 함
    hosts:
    - "*"              <-- 모든 호스트 허용
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService    <-- 위의 gateway트래픽을 수용하여 라우팅 룰이 적용된다.
metadata:
  name: bookinfo
spec:
  hosts:
  - "*"
  gateways:
  - bookinfo-gateway    <-- 위의 Gateway의 메타데이터 이름이 지정되야 맵핑됩니다.
  http:
  - match:              <-- 말 그대로 매치되는 URL을 확인하여 -> route 정책된다.
    - uri:
        exact: /productpage
    - uri:
        prefix: /static
    - uri:
        exact: /login
    - uri:
        exact: /logout
    - uri:
        prefix: /api/v1/products
    route:
    - destination:      <-- 매치된 URL이 모두 productpage의 9080으로 포워딩한다.
        host: productpage
        port:
          number: 9080

얘기가 길어졌지만, 여기에 대해 이해하고 넘어가야 istio를 나중에 커스텀하는데 문제가 없을 것이다.

(필자는 설치 다하고 이해하는 괴로움을 느꼈습니다.. ㅠㅠ)

 

이제 yaml도 보았으니, gateway를 적용해봅시다.!!!

$ kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
gateway.networking.istio.io/bookinfo-gateway created
virtualservice.networking.istio.io/bookinfo created

 

적용하는데 문제가 없었는지 확인을 해보자

// 전체 istio 문제여부 확인
$ istioctl analyze  
✔ No validation issues found when analyzing namespace: default.


// gateway 확인
$ kubectl get gateway
NAME               AGE
bookinfo-gateway   43h


// pod 확인
$ kubectl get pod -n istio-system -l istio=ingressgateway
NAME                                    READY   STATUS    RESTARTS   AGE
istio-ingressgateway-77b69b4bf8-5l8cd   1/1     Running   1          20h


// svc 확인
$ kubectl get svc istio-ingressgateway -n istio-system --show-labels
NAME                   TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                                                                      AGE   LABELS
istio-ingressgateway   LoadBalancer   10.109.36.179   <pending>     15021:31136/TCP,80:32253/TCP,443:30717/TCP,31400:31072/TCP,15443:31639/TCP   43h   app=istio-ingressgateway,install.operator.istio.io/owning-resource-namespace=istio-system,install.operator.istio.io/owning-resource=unknown,istio.io/rev=default,istio=ingressgateway,operator.istio.io/component=IngressGateways,operator.istio.io/managed=Reconcile,operator.istio.io/version=1.12.1,release=istio

 

  1. 배포된 어플리케이션 접속

이제 어플리케이션을 확인해보자.

그전에 istio-ingressgateway가 어떤 포트로 수용하는 알아야겠죠?

  • 포트 확인
$ kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}'
32253 <-- 저는 해당 포트로 오픈되어 있네요
  • IP 확인 (혹시 로컬에 하신분들은 127.0.0.1이 되겠네요)

저는 네이버클라우드로 되어 있는 관계로 네이버 클라우드 "Server 대시보드"에 해당 서버의 공인 IP를 찾아야 합니다.

  • 접속: http://[해당IP]:32253/productpage

istio를 사용하면 손쉽게 모니터링 툴을 적용해볼 수 있습니다.

다음은 페이지에서는 이어서 모니터링 툴 적용에 대한 포스팅을 연결해서 해볼게요~

 

 

반응형

'Cloud > MSA & Istio' 카테고리의 다른 글

istio #2 - istio 아키텍처  (0) 2022.08.23
Istio #1 - MSA란? Istio란?  (0) 2022.02.25