GKE에서 Envoy 사이드카 서비스 메시 설정

이 페이지에서는 GKE에서 Envoy 사이드카 서비스 메시를 설정하는 방법을 설명합니다.

기본 요건

이 가이드에서는 사용자가 다음 요건을 이미 충족한다고 가정합니다.

서비스 설정

  1. 샘플 HTTP 서비스를 만듭니다.

    kubectl apply -f - <<EOF
    kind: Namespace
    apiVersion: v1
    metadata:
      name: sidecar-example
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: whereami
      namespace: sidecar-example
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: whereami
      template:
        metadata:
          labels:
            app: whereami
        spec:
          containers:
          - name: whereami
            image: gcr.io/google-samples/whereami:v1.2.20
            ports:
            - containerPort: 8080
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: whereami
      namespace: sidecar-example
    spec:
      selector:
        app: whereami
      ports:
      - port: 8080
        targetPort: 8080
    EOF
    
  2. 서비스의 기준 HTTPRoute를 만듭니다.

    apiVersion: gateway.networking.k8s.io/v1beta1
    kind: HTTPRoute
    metadata:
      name: whereami-route
      namespace: sidecar-example
    spec:
      parentRefs:
      - name: whereami
        kind: Service
        group: ""
      rules:
      - backendRefs:
        - name: whereami
          port: 8080
    EOF
    

    또한 다음 매니페스트는 샘플 gRPC 서비스를 설명합니다.

    apiVersion: v1
    kind: Service
    metadata:
      name: sample-service
      namespace: sample-ns
      annotations:
        networking.gke.io/app-protocols: '{"50051": "HTTP2"}' # 50051 is backendref.port
    spec:
      ports:
      - port: 50051
        targetPort: 50051
    

클라이언트 설정

  1. 클라이언트를 만듭니다.

    kubectl apply -f - <<EOF
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        run: client
      name: client
      namespace: sidecar-example
    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
    EOF
    
  2. 클라이언트 포드에 Envoy 사이드카 컨테이너가 자동으로 삽입되는지 확인합니다.

    kubectl get pods -n sidecar-example -l run=client
    

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

    NAME                    READY   STATUS    RESTARTS   AGE
    client-xxxx             2/2     Running   0          20s
    

    클라이언트가 준비되고 실행 중 Status가 될 때까지 기다렸다가 계속 진행합니다.

  3. Envoy-사이드카 서비스 메시 설정을 확인합니다. 다음 명령어는 클라이언트에서 whereami 서비스에 요청을 전송합니다.

    CLIENT_POD=$(kubectl get pod -n sidecar-example -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: whereami.sidecar-example.svc.cluster.local' $VIP"
    
    kubectl exec -it $CLIENT_POD -n sidecar-example -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: whereami
    < 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": "${CLUSTER_NAME}",
      "location": "${LOCATION}",
      "host_header": "whereami",
      ...
    }