버전 1.0. 이 버전은 완전히 지원되지 않습니다. GKE On-Prem에 영향을 미치는 보안 취약점, 노출, 문제에 대한 최신 패치와 업데이트를 이용하려면 완전히 지원되는 버전으로 업그레이드하세요. 최신 버전은 여기에서 확인할 수 있습니다.

Istio 설치

이 페이지에서는 GKE On-Prem 클러스터에 Istio를 설치하는 방법을 설명합니다.

개요

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

이 가이드는 GKE On-Prem에서 Istio를 설치 및 구성하고 Istio가 사용 설정된 데모 멀티 서비스 애플리케이션을 배포하는 방법을 설명합니다.

시작하기 전에

Cloud SDK를 설치했는지 확인하세요.

Helm 설치

Istio를 설치하려면 Istio의 구성 가능한 프로필 중 하나로 Helm을 사용하는 것이 좋습니다.

Helm을 아직 설치하지 않았다면 Helm README의 안내에 따라 클러스터 사용자 인증 정보가 있는 머신에 helm 바이너리를 설치합니다.

권한 및 사용자 인증정보

  1. Istio를 설치하려는 곳에 GKE On-Prem 사용자 클러스터에 대한 kubectl사용자 인증 정보가 있는지 확인합니다. Istio는 관리자 클러스터가 아닌 GKE On-Prem 사용자 클러스터에만 설치할 수 있습니다.

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

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

    클러스터 관리자 권한을 부여하지 않고 데모 앱을 실행할 수 있지만, 원격 분석 데이터 및 기타 Istio 기능에 액세스하려면 권한이 필요합니다.

Istio 다운로드

GKE On-Prem의 경우 Istio 버전 1.1.7을 사용하는 것이 좋습니다.

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

  1. 다음 명령어를 사용하여 Istio v1.1.7 패키지를 다운로드하여 현재 디렉터리로 확장합니다.

    curl -L https://github.com/istio/istio/releases/download/1.1.7/istio-1.1.7-linux.tar.gz | tar xz
    

    설치 디렉터리에는 다음이 포함됩니다.

    • install/의 Kubernetes용 설치 .yaml 파일
    • samples/의 샘플 애플리케이션
    • bin/ 디렉터리의 istioctl 클라이언트 바이너리. istioctl은 Envoy를 사이드카 프록시로 수동으로 삽입하고 라우팅 규칙 및 정책을 만들 때 사용됩니다.
    • istio.VERSION 구성 파일
  2. 설치 루트 디렉터리로 변경하고 PATHistioctl을 추가합니다.

    cd  istio-1.1.7
    export PATH=$PATH:${PWD}/bin
    

네임스페이스 및 인증서 설정

클러스터 관리자 머신에서 다음을 수행하여 제어 영역 구성요소의 istio-system 네임스페이스를 설정합니다.

kubectl create namespace istio-system

그런 다음 필요한 루트 인증서를 Citadel의 istio-system에 복사합니다. 이는 GKE On-Prem 클러스터에 필요합니다.

kubectl get secret istio-ca-secret --namespace=kube-system --export -o yaml | kubectl apply --validate=false --namespace=istio-system -f -

Istio 설치

을 실행합니다.

이제 Istio를 설치할 준비가 되었습니다. Istio는 방금 생성한 istio-system 네임스페이스에 설치되며 다른 모든 네임스페이스에서 마이크로서비스를 관리할 수 있습니다. 설치에는 Istio 핵심 구성요소, 도구, 샘플이 포함됩니다.

  1. Istio 설치 루트 디렉터리에 있는지 확인합니다.

  2. Istio 커스텀 리소스 정의(CRD)를 설치합니다.

    helm template install/kubernetes/helm/istio-init \
      --name istio-init --namespace istio-system | kubectl apply -f -
    
  3. 모든 CRD가 Kubernetes API 서버에서 커밋될 때까지 몇 초 정도 기다립니다.

  4. 기본 프로필을 사용하여 Istio를 설치합니다. 다른 프로필을 선택할 수도 있지만 프로덕션 배포에는 기본 프로필이 권장됩니다.

    helm template install/kubernetes/helm/istio \
      --name istio --namespace istio-system | kubectl apply -f -
    

    이렇게 하면 핵심 Istio 구성요소가 배포됩니다.

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

Istio 설치 확인

  1. 다음 Kubernetes 서비스가 배포되었는지 확인합니다. istio-citadel, istio-pilot, istio-ingressgateway, istio-policy, istio-telemetry(배포된 다른 서비스도 표시됩니다)

    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-galley               ClusterIP      10.19.245.2             443/TCP,15014/TCP,9901/TCP                                            37s
    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 pod가 배포되고 모든 컨테이너가 실행 중인지 확인합니다. istio-pilot-*, istio-policy-*, istio-telemetry-*, istio-ingressgateway-*, istio-citadel-*

    kubectl get pods -n istio-system
    
    결과:
    NAME                                        READY     STATUS      RESTARTS   AGE
    istio-citadel-54f4678f86-4549b              1/1       Running     0          12m
    istio-cleanup-secrets-5pl77                 0/1       Completed   0          12m
    istio-galley-7bd8b5f88f-nhwlc               1/1       Running     0          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-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
    ...

외부 IP 주소 구성

기본 Istio 설치에서는 외부 IP 주소가 LoadBalancer 서비스에 자동으로 할당된다고 가정합니다. 하지만 GKE On-Prem 클러스터에서는 그렇지 않습니다. 따라서 Istio 인그레스 게이트웨이 서비스에 IP 주소를 수동으로 할당해야 합니다. 고정 외부 IP 주소를 할당하려면 다음 명령어를 실행합니다.

kubectl edit svc -n istio-system istio-ingressgateway

다음 줄을 추가합니다.

loadBalancerIP: <your static external IP address>

다음 예시와 같이 spec: 섹션에 추가합니다.

spec:
  loadBalancerIP: 1.2.3.4

샘플 애플리케이션 배포

Istio가 설치되고 모든 구성요소가 실행된 다음에는 설치에 제공된 샘플 애플리케이션 중 하나를 배포할 수 있습니다. 이 가이드에서는 BookInfo를 설치합니다. 모두 Istio를 사용하여 관리되는 웹 제품 페이지, 도서 세부정보, 리뷰(여러 버전의 리뷰 서비스 사용), 평점을 제공하는 4가지 서비스로 구성된 간단한 샘플 Bookstore 애플리케이션입니다. 이 예시에서 사용되는 소스 코드 및 다른 모든 파일은 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. 마지막으로 애플리케이션의 인그레스 게이트웨이 라우팅을 정의합니다.

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

애플리케이션 배포 검증

이제 배포되었으므로, BookInfo 애플리케이션의 작동을 확인할 차례입니다. 인그레스 게이트웨이의 외부 IP 주소는 이전에 구성한 것이어서 이미 알고 있습니다. 다음 예시는 외부 IP에 1.2.3.4를 사용한 경우입니다.

export GATEWAY_URL=1.2.3.4

애플리케이션 시험 사용

  1. curl을 사용하여 BookInfo 앱이 실행되는지 확인합니다.

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

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

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

고유 애플리케이션 배포

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

예시와 같이 kube-inject를 사용하여 애플리케이션을 배포할 때 사이드카를 추가하거나 애플리케이션이 실행 중인 네임스페이스에 Istio의 자동 사이드카 삽입을 사용 설정할 수 있습니다.

제거

  1. 다음 명령어를 사용하여 Istio 구성요소를 제거합니다.

    helm template install/kubernetes/helm/istio --name istio --namespace istio-system | kubectl delete -f -
    
  2. 그런 다음 istio-system 네임스페이스를 삭제합니다.

    kubectl delete namespace istio-system
    

다음 단계

Istio 사이트 및 Google Cloud Platform Istio 문서에서 Istio에 대해 자세히 알아보세요.