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

AWS 기반 Anthos 클러스터에 설치

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

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.6.14-asm.0-linux-amd64.tar.gz
  2. 서명 파일을 다운로드하고 openssl을 사용하여 서명을 확인합니다.

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

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

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

    tar xzf istio-1.6.14-asm.0-linux-amd64.tar.gz

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

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

    cd istio-1.6.14-asm.0
  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: 1.6.14-asm.0
    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: 1.6.14-asm.0

Anthos Service Mesh 설치

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

공개

  1. Anthos Service Mesh 설치:

    istioctl install \
      --set profile=asm-multicloud \
      --set revision=1.6.14-asm.0
    

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

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

    kubectl apply -f istiod-service.yaml
    

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

비공개

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

  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=1.6.14-asm.0 \
     -f istio-operator-internal-lb.yaml
    

    --set revision 인수는 istio.io/rev=1.6.14-asm.0 형식의 버전 라벨을 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=1.6.14-asm.0

제어 영역 구성요소 확인

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에서 별도의 컨테이너로 제공되는 공용 프로세스 외부 프록시로 구현됩니다.

워크로드를 배포하기 전에 사이드카 프록시 삽입을 구성하여 Anthos Service Mesh가 트래픽을 모니터링하고 보호할 수 있도록 해야 합니다.

Anthos Service Mesh를 설치하기 전에 클러스터에서 실행 중이었던 모든 워크로드는 현재 Anthos Service Mesh 버전을 포함하도록 사이드카 프록시를 삽입하거나 업데이트해야 합니다. 새 워크로드를 배포하기 전에 사이드카 프록시 삽입을 구성하여 Anthos Service Mesh가 트래픽을 모니터링하고 보호할 수 있도록 해야 합니다.

사이드카 자동 삽입을 사용 설정하려면 istiod에 설정한 것과 동일한 버전으로 네임스페이스에 라벨을 지정합니다. 다음 명령어를 실행하여 istiod의 라벨을 표시합니다.

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

출력에 버전 라벨 istio.io/rev=1.6.14-asm.0이 있는지 확인합니다. 이것은 자동 삽입을 사용 설정하는 데 사용하는 라벨입니다. 예를 들어 다음과 같은 명령어로 자동 삽입을 사용 설정할 수 있습니다.

kubectl label namespace NAMESPACE istio-injection- istio.io/rev=1.6.14-asm.0 --overwrite

여기서 NAMESPACE는 네임스페이스를 명시적으로 만들지 않은 경우 애플리케이션 서비스의 네임스페이스 이름 또는 default입니다.

자세한 내용은 사이드카 프록시 삽입을 참조하세요.

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

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 값을 사용합니다.

문제해결

AWS 기반 Anthos 클러스터는 부하 분산기 엔드포인트를 포함하는 서브넷에 태그를 필요로 합니다. AWS 기반 Anthos 클러스터는 자동으로 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. 기본적으로 AWS 기반 Anthos 클러스터는 비공개 및 공개 서브넷이 있는 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 클러스터에 배포 예시 만들기.