Anthos Service Mesh 1.7 문서를 보고 있습니다. 최신 문서를 보거나 사용 가능한 다른 버전을 선택합니다.

AWS 기반 Anthos 클러스터에 설치

이 가이드에서는 AWS 기반 Anthos 클러스터에 Anthos Service Mesh 1.7.6-asm.1 버전을 정상적으로 설치하는 방법을 설명합니다.

Anthos Service Mesh를 사용하면 Istio 인그레스 게이트웨이가 사전 설치됩니다. 하지만 인그레스 컨트롤러를 사용하려는 경우 Anthos Service Mesh를 사용하여 Kubernetes 인그레스 리소스를 설정할 수 있습니다. 이 가이드에서는 Anthos Service Mesh를 설치하고 선택적으로 Kubernetes 인그레스 리소스를 설정하는 방법을 보여줍니다.

시작하기 전에

Anthos Service Mesh 설치를 시작하기 전에 다음 태스크를 수행했는지 확인합니다.

요구사항

  • Anthos Service Mesh를 설치하는 사용자 클러스터에 최소 4개의 vCPU, 15GB 메모리, 4개의 복제본이 있는지 확인합니다.

  • 워크로드를 배포하기 전에 서비스 포트 이름 지정을 검토합니다.

  • 클러스터 버전이 지원되는 환경 목록에 있는지 확인합니다.

제한사항

Google Cloud 프로젝트에는 하나의 메시만 연결할 수 있습니다.

환경 설정

Anthos Service Mesh를 설치할 머신에 다음 도구가 필요합니다. Anthos Service Mesh는 관리자 클러스터가 아닌 사용자 클러스터에만 설치할 수 있습니다.

  • curl 명령줄 도구
  • Cloud SDK(gcloud 명령줄 도구).

Cloud SDK 설치 후:

  1. Cloud SDK를 사용하여 인증합니다.

    gcloud auth login
    
  2. 구성요소를 업데이트합니다.

    gcloud components update
    
  3. kubectl을 설치합니다.

    gcloud components install kubectl
    
  4. Online Boutique 샘플 애플리케이션을 배포하고 설치를 테스트하려면 kpt를 설치합니다.

    gcloud components install kpt
    
  5. 컨텍스트를 사용자 클러스터로 전환합니다.

    kubectl config use-context CLUSTER_NAME
  6. 클러스터 관리자 권한을 사용자 계정(Google Cloud 로그인 이메일 주소)에 부여합니다. Anthos Service Mesh에 필요한 역할 기반 액세스 제어(RBAC) 규칙을 만들려면 이러한 권한이 필요합니다.

    kubectl create clusterrolebinding cluster-admin-binding \
      --clusterrole=cluster-admin \
      --user=USER_ACCOUNT

설치 파일 다운로드

  1. Anthos Service Mesh 설치 파일을 현재 작업 디렉터리에 다운로드합니다.

    curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.7.6-asm.1-linux-amd64.tar.gz
  2. 서명 파일을 다운로드하고 openssl을 사용하여 서명을 확인합니다.

    curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.7.6-asm.1-linux-amd64.tar.gz.1.sig
    openssl dgst -verify - -signature istio-1.7.6-asm.1-linux-amd64.tar.gz.1.sig istio-1.7.6-asm.1-linux-amd64.tar.gz <<'EOF'
    -----BEGIN PUBLIC KEY-----
    MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWZrGCUaJJr1H8a36sG4UUoXvlXvZ
    wQfk16sxprI2gOJ2vFFggdq3ixF2h4qNBt0kI7ciDhgpwS8t+/960IsIgw==
    -----END PUBLIC KEY-----
    EOF

    예상되는 출력은 Verified OK입니다.

  3. 원하는 파일 시스템 위치에 파일 콘텐츠 압축을 풉니다. 예를 들어 콘텐츠를 현재 작업 디렉터리에 추출하려면 다음을 사용하세요.

    tar xzf istio-1.7.6-asm.1-linux-amd64.tar.gz

    이 명령어는 현재 작업 디렉터리에 istio-1.7.6-asm.1이라는 설치 디렉터리를 만듭니다. istio-1.7.6-asm.1/bin 디렉터리에는 Anthos Service Mesh를 설치하기 위해 사용하는 istioctl 명령줄 도구가 포함됩니다.

  4. Anthos Service Mesh 설치 루트 디렉터리에 있는지 확인합니다.

    cd istio-1.7.6-asm.1
  5. 편의를 위해 /bin 디렉터리를 PATH에 추가합니다.

    export PATH=$PWD/bin:$PATH

istio-system 네임스페이스를 만듭니다.

제어 영역 구성요소에 대해 istio-system이라는 네임스페이스를 만듭니다.

kubectl create namespace istio-system

유효성 검증 웹훅 구성

Anthos Service Mesh를 설치할 때 istiod에 버전 라벨을 설정합니다. 웹훅을 검증할 때 동일한 버전을 설정해야 합니다.

다음 YAML을 istiod-service.yaml 파일에 복사합니다.

apiVersion: v1
kind: Service
metadata:
  name: istiod
  namespace: istio-system
  labels:
    istio.io/rev: asm-176-1
    app: istiod
    istio: pilot
    release: istio
spec:
  ports:
    - port: 15010
      name: grpc-xds # plaintext
      protocol: TCP
    - port: 15012
      name: https-dns # mTLS with k8s-signed cert
      protocol: TCP
    - port: 443
      name: https-webhook # validation and injection
      targetPort: 15017
      protocol: TCP
    - port: 15014
      name: http-monitoring # prometheus stats
      protocol: TCP
  selector:
    app: istiod
    istio.io/rev: asm-176-1

Anthos Service Mesh 설치

이 섹션에서는 asm-multicloud 프로필의 지원되는 기능 페이지에 나열된 지원되는 기본 기능을 사용 설정하는 Anthos Service Mesh를 사용자 클러스터에 설치하는 방법을 설명합니다. 공개 서브넷 또는 비공개 서브넷에 대해 인그레스를 사용 설정하는 방법을 선택할 수 있습니다.

공개

  1. Anthos Service Mesh 설치:

    istioctl install \
      --set profile=asm-multicloud \
      --set revision=asm-176-1
    

    --set revision 인수는 istio.io/rev=asm-176-1 형식의 버전 라벨을 istiod에 추가합니다. 버전 라벨은 자동 사이드카 인젝터 웹훅에서 삽입된 사이드카를 특정 istiod 버전과 연결하는 데 사용됩니다. 네임스페이스에 사이드카 자동 주입을 사용 설정하려면 istiod의 라벨과 일치하는 버전으로 라벨을 지정해야 합니다.

  2. 버전 라벨이 있는 istiod 서비스를 찾을 수 있도록 유효성 검증 웹훅을 구성합니다.

    kubectl apply -f istiod-service.yaml
    

    이 명령어는 유효성 검증 웹훅이 구성을 적용하기 전에 구성을 자동으로 확인할 수 있는 서비스 항목을 만듭니다.

비공개

다음 섹션에서는 Anthos Service Mesh로 생성되는 모든 서비스에 service.beta.kubernetes.io/aws-load-balancer-internal 주석을 추가합니다. 이 주석이 있으면 Anthos clusters on AWS가 비공개 인그레스 서비스를 만듭니다.

  1. 다음 YAML을 istio-operator-internal-lb.yaml 파일에 저장합니다.

    apiVersion: install.istio.io/v1alpha1
    kind: IstioOperator
    spec:
      components:
        ingressGateways:
        - enabled: true
          k8s:
            serviceAnnotations:
              service.beta.kubernetes.io/aws-load-balancer-internal: "true"
    
  2. Anthos Service Mesh 설치:

    istioctl install \
     --set profile=asm-multicloud \
     --set revision=asm-176-1 \
     -f istio-operator-internal-lb.yaml
    

    --set revision 인수는 istio.io/rev=asm-176-1 형식의 버전 라벨을 istiod에 추가합니다. 버전 라벨은 자동 사이드카 인젝터 웹훅에서 삽입된 사이드카를 특정 istiod 버전과 연결하는 데 사용됩니다. 네임스페이스에 사이드카 자동 주입을 사용 설정하려면 istiod의 라벨과 일치하는 버전으로 라벨을 지정해야 합니다.

  3. 버전 라벨이 있는 istiod 서비스를 찾을 수 있도록 유효성 검증 웹훅을 구성합니다.

    kubectl apply -f istiod-service.yaml
    

    이 명령어는 유효성 검증 웹훅이 구성을 적용하기 전에 구성을 자동으로 확인할 수 있는 서비스 항목을 만듭니다.

Prometheus 및 Kiali없이 설치

기본적으로 Anthos Service Mesh 1.7 이하에서는 Anthos Service Mesh가 docker.ioquay.io의 원래 패키지 저장소에서 PrometheusKiali를 설치합니다. 이러한 도구를 설치하거나 이러한 저장소에 연결을 허용하지 않으려면 -set addonComponents.prometheus.enabled=false--set addonComponents.kiali.enabled=falseistioctl install에 전달합니다. 예를 들어 다음 명령어를 사용하여 공개 서브넷 설치에서 Prometheus 및 Kiali를 제외합니다.

  istioctl install \
    --set profile=asm-multicloud \
    --set addonComponents.prometheus.enabled=false \
    --set addonComponents.kiali.enabled=false \
    --revision=asm-176-1

제어 영역 구성요소 확인

istio-system의 제어 영역 pod가 작동 중인지 확인합니다.

kubectl get pod -n istio-system

예상 출력은 다음과 비슷합니다.

NAME                                      READY   STATUS      RESTARTS   AGE
istio-ingressgateway-74cc894bfd-786rg     1/1     Running     0          7m19s
istiod-78cdbbbdb-d7tps                    1/1     Running     0          7m36s
promsd-576b8db4d6-lqf64                   2/2     Running     1          7m19s

사이드카 프록시 삽입

Anthos Service Mesh는 사이드카 프록시를 사용하여 네트워크 보안, 안정성, 관측 가능성을 개선합니다. Anthos Service Mesh를 사용하면 이러한 함수가 애플리케이션의 기본 컨테이너에서 추상화되고 동일한 Pod에서 별도의 컨테이너로 제공되는 공용 프로세스 외부 프록시로 구현됩니다. 사이드카 프록시로 pod를 삽입하려면 Anthos Service Mesh 설치 시 istiod에 설정한 것과 동일한 버전 라벨을 네임스페이스에 지정하여 자동 사이드카 프록시 삽입(자동 삽입)을 구성합니다.

  • Anthos Service Mesh를 설치하기 전에 클러스터에서 실행 중인 워크로드가 있는 모든 네임스페이스에서 자동 삽입을 사용 설정해야 합니다.

  • 새 워크로드를 배포하기 전에 자동 삽입을 구성하여 Anthos Service Mesh가 트래픽을 모니터링하고 보호할 수 있는지 확인합니다.

자동 삽입을 사용 설정하려면 다음을 실행하세요.

  1. 다음 명령어를 사용하여 istiod에서 버전 라벨을 찾습니다.

    kubectl -n istio-system get pods -l app=istiod --show-labels
    

    출력은 다음과 유사합니다.

    NAME                                READY   STATUS    RESTARTS   AGE   LABELS
    istiod-asm-176-1-5788d57586-bljj4   1/1     Running   0          23h   app=istiod,istio.io/rev=asm-176-1,istio=istiod,pod-template-hash=5788d57586
    istiod-asm-176-1-5788d57586-vsklm   1/1     Running   1          23h   app=istiod,istio.io/rev=asm-176-1,istio=istiod,pod-template-hash=5788d57586

    출력의 LABELS 열 아래에서 istio.io/rev= 프리픽스 다음에 있는 istiod 버전 라벨의 값을 확인합니다. 이 예시에서 값은 asm-176-1입니다.

  2. 버전 라벨을 적용하고 istio-injection 라벨이 있는 경우 삭제합니다. 다음 명령어에서 NAMESPACE는 자동 삽입을 사용 설정할 네임스페이스의 이름이며 REVISION은 이전 단계에서 표시된 버전 라벨입니다.

    kubectl label namespace NAMESPACE  istio-injection- istio.io/rev=REVISION --overwrite
    

    출력에서 "istio-injection not found" 메시지는 무시해도 됩니다. 즉, 네임스페이스에 이전에 istio-injection 라벨이 사용되지 않았으며, Anthos Service Mesh를 새로 설치하거나 새로 배포해야 합니다. 네임스페이스에 istio-injection 및 버전 라벨이 모두 포함된 경우 자동 삽입이 실패하기 때문에 Anthos Service Mesh 문서에서 모든 kubectl label 명령어에는 istio-injection 라벨 삭제가 포함됩니다.

  3. Anthos Service Mesh를 설치하기 전에 클러스터에서 워크로드를 실행 중인 경우 pod를 다시 시작하여 재삽입을 트리거합니다.

    pod를 다시 시작하는 방법은 애플리케이션과 클러스터가 있는 환경에 따라 달라집니다. 예를 들어 스테이징 환경에서 모든 pod를 간단히 삭제하면 다시 시작됩니다. 하지만 프로덕션 환경에서는 트래픽 중단을 방지하기 위해 pod를 안전하게 다시 시작할 수 있도록 블루-그린 배포를 구현하는 프로세스가 있을 수 있습니다.

    kubectl를 사용하여 순차적 재시작을 수행할 수 있습니다.

    kubectl rollout restart deployment -n NAMESPACE
    
  4. pod가 새 버전의 istiod를 가리키도록 구성되었는지 확인합니다.

    kubectl get pods -n NAMESPACE -l istio.io/rev=REVISION
    

인그레스 게이트웨이 액세스

Anthos Service Mesh는 서비스 메시에서 실행되는 애플리케이션에 대한 인바운드 트래픽을 관리하는 데 사용할 수 있는 사전 구성된 인그레스 게이트웨이 istio-ingressgateway를 제공합니다. 클러스터 외부에서(예: 브라우저에서) 애플리케이션에 액세스할 수 있도록 하려면 다음 안내를 따르세요.

  • istio-ingressgateway가 사용하도록 구성되는 외부 부하 분산기의 호스트 이름과 포트 또는 외부 IP 주소를 가져와야 합니다.

  • 애플리케이션은 Online Boutique 샘플 애플리케이션의 frontend-gateway.yaml와 마찬가지로 게이트웨이 및 VirtualService 리소스를 정의해야 합니다.

istio-ingressgateway의 외부 IP 주소를 가져오려면 다음 안내를 따르세요.

  1. INGRESS_HOST 환경 변수를 만듭니다.

    export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')
    
  2. INGRESS_PORT 환경 변수를 만듭니다.

    export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')
    
  3. 테스트하려면 Online Boutique와 같은 샘플 애플리케이션을 배포합니다.

  4. 브라우저에서 애플리케이션에 액세스하려면 URL에 $INGRESS_HOST:$INGRESS_PORT 값을 사용합니다.

문제해결

Anthos clusters on AWS는 부하 분산기 엔드포인트를 포함하는 서브넷에 태그를 필요로 합니다. Anthos clusters on AWS는 자동으로 AWSCluster 리소스의 spec.Networking.ServiceLoadBalancerSubnetIDs 필드에 지정된 모든 서브넷에 태그를 지정합니다.

사용자 클러스터에 서브넷을 추가하려고 하거나 기존 서브넷에 태그를 다시 적용해야 하는 경우 다음 단계를 수행하세요.

  1. anthos-aws 디렉터리에서 anthos-gke를 사용하여 컨텍스트를 관리 서비스로 전환합니다.

    cd anthos-aws
    anthos-gke aws management get-credentials

  2. kubectl을 사용하여 클러스터의 AWS VPC ID를 가져오고 이를 변수로 저장합니다.

     export VPC_ID=$(\
     env HTTP_PROXY=http://localhost:8118 \
     kubectl get awscluster cluster-0 -o jsonpath='{.spec.networking.vpcID}')
    
  3. echo를 사용하여 변수 콘텐츠를 확인합니다. vpc-12345678abcdef0과 유사한 결과가 출력됩니다.

    echo $VPC_ID
    
  4. 클러스터 ID를 환경 변수에 저장합니다.

    export CLUSTER_ID=$(\
    env HTTP_PROXY=http://localhost:8118 \
    kubectl get awscluster cluster-0 -o jsonpath='{.status.clusterID}')
    

    echo로 변수를 확인할 수 있습니다.

    echo $CLUSTER_ID
    

    응답에 클러스터 ID가 포함됩니다.

    gke-12345678
    
  5. 기본적으로 Anthos clusters on AWS는 비공개 및 공개 서브넷이 있는 VPC를 설정합니다. 서브넷 ID를 검색하려면 aws 명령줄 도구를 사용합니다.

    다음 옵션 중 하나를 선택합니다.

    • 공개: 공개 서브넷에 서비스를 노출하려는 경우
    • 비공개: 비공개 서브넷에 서비스를 노출하려는 경우
    • 여러 서브넷: 여러 서브넷에 서비스를 노출하려는 경우

    공개

     export SUBNET_ID=$(aws ec2 describe-subnets \
     --filters "Name=vpc-id,Values=$VPC_ID" "Name=tag:Name,Values=*public*" \
     --query "Subnets[*].SubnetId" \
     --output text)
    

    서브넷 ID가 포함된 객체가 출력되며 subnet-1234abcdefg와 유사합니다. echo로 변수를 확인할 수 있습니다.

    echo $SUBNET_ID
    

    응답에 서브넷 ID가 포함됩니다.

    subnet-012345678abcdef
    

    비공개

     export SUBNET_ID=$(aws ec2 describe-subnets \
     --filters "Name=vpc-id,Values=$VPC_ID" "Name=tag:Name,Values=*private*" \
     --query "Subnets[*].SubnetId" \
     --output text)
    

    서브넷 ID가 포함된 객체가 출력되며 subnet-1234abcdefg와 유사합니다. echo로 변수를 확인할 수 있습니다.

    echo $SUBNET_ID
    

    응답에 서브넷 ID가 포함됩니다.

    subnet-012345678abcdef
    

    여러 서브넷

    AWSNodePools에 여러 서브넷을 사용하는 경우(예를 들어 여러 가용성 영역을 사용하는 경우) 서브넷 ID에 개별적으로 태그를 지정해야 합니다.

    aws ec2 describe-subnets로 서브넷 ID 목록을 검색합니다.

    모든 공개 서브넷 목록을 가져오려면 다음 명령어를 실행합니다.

    aws ec2 describe-subnets \
     --filters "Name=vpc-id,Values=$VPC_ID" "Name=tag:Name,Values=*public*" \
     --query "Subnets[*].SubnetId" \
     --output text
    

    모든 비공개 서브넷 목록을 가져오려면 다음 명령어를 실행합니다.

    aws ec2 describe-subnets \
     --filters "Name=vpc-id,Values=$VPC_ID" "Name=tag:Name,Values=*private*" \
     --query "Subnets[*].SubnetId" \
     --output text
    

    응답에 서브넷 ID가 포함됩니다.

    subnet-012345678abcdef
    subnet-abcdef123456789
    subnet-123456789abcdef
    
  6. 클러스터 ID로 서브넷에 태그를 지정합니다. 여러 서브넷이 있는 경우 여러 서브넷을 선택합니다.

    단일 서브넷

    aws ec2 create-tags \
    --resources $SUBNET_ID \
    --tags Key=kubernetes.io/cluster/$CLUSTER_ID,Value=shared
    

    여러 서브넷

    각 서브넷에 대해 다음 명령어를 실행합니다.

    aws ec2 create-tags \
    --resources subnet-ids \
    --tags Key=kubernetes.io/cluster/$CLUSTER_ID,Value=shared
    

    subnet-ids를 공백으로 구분된 서브넷 ID 목록으로 바꿉니다. 예: subnet-012345678abcdef subnet-abcdef123456789 subnet-123456789abcdef

다음 단계

AWS 기반 Anthos 클러스터에 배포 예시를 만듭니다.