자동 Envoy 삽입을 사용하는 Google Kubernetes Engine 포드 설정 옵션

이 가이드에서는 자동 Envoy 사이드카 인젝터의 추가 옵션과 작업에 대한 정보를 제공합니다.

기존 워크로드에 사이드카 프록시 추가

사이드카 인젝터를 클러스터에 설치하면 사용 설정된 네임스페이스에 새로 생성된 pod에 사이드카 프록시가 자동으로 삽입됩니다. 사이드카 인젝터를 사용 설정하기 전에 이미 워크로드가 실행되고 있는 경우 삽입이 이루어지려면 다시 시작해야 합니다.

Deployment, DaemonSet 또는 StatefulSet 컨트롤러에서 관리하는 pod의 경우 다음을 실행할 수 있습니다.

# Deployment
kubectl rollout restart deployment/DEPLOYMENT_NAME --namespace NAMESPACE

# DaemonSet
kubectl rollout restart daemonset/DAEMONSET_NAME --namespace NAMESPACE

# StatefulSet
kubectl rollout restart statefulset/STATEFULSET_NAME --namespace NAMESPACE

위의 컨트롤러를 사용하여 pod를 배포하지 않은 경우 pod를 개별적으로 삭제해야 합니다. 이후에는 새로운 사이드카 프록시를 사용하여 자동으로 다시 생성됩니다.

kubectl delete pod POD_NAME -n NAMESPACE

각 pod에 사이드카 프록시 컨테이너가 삽입되었는지 확인합니다.

kubectl get pods -n NAMESPACE

예를 들어 위에서 busybox 클라이언트를 만들면 busybox 애플리케이션 자체용과 삽입된 Envoy 사이드카 프록시용으로 pod 2/2개가 실행됩니다.

NAME                      READY   STATUS    RESTARTS   AGE
busybox-c54f578c9-c9fk4   2/2     Running   183        7d15h

삽입 재정의

기본적으로 네임스페이스를 사용 설정하면 모든 상주 pod에 사이드카 프록시 삽입이 사용 설정됩니다. 삽입은 특정 요구에 맞게 다양한 범위에 대해 선택적으로 구성할 수도 있습니다. 예를 들어 프록시리스 gRPC 서비스의 사이드카 프록시 삽입을 방지하려면 재정의를 사용해야 합니다.

삽입 재정의는 네임스페이스가 사용 설정된 경우에만 적용되고, pod 주석 > NeverInjorSelector > AlwaysInjorSelector > 기본 정책 우선순위에 적용됩니다.

특정 개별 pod에 대한 삽입 사용 설정/중지

다음 pod 주석을 사용하여 사용 설정된 네임스페이스의 특정 pod에 삽입을 사용 설정 또는 중지합니다.

...
metadata:
  annotations:
    sidecar.istio.io/inject: "true" / "false"

특정 pod 그룹에 대한 삽입 사용 설정/중지

사이드카 인젝터 자체는 Kubernetes 라벨 선택기 배열을 기반으로 사용 설정된 네임스페이스에 항상 pod를 삽입하거나 혹은 절대 삽입하지 않도록 구성할 수 있습니다. 예를 들어 pod에 'run=client' 라벨이 있으면 사이드카 인젝터가 사이드카 프록시를 삽입하지 않도록 다음 명령어를 사용합니다.

kubectl edit configmap -n istio-control istio-sidecar-injector

...
config: |-
  policy: enabled
  alwaysInjectSelector:
    []

  neverInjectSelector:
    - matchLabels:
        run: client
...

이 구성을 적용하려면 기존 사이드카 인젝터 배포를 다시 시작해야 합니다.

트래픽 가로채기 동작 맞춤설정

기본적으로 애플리케이션의 모든 아웃바운드 트래픽은 가로채기되며 Envoy 사이드카 프록시로 리디렉션됩니다. 그러면 Envoy 프록시가 Cloud Service Mesh에서 받은 안내에 따라 트래픽을 처리할 수 있습니다. 사이드카 프록시를 우회하도록 이 동작을 수정해야 하는 경우도 있습니다.

다음 Pod 주석을 사용하여 가로채기 및 리디렉션에서 트래픽을 제외합니다.

아웃바운드 IP 주소 범위로 가로채기에서 제외

IP 주소 범위로 가로채기에서 트래픽을 제외할 수 있습니다.

...
metadata:
  annotations:
    cloud.google.com/excludeOutboundCIDRs: "10.0.0.1/32,169.254.169.254/32"

cloud.google.com/excludeOutboundCIDRs 포드 주석은 CIDR 형식의 쉼표로 구분된 아웃바운드 IP 주소 범위 목록입니다. 이러한 IP 주소 범위로 향하는 이그레스 트래픽은 Envoy 사이드카로 리디렉션되지 않습니다.

애플리케이션이 메타데이터 서버와 통신할 수 있도록 Pod 주석에 169.254.169.254/32를 나열해야 합니다. cloud.google.com/excludeOutboundCIDRs Pod 주석을 지정하지 않으면 트래픽 가로채기가 '169.254.169.254/32' 아웃바운드 CIDR 범위를 제외하도록 구성됩니다.

아웃바운드 IP 주소 범위로 가로채기에 포함

IP 주소 범위별로 가로채기에 트래픽을 포함할 수 있습니다.

...
metadata:
  annotations:
    cloud.google.com/includeOutboundCIDRs: "10.0.0.1/32,169.254.169.254/32"

cloud.google.com/includeOutboundCIDRs 포드 주석은 CIDR 형식의 쉼표로 구분된 아웃바운드 IP 주소 범위 목록입니다. 이러한 IP 주소 범위로 향하는 이그레스 트래픽은 Envoy 사이드카로 리디렉션됩니다.

와일드 카드 문자 *를 사용하여 모든 아웃바운드 트래픽을 리디렉션할 수 있습니다. 목록이 비어 있으면 모든 아웃바운드 트래픽이 사용 중지됩니다. 주석의 기본값은 *입니다.

아웃바운드 포트 번호로 가로채기에서 제외

아웃바운드 포트 번호로 가로채기 및 리디렉션에서 트래픽을 제외할 수 있습니다.

...
metadata:
  annotations:
    cloud.google.com/excludeOutboundPorts: "10001, 10002"

cloud.google.com/excludeOutboundPorts 포드 주석은 쉼표로 구분된 아웃바운드 포트 목록입니다. 이러한 포트를 대상으로 하는 이그레스 트래픽은 가로채기 및 Envoy 사이드카로의 리디렉션에서 제외됩니다.

cloud.google.com/excludeOutboundPorts 주석을 지정하지 않으면 포트로 향하는 아웃바운드 트래픽이 가로채기되고 Envoy 사이드카로 리디렉션됩니다. 이것은 빈(" ") 목록과 함께 cloud.google.com/excludeOutboundPorts 주석을 전달하는 것과 같습니다.

인바운드 포트 번호로 가로채기에 포함

인바운드 포트 번호로 가로채기에 트래픽을 포함할 수 있습니다.

...
metadata:
  annotations:
    cloud.google.com/includeInboundPorts: "10001, 10002"

cloud.google.com/includeInboundPorts 포드 주석은 트래픽이 Envoy 사이드카로 리디렉션될 인바운드 포트의 쉼표로 구분된 목록입니다. 와일드 카드 문자 *를 사용하여 모든 포트에 대한 리디렉션을 구성할 수 있습니다. 값이 비어 있으면 모든 인바운드 리디렉션이 사용 중지됩니다. 기본값은 빈 문자열("")입니다.

인바운드 포트 번호로 가로채기에서 제외

인바운드 포트 번호로 가로채기에서 트래픽을 제외할 수 있습니다.

...
metadata:
  annotations:
    cloud.google.com/excludeInboundPorts: "10001, 10002"

cloud.google.com/excludeInboundPorts 포드 주석은 Envoy 사이드카로의 리디렉션에서 제외할 인바운드 포트의 쉼표로 구분된 목록입니다. 이 주석은 모든 인바운드 트래픽(*)이 리디렉션되는 경우에만 적용됩니다. 기본값은 빈 문자열("")입니다.

관리형 인증서 사용 설정

관리형 워크로드 인증서를 사용 설정할 수 있습니다.

...
metadata:
  annotations:
    cloud.google.com/enableManagedCerts: "true"

포드 주석 cloud.google.com/enableManagedCertstrue로 설정되면 Certificate Authority Service에서 서명한 GKE 관리형 워크로드 인증서가 사이드카 컨테이너에 삽입되고 마운트됩니다. 주석의 값은 기본적으로 false입니다.

사이드카 프록시 메타데이터 구성

추가 Cloud Service Mesh 기능을 지원하기 위해 사이드카 프록시는 캡슐화하는 Pod에서 특정 메타데이터를 상속할 수 있습니다. 여기에는 두 가지 방법이 있습니다. 두 옵션 모두 사이드카 프록시가 Cloud Service Mesh에 연결될 때 메타데이터를 추가하고 Cloud Service Mesh와 메타데이터를 공유합니다. 두 옵션은 상호 배타적입니다.

첫 번째 옵션을 사용하면 개별 메타데이터 키-값 쌍을 지정할 수 있습니다. 예를 들어 Pod 템플릿 사양에 다음 주석을 포함하여 삽입된 사이드카 프록시에 "version": "dev" 라벨을 적용합니다.

...
metadata:
  annotations:
    cloud.google.com/proxyMetadata: '{"version": "dev"}'

두 번째 옵션은 Pod의 모든 라벨을 Pod의 삽입된 사이드카 프록시에 추가합니다.

...
metadata:
  annotations:
    cloud.google.com/forwardPodLabels: "true"

cloud.google.com/forwardPodLabels 주석을 지정하지 않으면 Pod 라벨이 사이드카 프록시에 추가되지 않습니다. cloud.google.com/proxyMetadatacloud.google.com/forwardPodLabels 주석은 상호 배타적입니다. 둘 다 설정하면 cloud.google.com/forwardPodLabels가 우선 적용되며 cloud.google.com/proxyMetadata는 무시됩니다.

그러면 구성 필터링은 Cloud Service Mesh가 이 "version": "dev" 라벨과 일치하는 특정 프록시하고만 구성의 하위 집합을 공유하도록 허용합니다.

이 구성을 적용하려면 기존 배포를 다시 시작해야 합니다.

지원되는 pod 주석

Cloud Service Mesh는 사이드카 삽입을 위해 다음 Pod 주석을 지원합니다. 추가 사이드카 인젝터 주석이 작동할 수는 있지만 다음 목록은 Cloud Service Mesh가 지원하는 주석을 나타냅니다. 장애 또는 불안정성을 방지하려면 프로덕션 배포에서 다른 주석에 대한 종속 항목을 만들지 마세요.

주석 이름 설명
sidecar.istio.io/inject 문자열로 표시되는 불리언입니다. 예를 들면 'true'입니다. Envoy 사이드카를 워크로드에 자동으로 삽입해야 하는지 여부를 지정합니다.
cloud.google.com/proxyMetadata 키-값 쌍의 JSON 맵입니다. 예를 들면 ''{"version": "dev"}''입니다. Envoy 메타데이터에 추가해야 하는 JSON 맵의 키-값 쌍을 지정합니다.
cloud.google.com/forwardPodLabels 'true' 또는 'false' 'true'로 설정하면 모든 Pod 라벨이 Envoy 메타데이터에 추가되고 'cloud.google.com/proxyMetadata' 주석이 무시됩니다. 기본값은 'false'입니다.
cloud.google.com/excludeOutboundPorts 쉼표로 구분된 아웃바운드 포트 목록 이러한 대상 포트 중 하나를 나타내는 이그레스 트래픽은 가로채기/Envoy 사이드카로의 리디렉션에서 제외됩니다. 이 트래픽은 Envoy 프록시를 우회하며 Cloud Service Mesh 구성에 따라 처리되지 않습니다. 기본값은 빈 문자열(즉, "")입니다.
cloud.google.com/includeInboundPorts 쉼표로 구분된 인바운드 포트 목록 트래픽이 Envoy 사이드카로 리디렉션되는 인바운드 포트의 쉼표로 구분된 목록입니다. 와일드 카드 문자 `*` 를 사용하여 모든 포트의 리디렉션을 구성합니다. 값이 비어 있으면 모든 인바운드 리디렉션이 사용 중지됩니다. 기본값은 빈 문자열("")입니다.
cloud.google.com/excludeInboundPorts 쉼표로 구분된 인바운드 포트 목록 트래픽이 Envoy 사이드카로 리디렉션되지 않는 인바운드 포트의 쉼표로 구분된 목록입니다. 이 주석은 모든 인바운드 트래픽 (*)이 리디렉션되는 경우에만 적용됩니다. 기본값은 빈 문자열("")입니다.
cloud.google.com/excludeOutboundCIDRs CIDR 형식의 쉼표로 구분된 아웃바운드 IP 범위 목록입니다. 이러한 대상 IP 중 하나를 나타내는 이그레스 트래픽은 가로채기/Envoy 사이드카로의 리디렉션에서 제외됩니다. 이 트래픽은 Envoy 프록시를 우회하며 Cloud Service Mesh 구성에 따라 처리되지 않습니다. 기본값은 '169.254.169.254/32'이며, 이는 메타데이터 서버와 통신하는 데 필요한 범위입니다. 이 범위는 필수이므로 `excludeOutboundCIDRs` 주석을 지정하는 경우 다른 CIDR 외에 '169.254.169.254/32'도 포함해야 합니다. 쉼표로 구분된 목록에 공백이 없는지 확인하세요.
cloud.google.com/includeOutboundCIDRs CIDR 형식의 쉼표로 구분된 아웃바운드 IP 범위 목록입니다. 이러한 대상 IP 중 하나를 나타내는 이그레스 트래픽은 Envoy 사이드카로의 가로채기/리디렉션에 포함됩니다. 이 트래픽은 Envoy 프록시로 전달되며 Cloud Service Mesh 구성에 따라 처리됩니다. 기본값은 '169.254.169.254/32'이며, 이는 메타데이터 서버와 통신하는 데 필요한 범위입니다. 이 범위는 필수이므로 `includeOutboundCIDRs` 주석을 지정하는 경우 다른 CIDR 외에 '169.254.169.254/32'도 포함해야 합니다. 쉼표로 구분된 목록에 공백이 없는지 확인하세요.
cloud.google.com/enableManagedCerts 문자열로 표시되는 불리언입니다. 예를 들면 'true'입니다. 'true'로 설정하면 Certificate Authority Service에서 서명한 GKE 관리 워크로드 인증서가 사이드카 컨테이너에 삽입되고 마운트됩니다. 기본값은 'false'입니다.

사이드카 인젝터 제거

다음 명령어를 사용하여 사이드카 인젝터를 제거합니다.

kubectl delete -f specs/
kubectl label namespace default istio-injection-