Envoy 사이드카 서비스 메시 설정
이 구성은 미리보기 고객에게 지원되지만 신규 Cloud Service Mesh 사용자에게는 권장하지 않습니다. 자세한 내용은 Cloud Service Mesh 개요를 참조하세요.
이 가이드에서는 Fleet에 단순 서비스 메시를 구성하는 방법을 보여줍니다. 이 가이드에는 다음 단계가 포함됩니다.
- Envoy 사이드카 인젝터를 클러스터에 배포합니다. 인젝터는 Envoy 프록시 컨테이너를 애플리케이션 포드에 삽입합니다.
- 네임스페이스
store
의 예시 서비스로 요청을 라우팅하도록 서비스 메시에서 Envoy 사이드카를 구성하는 게이트웨이 API 리소스를 배포합니다. - 간단한 클라이언트를 배포하여 배포를 확인합니다.
다음 다이어그램은 구성된 서비스 메시를 보여줍니다.
사이드카 인젝터 구성의 메시 이름과 Mesh
리소스 이름이 동일해야 하기 때문에 클러스터에 Mesh
를 하나만 구성할 수 있습니다.
Envoy 사이드카 인젝터 배포
사이드카 인젝터를 배포하려면 두 값을 제공해야 합니다.
TRAFFICDIRECTOR_GCP_PROJECT_NUMBER
.PROJECT_NUMBER
를 구성 클러스터에 대한 프로젝트의 프로젝트 번호로 바꿉니다. 프로젝트 번호는 프로젝트의 숫자 식별자입니다.TRAFFICDIRECTOR_MESH_NAME
입니다. 다음과 같이 값을 할당하고, 여기서MESH_NAME
은Mesh
리소스 사양의metadata.name
필드 값입니다.gketd-MESH_NAME
예를 들어
Mesh
리소스의metadata.name
값이butterfly-mesh
면TRAFFICDIRECTOR_MESH_NAME
값을 다음과 같이 설정합니다.TRAFFICDIRECTOR_MESH_NAME: "gketd-butterfly-mesh"
TRAFFICDIRECTOR_NETWORK_NAME
입니다.TRAFFICDIRECTOR_NETWORK_NAME
값이 빈 값으로 설정되었는지 확인합니다.TRAFFICDIRECTOR_NETWORK_NAME=""
사이드카 인젝터 패키지를 다운로드합니다.
wget https://storage.googleapis.com/traffic-director/td-sidecar-injector-xdsv3.tgz tar -xzvf td-sidecar-injector-xdsv3.tgz cd td-sidecar-injector-xdsv3
specs/01-configmap.yaml
파일에서TRAFFICDIRECTOR_GCP_PROJECT_NUMBER
및TRAFFICDIRECTOR_MESH_NAME
필드를 입력하고TRAFFICDIRECTOR_NETWORK_NAME
을 빈 값으로 설정합니다.apiVersion: v1 kind: ConfigMap metadata: name: istio namespace: istio-system data: mesh: |- defaultConfig: discoveryAddress: trafficdirector.googleapis.com:443 # Envoy proxy port to listen on for the admin interface. # This port is bound to 127.0.0.1. proxyAdminPort: 15000 proxyMetadata: # Google Cloud Project number that your Fleet belongs to. # This is the numeric identifier of your project TRAFFICDIRECTOR_GCP_PROJECT_NUMBER: "PROJECT_NUMBER" # TRAFFICDIRECTOR_NETWORK_NAME must be empty when # TRAFFICDIRECTOR_MESH_NAME is set. TRAFFICDIRECTOR_NETWORK_NAME: "NETWORK_NAME" # The value of `metadata.name` in the `Mesh` resource. When a # sidecar requests configurations from Cloud Service Mesh, # Cloud Service Mesh will only return configurations for the # specified mesh. TRAFFICDIRECTOR_MESH_NAME: "gketd-td-mesh"
이전 안내를 완료한 후 다음 단계에 따라 사이드카 인젝터를 클러스터에 배포합니다.
store
서비스 배포
이 섹션에서는 메시에 store
서비스를 배포합니다.
store.yaml
파일에 다음 매니페스트를 저장합니다.kind: Namespace apiVersion: v1 metadata: name: store --- apiVersion: apps/v1 kind: Deployment metadata: name: store namespace: store spec: replicas: 2 selector: matchLabels: app: store version: v1 template: metadata: labels: app: store version: v1 spec: containers: - name: whereami image: gcr.io/google-samples/whereami:v1.2.20 ports: - containerPort: 8080 --- apiVersion: v1 kind: Service metadata: name: store namespace: store spec: selector: app: store ports: - port: 8080 targetPort: 8080
gke-1
에 매니페스트를 적용합니다.kubectl apply -f store.yaml
서비스 메시 만들기
mesh.yaml
파일에 다음mesh
매니페스트를 저장합니다.mesh
리소스 이름은 인젝터 configmap에 지정된 메시 이름과 일치해야 합니다. 이 구성 예시에서td-mesh
이름은 두 위치 모두 사용됩니다.apiVersion: net.gke.io/v1alpha1 kind: TDMesh metadata: name: td-mesh namespace: default spec: gatewayClassName: gke-td allowedRoutes: namespaces: from: All
mesh
매니페스트를gke-1
에 적용하고 이름이td-mesh
인 논리적 메시를 만듭니다.kubectl apply -f mesh.yaml
store-route.yaml
파일에 다음HTTPRoute
매니페스트를 저장합니다. 이 매니페스트는example.com
호스트 이름을 지정하는 HTTP 트래픽을store
네임스페이스의 Kubernetes 서비스store
에 라우팅하는HTTPRoute
리소스를 정의합니다.apiVersion: gateway.networking.k8s.io/v1alpha2 kind: HTTPRoute metadata: name: store-route namespace: store spec: parentRefs: - name: td-mesh namespace: default group: net.gke.io kind: TDMesh hostnames: - "example.com" rules: - backendRefs: - name: store namespace: store port: 8080
경로 매니페스트를
gke-1
에 적용합니다.kubectl apply -f store-route.yaml
배포 검증
Mesh
상태 및 이벤트를 조사하여Mesh
및HTTPRoute
리소스가 성공적으로 배포되었는지 확인합니다.kubectl describe tdmesh td-mesh
출력은 다음과 비슷합니다.
... Status: Conditions: Last Transition Time: 2022-04-14T22:08:39Z Message: Reason: MeshReady Status: True Type: Ready Last Transition Time: 2022-04-14T22:08:28Z Message: Reason: Scheduled Status: True Type: Scheduled Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal ADD 36s mc-mesh-controller Processing mesh default/td-mesh Normal UPDATE 35s mc-mesh-controller Processing mesh default/td-mesh Normal SYNC 24s mc-mesh-controller SYNC on default/td-mesh was a success
사이드카 삽입이 기본 네임스페이스에 사용 설정되었는지 확인하기 위해 다음 명령어를 실행합니다.
kubectl get namespace default --show-labels
사이드카 삽입이 사용 설정되었으면 출력에 다음이 표시됩니다.
istio-injection=enabled
사이드카 삽입이 사용 설정되지 않았으면 사이드카 삽입 사용 설정을 참조하세요.
배포를 확인하려면 클라이언트로 작동하는 클라이언트 포드를 이전에 정의된
store
서비스에 배포합니다.client.yaml
파일에 다음을 저장합니다.apiVersion: apps/v1 kind: Deployment metadata: labels: run: client name: client namespace: default spec: replicas: 1 selector: matchLabels: run: client template: metadata: labels: run: client spec: containers: - name: client image: curlimages/curl command: - sh - -c - while true; do sleep 1; done
사양을 배포합니다.
kubectl apply -f client.yaml
클러스터에서 실행되는 사이드카 인젝터가 자동으로 Envoy 컨테이너를 클라이언트 포드에 삽입합니다.
Envoy 컨테이너가 삽입되었는지 확인하려면 다음 명령어를 실행합니다.
kubectl describe pods -l run=client
출력은 다음과 비슷합니다.
... Init Containers: # Istio-init sets up traffic interception for the Pod. istio-init: ... # td-bootstrap-writer generates the Envoy bootstrap file for the Envoy container td-bootstrap-writer: ... Containers: # client is the client container that runs application code. client: ... # Envoy is the container that runs the injected Envoy proxy. envoy: ...
클라이언트 포드가 프로비저닝되면 클라이언트 포드에서 store
서비스로 요청을 전송합니다.
클라이언트 포드의 이름을 가져옵니다.
CLIENT_POD=$(kubectl get pod -l run=client -o=jsonpath='{.items[0].metadata.name}') # The VIP where the following request will be sent. Because all requests # from the client container are redirected to the Envoy proxy sidecar, you # can use any IP address, including 10.0.0.2, 192.168.0.1, and others. VIP='10.0.0.1'
서비스 저장 요청을 전송하고 응답 헤더를 출력합니다.
TEST_CMD="curl -v -H 'host: example.com' $VIP"
클라이언트 컨테이너에서 테스트 명령어를 실행합니다.
kubectl exec -it $CLIENT_POD -c client -- /bin/sh -c "$TEST_CMD"
출력은 다음과 비슷합니다.
< Trying 10.0.0.1:80... < Connected to 10.0.0.1 (10.0.0.1) port 80 (#0) < GET / HTTP/1.1 < Host: example.com < User-Agent: curl/7.82.0-DEV < Accept: */* < < Mark bundle as not supporting multiuse < HTTP/1.1 200 OK < content-type: application/json < content-length: 318 < access-control-allow-origin: * < server: envoy < date: Tue, 12 Apr 2022 22:30:13 GMT < { "cluster_name": "gke-1", "zone": "us-west1-a", "host_header": "example.com", ... }