이전 버전의 GKE On-Prem 문서를 보고 있습니다. 최신 문서 보기

Istio 설치

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

개요

Istio는 GKE On-Prem에서 실행되는 서비스를 비롯한 마이크로서비스 연결, 모니터링, 보안을 위한 오픈소스 프레임워크입니다. 이 프레임워크를 사용하면 서비스 코드를 변경하지 않아도 부하 분산, 서비스 간 인증, 모니터링 등이 포함된 배포된 서비스 네트워크를 만들 수 있습니다. 서비스에 Istio 지원을 추가하려면 각 애플리케이션 포드에 특수한 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.13을 사용하는 것이 좋습니다.

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

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

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

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

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

    cd  istio-1.1.13
    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 주소를 구성하려면 클러스터의 부하 분산 모드에 따라 다음 섹션 중 하나를 따르세요.

통합 부하 분산 모드

  1. istio-ingressgateway 서비스 구성을 엽니다.

    kubectl edit svc -n istio-system istio-ingressgateway
    

    istio-ingressgateway 서비스의 구성은 셸의 기본 텍스트 편집기에서 열립니다.

  2. 파일에서 사양(spec) 블록 아래에 다음 줄을 추가합니다.

    loadBalancerIP: <your static external IP address>
    

    예:

    spec:
     loadBalancerIP: 203.0.113.1
    
  3. 파일을 저장합니다.

수동 부하 분산 모드

선택한 부하 분산기에서 VIP가 포함된 NodePort 유형의 서비스를 노출하려면 먼저 nodePort 값을 찾아야 합니다.

  1. 셸에서 istio-ingressgateway 서비스의 구성을 확인합니다.

    kubectl get svc -n istio-system istio-ingressgateway -o yaml
    

    istio의 게이트웨이에 대한 각 포트가 표시됩니다. 명령어 결과는 다음과 같습니다.

     ...
     ports:

    • name: status-port nodePort: 30391 port: 15020 protocol: TCP targetPort: 15020
    • name: http2 nodePort: 31380 port: 80 protocol: TCP targetPort: 80
    • name: https nodePort: 31390 port: 443 protocol: TCP targetPort: 443
    • name: tcp nodePort: 31400 port: 31400 protocol: TCP targetPort: 31400
    • name: https-kiali nodePort: 31073 port: 15029 protocol: TCP targetPort: 15029
    • name: https-prometheus nodePort: 30253 port: 15030 protocol: TCP targetPort: 15030
    • name: https-grafana nodePort: 30050 port: 15031 protocol: TCP targetPort: 15031
    • name: https-tracing nodePort: 31204 port: 15032 protocol: TCP targetPort: 15032
    • name: tls nodePort: 30158 port: 15443 protocol: TCP targetPort: 15443 ...
  2. 부하 분산기를 통해 이러한 포트를 노출합니다.

    예를 들어 이름이 http2인 서비스 포트에는 port 80 및 nodePort 31380이 있습니다. 사용자 클러스터의 노드 주소가 192.168.0.10, 192.168.0.11, 192.168.0.12이고 부하 분산기의 VIP가 203.0.113.1이라고 가정합니다.

    203.0.113.1:80로 전송된 트래픽이 192.168.0.10:31380, 192.168.0.11:31380 또는 192.168.0.12:31380로 전달되도록 부하 분산기를 구성합니다. 이 주어진 VIP에 노출할 서비스 포트를 선택할 수 있습니다.

샘플 애플리케이션 배포

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

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

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

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

    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
    

애플리케이션 배포 검증

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

export GATEWAY_URL=203.0.113.1

애플리케이션 시험 사용

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

    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에 대해 자세히 알아보세요.