Kubernetes Engine에 Istio 설치

Istio는 Kubernetes Engine에서 실행되는 서비스를 포함하여 마이크로 서비스를 연결, 모니터링, 보호하기 위한 오픈소스 프레임워크입니다. 이 프레임워크를 사용하면 서비스 코드를 변경하지 않아도 부하 분산, 서비스 간 인증, 모니터링 등이 포함된 배포된 서비스 네트워크를 만들 수 있습니다. 서비스에 Istio 지원을 추가하려면 각 애플리케이션 포드에 특수한 Envoy 사이드카 프록시를 배포합니다. Envoy 프록시는 마이크로 서비스 간의 모든 네트워크 통신을 가로채며 Istio의 제어 플레인 기능을 사용하여 구성 및 관리됩니다. 이 가이드에서는 GKE에서 Istio를 설치 및 구성하고 Istio 지원 다중 서비스 애플리케이션을 배포하는 방법을 보여줍니다.

시작하기 전에

다음 단계에 따라 Kubernetes Engine API를 사용 설정합니다.
  1. Google Cloud Platform 콘솔에서 Kubernetes Engine 페이지로 이동합니다.
  2. 프로젝트를 만들거나 선택합니다.
  3. API 및 관련 서비스가 사용 설정될 때까지 기다립니다. 몇 분 정도 걸릴 수 있습니다.
  4. 프로젝트에 결제가 사용 설정되어 있는지 확인하세요.

    결제 사용 설정 방법 알아보기

이 가이드에 사용된 다음 명령줄 도구를 설치합니다.

  • gcloud는 Kubernetes Engine 클러스터를 만들고 삭제하는 데 사용됩니다. gcloudGoogle Cloud SDK에 포함되어 있습니다.
  • kubectl은 Kubernetes Engine에서 사용되는 클러스터 조정 시스템인 Kubernetes를 관리하기 위해 사용됩니다. gcloud를 사용하여 kubectl을 설치할 수 있습니다.
    gcloud components install kubectl

gcloud 명령줄 도구의 기본값 설정

gcloud 명령줄 도구에서 프로젝트 IDCompute Engine 영역 옵션을 입력하는 시간을 절약하기 위해 기본값을 설정할 수 있습니다.
gcloud config set project [PROJECT_ID]
gcloud config set compute/zone us-central1-b

GKE 클러스터 만들기

이 가이드를 위한 클러스터를 만들기 위해 다음 명령어를 실행합니다. 가이드 클러스터 이름은 istio-tutorial로 지정합니다.

gcloud container clusters create istio-tutorial \
    --machine-type=n1-standard-2 \
    --num-nodes=4 \
    --no-enable-legacy-authorization

필요한 클러스터를 만든 후에는 클러스터 관리자 권한을 현재 사용자에게 부여합니다. Istio를 위해 필요한 RBAC(역할 기반 액세스 제어) 규칙을 만들려면 이 권한이 필요합니다.

kubectl create clusterrolebinding cluster-admin-binding \
  --clusterrole=cluster-admin \
  --user="$(gcloud config get-value core/account)"

고유 클러스터 사용

이 가이드에 기존 클러스터를 사용하려면 Kubernetes의 GKE 기본 버전을 사용 중이고 RBAC(역할 기반 액세스 제어)가 사용 설정되었는지 확인합니다. RBAC를 사용 설정하려면 --no-enable-legacy-authorization 옵션으로 클러스터를 만들거나 업데이트해야 합니다. 또한 kubectl이 설치되었고 버전이 클러스터와 동일하거나 더 최신인지 확인해야 합니다.

1단계: Istio 설치

이제 Istio를 설치합니다. 0.2 릴리스부터는 Istio가 고유 istio-system 네임스페이스에 설치되며, 다른 모든 네임스페이스의 마이크로 서비스를 관리할 수 있습니다. 설치에는 Istio 코어 구성요소, 도구, 샘플이 포함됩니다.

클러스터 사용자 인증 정보가 있는 동일 머신에서 다음 단계를 수행합니다. 이 머신은 사용자의 클러스터 관리자 머신입니다.

  1. Istio 릴리스 페이지로 이동해서 Istio 클라이언트를 실행하려는 OS에 해당하는 설치 파일을 다운로드합니다.

  2. 다운로드한 설치 파일의 압축을 풉니다. 설치 디렉토리에는 다음이 포함됩니다.

    • install/에 있는 Kubernetes의 설치 .yaml 파일
    • samples/에 있는 샘플 애플리케이션
    • bin/ 디렉토리에 있는 istioctl 클라이언트 라이브러리. istioctl은 Envoy를 사이드카 프록시로 수동으로 주입할 때 그리고 라우팅 규칙 및 정책을 만들기 위해 사용됩니다.
    • istio.VERSION 구성 파일
  3. Istio 설치 루트 디렉토리에 있는지 확인합니다.

  4. PATH에 istioctl 클라이언트를 추가합니다.

    export PATH=$PWD/bin:$PATH
  5. Istio의 코어 구성요소를 설치합니다.

    kubectl apply -f install/kubernetes/istio-demo-auth.yaml

    그러면 다음이 수행됩니다.

    • 필요한 RBAC 권한이 포함된 istio-system 네임스페이스를 만듭니다.
    • 코어 Istio 구성요소를 배포합니다.

      • Istio-Pilot은 서비스 검색을 수행하고 Istio 서비스 메시에서 Envoy 사이드카 프록시를 구성합니다.
      • Mixer 구성요소인 Istio-Policy와 Istio-Telemetry는 사용 정책을 적용하고 서비스 메시 간에 텔레메트리 데이터를 수집합니다.
      • Istio-Ingressgateway는 클러스터 외부의 트래픽에 대한 Ingress 지점을 제공합니다.
      • Istio-Citadel은 Istio를 위한 키 및 인증서 관리를 자동화합니다.
    • 측정항목, 로그, 추적을 위한 플러그인을 배포합니다.

    • Envoy 사이드카 사이의 상호 TLS 인증을 사용 설정합니다. 일부 애플리케이션에서는 이 인증 옵션이 작동하지 않습니다. 이 옵션 없이 Istio를 설치하는 방법과 이를 사용할 수 있는 경우에 대한 자세한 내용은 Istio 설정 가이드를 참조하세요.

2단계: Istio 설치 확인

  1. istio-citadel, istio-pilot, istio-ingressgateway, istio-policy, istio-telemetry Kubernetes 서비스가 배포되었는지 확인합니다. 다른 배포된 서비스도 표시될 수 있습니다.

    kubectl get service -n istio-system
    
    출력:
    NAME                       TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                                                               AGE
    ...
    istio-citadel              ClusterIP      10.19.253.95            8060/TCP,9093/TCP                                                     37s
    istio-egressgateway        ClusterIP      10.19.242.139           80/TCP,443/TCP                                                        40s
    istio-ingressgateway       LoadBalancer   10.19.247.233        80:31380/TCP,443:31390/TCP,31400:31400/TCP                            40s
    istio-pilot                ClusterIP      10.19.243.14            15003/TCP,15005/TCP,15007/TCP,15010/TCP,15011/TCP,8080/TCP,9093/TCP   38s
    istio-policy               ClusterIP      10.19.254.117           9091/TCP,15004/TCP,9093/TCP                                           39s
    istio-sidecar-injector     ClusterIP      10.19.248.228           443/TCP                                                               37s
    istio-statsd-prom-bridge   ClusterIP      10.19.252.35            9102/TCP,9125/UDP                                                     39s
    istio-telemetry            ClusterIP      10.19.250.11            9091/TCP,15004/TCP,9093/TCP,42422/TCP                                 39s
    ...
  2. 해당 Kubernetes 포드가 배포되었고 istio-pilot-*, istio-policy-*, istio-telemetry-*, istio-ingressgateway-*, istio-citadel-*을 포함하여 모든 컨테이너가 작동되어 실행 중인지 확인합니다.

    kubectl get pods -n istio-system
    
    출력:
    NAME                                        READY     STATUS      RESTARTS   AGE
    grafana-6995b4fbd7-mp7ps                    1/1       Running     0          12m
    istio-citadel-54f4678f86-4549b              1/1       Running     0          12m
    istio-cleanup-secrets-5pl77                 0/1       Completed   0          12m
    istio-egressgateway-c68bcd889-p52rb         1/1       Running     0          12m
    istio-galley-7bd8b5f88f-nhwlc               1/1       Running     0          12m
    istio-grafana-post-install-6dwhp            0/1       Completed   3          12m
    istio-ingressgateway-665699c874-l62rg       1/1       Running     0          12m
    istio-pilot-68cbbcd65d-l5298                2/2       Running     0          12m
    istio-policy-7c5b5bb744-k6vm9               2/2       Running     0          12m
    istio-security-post-install-g9l9p           0/1       Completed   3          12m
    istio-sidecar-injector-85ccf84984-2hpfm     1/1       Running     0          12m
    istio-statsd-prom-bridge-55965ff9c8-x6sqd   1/1       Running     0          12m
    istio-telemetry-5b6c57fffc-9j4dc            2/2       Running     0          12m
    istio-tracing-77f9f94b98-jv8vh              1/1       Running     0          12m
    prometheus-7456f56c96-7hrk5                 1/1       Running     0          12m
    servicegraph-684c85ffb9-9cd4x               1/1       Running     0          12m

3단계: BookInfo 샘플 애플리케이션 배포

Istio가 설치되고 모든 구성요소가 실행된 다음에는 설치에 제공된 샘플 애플리케이션 중 하나를 배포할 수 있습니다. 이 가이드에서는 BookInfo를 설치합니다. 이 샘플은 웹 상품 페이지, 도서 세부정보, 리뷰(여러 버전의 리뷰 서비스 사용), 등급을 제공하는 4가지 서비스로 구성된 간단한 북스토어 애플리케이션입니다. 이러한 서비스는 모두 Istio를 사용해서 관리됩니다. 이 예에서 사용되는 소스 코드 및 다른 모든 파일은 Istio 설치의 samples/bookinfo 디렉토리에서 찾을 수 있습니다.

이 단계를 수행하면 Istio가 사용 설정된 환경에서 BookInfo 애플리케이션의 서비스를 배포하고 각 서비스와 함께 Envoy 사이드카 프록시를 주입하여 Istio 기능을 제공할 수 있습니다.

  1. 클러스터 관리자 머신에서 아직 Istio 설치 디렉토리의 루트에 있는지 확인합니다.

  2. kubectl applyistioctl kube-inject를 사용하여 애플리케이션을 배포합니다. kube-inject 명령어는 BookInfo 배포를 업데이트하여 서비스와 함께 각 애플리케이션 포드에 사이드카가 배포되도록 합니다.

    kubectl apply -f <(istioctl kube-inject -f samples/bookinfo/platform/kube/bookinfo.yaml)
    
  3. 다음 명령어를 실행하여 애플리케이션이 올바르게 배포되었는지 확인합니다.

    kubectl get services
    출력:
    NAME                       CLUSTER-IP   EXTERNAL-IP   PORT(S)              AGE
    details                    10.0.0.31    <none>        9080/TCP             6m
    kubernetes                 10.0.0.1     <none>        443/TCP              7d
    productpage                10.0.0.120   <none>        9080/TCP             6m
    ratings                    10.0.0.15    <none>        9080/TCP             6m
    reviews                    10.0.0.170   <none>        9080/TCP             6m

    kubectl get pods
    출력:
    NAME                                        READY     STATUS    RESTARTS   AGE
    details-v1-1520924117-48z17                 2/2       Running   0          6m
    productpage-v1-560495357-jk1lz              2/2       Running   0          6m
    ratings-v1-734492171-rnr5l                  2/2       Running   0          6m
    reviews-v1-874083890-f0qf0                  2/2       Running   0          6m
    reviews-v2-1343845940-b34q5                 2/2       Running   0          6m
    reviews-v3-1813607990-8ch52                 2/2       Running   0          6m
  4. 마지막으로 애플리케이션에 대해 Ingress 게이트웨이 라우팅을 정의합니다.

    kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
    

4단계: 애플리케이션 배포 검증

이제 배포되었으므로, BookInfo 애플리케이션의 작동을 확인할 차례입니다.

Ingress IP 및 포트 가져오기

BookInfo를 사용하려면 먼저 다음과 같이 Ingress IP 및 포트를 가져와야 합니다.

kubectl get svc istio-ingressgateway -n istio-system
출력:
NAME                   TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                                      AGE
istio-ingressgateway   LoadBalancer   10.19.247.233   35.239.7.64   80:31380/TCP,443:31390/TCP,31400:31400/TCP   27m

그러면 다음과 같이 Ingress 서비스의 주소가 제공됩니다(첫 번째 포트 사용).

export GATEWAY_URL=35.239.7.64:80

애플리케이션 시험 사용

주소 및 포트가 준비되었으면 curl을 사용해서 BookInfo 앱이 실행되는지 확인합니다.

curl -I http://${GATEWAY_URL}/productpage

응답에 200이 표시되면 애플리케이션이 Istio를 사용해서 올바르게 작동되고 있음을 나타냅니다.

이제 브라우저를 http://$GATEWAY_URL/productpage로 연결해서 BookInfo 웹 페이지를 봅니다. 페이지를 여러 번 새로고침하면 여러 버전의 리뷰가 상품 페이지에 표시되고, 라운드로빈 스타일로 표시됩니다(빨간색 별, 검은색 별, 별 없음). 아직은 버전 라우팅을 제어하기 위해 Istio를 사용하지 않았습니다.

고유 애플리케이션 배포

고유 애플리케이션 중 하나를 배포해보려면 고유 YAML 배포와 동일한 절차를 따릅니다. Istio를 사용하기 위해 애플리케이션 자체를 변경할 필요가 없습니다. Envoy 프록시는 HTTP/1.0을 지원하지 않으므로, 애플리케이션이 모든 HTTP 트래픽에 HTTP/1.1 또는 HTTP/2.0 프로토콜을 사용해야 합니다. HTTP/1.0으로 제공되지 않는 헤더가 라우팅에 필요합니다.

삭제

이 가이드에서 사용한 리소스 비용이 Google Cloud Platform 계정에 청구되지 않도록 하는 방법은 다음과 같습니다.

다음 단계에서 BookInfo 앱을 계속 탐색하길 원하지 않는 경우에는 이 가이드에 사용된 리소스에 따라 Google Cloud Platform 계정에 비용이 부과되지 않도록 다음을 수행하세요.

  1. istio-ingressgateway Ingress 서비스를 삭제합니다.

    kubectl -n istio-system delete service istio-ingressgateway
  2. 다음 명령어의 출력을 확인해서 istio-ingressgateway 부하 분산기가 삭제될 때까지 기다립니다.

    gcloud compute forwarding-rules list
  3. 컨테이너 클러스터를 삭제합니다.

    gcloud container clusters delete istio-tutorial

다음 단계

Istio 제어 영역은 Kubernetes에만 설치할 수 있지만, Istio의 메시 확장 기능을 사용하면 Compute Engine VM과 같은 Kubernetes 이외의 머신을 Istio 서비스 메시에 추가할 수 있습니다. 이를 수행하고 BookInfo 예를 확장하는 방법은 Compute Engine에서 Istio 사용을 참조하세요.

Istio를 더 탐색하려는 경우 Istio 사이트의 가이드 섹션을 참조하여 BookInfo의 Istio 기능을 더 자세히 확인할 수 있습니다. 예를 들면 다음과 같습니다.

  • 지능형 라우팅: 이 예에서는 Istio의 여러 트래픽 관리 기능을 BookInfo에서 사용하는 방법을 보여줍니다. 특히 이 가이드를 마친 후에 살펴보는 것이 좋습니다.
  • 심층 텔레메트리: 이 예에서는 Istio Mixer 및 Envoy 프록시를 사용해서 BookInfo의 서비스 간에 균일한 측정항목, 로그, 추적을 얻는 방법을 보여 줍니다.
이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...

Kubernetes Engine 가이드