productpage에 Istio 활성화하기

productpage에 Istio 활성화하기

이 모듈에서는 마이크로서비스 하나, productpage에 Istio를 활성화하는 방법을 배워요. 이전 모듈에서 봤듯이 Istio는 쿠버네티스를 확장해서 마이크로서비스를 더 효과적으로 운영할 수 있게 도와줘요.

출처: Istio 문서

본문

앞선 모듈에서 보셨듯이, Istio는 쿠버네티스를 확장해서 마이크로서비스를 더 효과적으로 운영할 수 있는 기능을 제공해요.

이 모듈에서는 하나의 마이크로서비스인 productpage에 Istio를 활성화해요. 나머지 애플리케이션은 이전과 동일하게 계속 작동해요. Istio는 마이크로서비스 단위로 점진적으로 활성화할 수 있다는 점을 기억하세요. Istio는 마이크로서비스에 투명하게 활성화돼요. 마이크로서비스 코드를 변경하거나 애플리케이션을 중단할 필요가 없고, 계속 실행되면서 사용자 요청을 처리해요.

  1. 기본 destination rule을 적용하세요.
$ kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.31/samples/bookinfo/networking/destination-rule-all.yaml
  1. Istio를 활성화한 상태로 productpage 마이크로서비스를 다시 배포하세요.

이 튜토리얼 단계는 서비스별로 Istio를 활성화하는 방식을 보여주기 위해 수동 sidecar 주입(manual sidecar injection)을 사용해요. 프로덕션에서는 자동 sidecar 주입(automatic sidecar injection)이 권장돼요.

$ curl -s https://raw.githubusercontent.com/istio/istio/release-1.31/samples/bookinfo/platform/kube/bookinfo.yaml | istioctl kube-inject -f - | sed 's/replicas: 1/replicas: 3/g' | kubectl apply -l app=productpage,version=v1 -f -
deployment.apps/productpage-v1 configured
  1. 애플리케이션의 웹페이지에 접속해서 애플리케이션이 계속 작동하는지 확인하세요. 원래 애플리케이션의 코드를 변경하지 않고도 Istio가 추가됐어요.

  2. productpage의 파드를 확인해 보세요. 이제 각 레플리카에 컨테이너가 두 개 있는 걸 볼 수 있어요. 첫 번째 컨테이너는 마이크로서비스 자체이고, 두 번째는 여기에 붙은 sidecar 프록시예요.

$ kubectl get pods
details-v1-68868454f5-8nbjv       1/1       Running   0          7h
details-v1-68868454f5-nmngq       1/1       Running   0          7h
details-v1-68868454f5-zmj7j       1/1       Running   0          7h
productpage-v1-6dcdf77948-6tcbf   2/2       Running   0          7h
productpage-v1-6dcdf77948-t9t97   2/2       Running   0          7h
productpage-v1-6dcdf77948-tjq5d   2/2       Running   0          7h
ratings-v1-76f4c9765f-khlvv       1/1       Running   0          7h
ratings-v1-76f4c9765f-ntvkx       1/1       Running   0          7h
ratings-v1-76f4c9765f-zd5mp       1/1       Running   0          7h
reviews-v2-56f6855586-cnrjp       1/1       Running   0          7h
reviews-v2-56f6855586-lxc49       1/1       Running   0          7h
reviews-v2-56f6855586-qh84k       1/1       Running   0          7h
curl-88ddbcfdd-cc85s              1/1       Running   0          7h
  1. 쿠버네티스가 productpage의 기존 파드를 Istio가 활성화된 파드로 투명하게, 점진적으로 교체하면서 롤링 업데이트(rolling update)를 수행했어요. 쿠버네티스는 새 파드가 실행되기 시작했을 때만 이전 파드를 종료하고, 트래픽을 새 파드로 하나씩 투명하게 전환했어요. 즉, 새 파드를 시작하기 전에 두 개 이상의 파드를 종료하지 않았어요. 이 모든 과정은 애플리케이션의 중단을 막기 위해 이루어졌고, 그래서 Istio 주입 중에도 애플리케이션은 계속 작동했어요.

  2. productpage의 Istio sidecar 로그를 확인하세요.

$ kubectl logs -l app=productpage -c istio-proxy | grep GET
...
[2019-02-15T09:06:04.079Z] "GET /details/0 HTTP/1.1" 200 - 0 178 5 3 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Safari/605.1.15" "18710783-58a1-9e5f-992c-9ceff05b74c5" "details:9080" "172.30.230.51:9080" outbound|9080||details.tutorial.svc.cluster.local - 172.21.109.216:9080 172.30.146.104:58698 -
[2019-02-15T09:06:04.088Z] "GET /reviews/0 HTTP/1.1" 200 - 0 379 22 22 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Safari/605.1.15" "18710783-58a1-9e5f-992c-9ceff05b74c5" "reviews:9080" "172.30.230.27:9080" outbound|9080||reviews.tutorial.svc.cluster.local - 172.21.185.48:9080 172.30.146.104:41442 -
[2019-02-15T09:06:04.053Z] "GET /productpage HTTP/1.1" 200 - 0 5723 90 83 "10.127.220.66" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Safari/605.1.15" "18710783-58a1-9e5f-992c-9ceff05b74c5" "tutorial.bookinfo.com" "127.0.0.1:9080" inbound|9080|http|productpage.tutorial.svc.cluster.local - 172.30.146.104:9080 10.127.220.66:0 -
  1. 네임스페이스 이름을 출력하세요. Istio 대시보드에서 마이크로서비스를 구분할 때 필요해요.
$ echo $(kubectl config view -o jsonpath="{.contexts[?(@.name == \"$(kubectl config current-context)\")].context.namespace}")
tutorial
  1. 이전에 /etc/hosts 파일에 설정했던 커스텀 URL로 Istio 대시보드를 확인하세요.
http://my-istio-dashboard.io/dashboard/db/istio-mesh-dashboard

왼쪽 상단 드롭다운 메뉴에서 Istio Mesh Dashboard를 선택하세요. 네임스페이스의 productpage 서비스가 보일 텐데, 이름은 productpage.<your namespace>.svc.cluster.local 형태일 거예요.

  1. Istio Mesh Dashboard에서 Service 열 아래의 productpage 서비스를 클릭하세요. Service Workloads 섹션까지 아래로 스크롤하면 대시보드 그래프가 갱신되는 걸 확인할 수 있어요.

단일 마이크로서비스에 Istio를 적용한 즉각적인 이점이 바로 이거예요. 마이크로서비스로 들어오고 나가는 트래픽의 로그(시간, HTTP 메서드, 경로, 응답 코드 포함)를 얻고, Istio 대시보드를 통해 마이크로서비스를 모니터링할 수 있어요.

다음 모듈에서는 Istio가 애플리케이션에 제공할 수 있는 기능에 대해 배워요. 일부 Istio 기능은 단일 마이크로서비스에 적용해도 유용하지만, 전체 애플리케이션에 Istio를 적용해야 그 잠재력을 최대한 활용할 수 있어요.

이제 모든 마이크로서비스에 Istio 활성화하기로 넘어갈 준비가 됐어요.

더 알아보기 (Learn more)