ํ”„๋ก์‹œ ๋กœ๊ทธ ์š”์ฒญ

Cloud Service Mesh๋Š” Cloud Logging์—์„œ ํŠธ๋ž˜ํ”ฝ ๋กœ๊ทธ(Google Cloud Observability ์•ก์„ธ์Šค ๋กœ๊ทธ๋ผ๊ณ ๋„ ํ•จ) ๋ฐ Envoy ์•ก์„ธ์Šค ๋กœ๊ทธ ๋“ฑ ๋‘ ๊ฐ€์ง€ ์œ ํ˜•์˜ ์•ก์„ธ์Šค ๋กœ๊ทธ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ด ํŽ˜์ด์ง€์—์„œ๋Š” ์ด๋Ÿฌํ•œ ๋กœ๊ทธ๋ฅผ ์‚ฌ์šฉ ์„ค์ •, ์ค‘์ง€, ๋ณด๊ธฐ, ํ•ด์„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ํŠธ๋ž˜ํ”ฝ ๋กœ๊ทธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉ ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์•ก์„ธ์Šค ๋กœ๊ทธ ์‚ฌ์šฉ ์„ค์ • ๋ฐ ์ค‘์ง€

๊ด€๋ฆฌํ˜• Cloud Service Mesh

Envoy ์•ก์„ธ์Šค ๋กœ๊ทธ

๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ Envoy ์•ก์„ธ์Šค ๋กœ๊ทธ๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•˜๊ณ  ํŠธ๋ž˜ํ”ฝ ๋กœ๊ทธ๋ฅผ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค.

cat <<EOF | kubectl apply -n istio-system -f -
apiVersion: telemetry.istio.io/v1alpha1
kind: Telemetry
metadata:
  name: enable-envoy-disable-sd
  namespace: istio-system
spec:
  accessLogging:
  - providers:
      - name: envoy
  - providers:
      - name: stackdriver
    disabled: true
EOF

ํŠธ๋ž˜ํ”ฝ ๋กœ๊ทธ ์ œ๊ณต์ž ์ด๋ฆ„์€ stackdriver์ž…๋‹ˆ๋‹ค.

ํŠธ๋ž˜ํ”ฝ ๋กœ๊ทธ

๊ธฐ๋ณธ์ ์œผ๋กœ ํŠธ๋ž˜ํ”ฝ ๋กœ๊ทธ๋Š” ์‚ฌ์šฉ ์„ค์ •๋˜๊ณ  Envoy ์•ก์„ธ์Šค ๋กœ๊ทธ๋Š” ์ค‘์ง€๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ „์— Envoy ์•ก์„ธ์Šค ๋กœ๊ทธ๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ–ˆ๊ณ  ํŠธ๋ž˜ํ”ฝ ๋กœ๊ทธ๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•˜๊ณ  Envoy ์•ก์„ธ์Šค ๋กœ๊ทธ๋ฅผ ์ค‘์ง€ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

cat <<EOF | kubectl apply -n istio-system -f -
apiVersion: telemetry.istio.io/v1alpha1
kind: Telemetry
metadata:
  name: disable-envoy-enable-sd
  namespace: istio-system
spec:
  accessLogging:
  - providers:
      - name: envoy
    disabled: true
  - providers:
      - name: stackdriver
EOF

๋‘˜ ๋‹ค

  • Envoy ์•ก์„ธ์Šค ๋กœ๊ทธ์™€ ํŠธ๋ž˜ํ”ฝ ๋กœ๊ทธ ๋ชจ๋‘ ์‚ฌ์šฉ ์„ค์ •ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    cat <<EOF | kubectl apply -n istio-system -f -
    apiVersion: telemetry.istio.io/v1alpha1
    kind: Telemetry
    metadata:
      name: enable-envoy-and-sd-access-log
      namespace: istio-system
    spec:
      accessLogging:
      - providers:
          - name: envoy
          - name: stackdriver
    EOF
    
  • Envoy ์•ก์„ธ์Šค ๋กœ๊ทธ์™€ ํŠธ๋ž˜ํ”ฝ ๋กœ๊ทธ ๋ชจ๋‘ ์ค‘์ง€ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    cat <<EOF | kubectl apply -n istio-system -f -
    apiVersion: telemetry.istio.io/v1alpha1
    kind: Telemetry
    metadata:
      name: disable-envoy-and-sd
      namespace: istio-system
    spec:
      accessLogging:
      - providers:
          - name: envoy
        disabled: true
      - providers:
          - name: stackdriver
        disabled: true
    EOF
    

๊ด€๋ฆฌํ˜• istiod

Envoy ์•ก์„ธ์Šค ๋กœ๊ทธ

๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ Envoy ์•ก์„ธ์Šค ๋กœ๊น…์„ ์‚ฌ์šฉ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  1. ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ accessLogFile: /dev/stdout์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    cat <<EOF | kubectl apply -f -
    apiVersion: v1
    data:
      mesh: |-
        accessLogFile: /dev/stdout
    kind: ConfigMap
    metadata:
      name: istio-release-channel
      namespace: istio-system
    EOF
    

    ์—ฌ๊ธฐ์„œ release-channel์€ ์ถœ์‹œ ์ฑ„๋„์ž…๋‹ˆ๋‹ค(asm-managed, asm-managed-stable, asm-managed-rapid).

  2. ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๊ตฌ์„ฑ ๋งต์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

     kubectl get configmap istio-release-channel -n istio-system -o yaml
    
  3. ์•ก์„ธ์Šค ๋กœ๊น…์ด ์‚ฌ์šฉ ์„ค์ •๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด accessLogFile: /dev/stdout ์ค„์ด mesh: ์„น์…˜์— ํ‘œ์‹œ๋˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    ...
    apiVersion: v1
    data:
      mesh: |
        ....
        accessLogFile: /dev/stdout
    ...
    

ํŠธ๋ž˜ํ”ฝ ๋กœ๊ทธ

ํŠธ๋ž˜ํ”ฝ ๋กœ๊ทธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉ ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด

Envoy ์•ก์„ธ์Šค ๋กœ๊ทธ

---
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
  meshConfig:
    accessLogFile: "/dev/stdout"

์ž์„ธํ•œ ๋‚ด์šฉ์€ Envoy์˜ ์•ก์„ธ์Šค ๋กœ๊น… ์‚ฌ์šฉ ์„ค์ •์„ ์ฐธ์กฐํ•˜์„ธ์š”.

ํŠธ๋ž˜ํ”ฝ ๋กœ๊ทธ

Cloud Service Mesh๊ฐ€ Istio CA๊ฐ€ ํฌํ•จ๋œ Google Distributed Cloud(์ด์ „์˜ Citadel)์— ์„ค์น˜๋œ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ฉด ํŠธ๋ž˜ํ”ฝ ๋กœ๊ทธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉ ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด Cloud Service Mesh๋ฅผ ์„ค์น˜ํ•  ๋•Œ Istio CA๊ฐ€ ํฌํ•จ๋œ Google Distributed Cloud์—์„œ ํŠธ๋ž˜ํ”ฝ ๋กœ๊ทธ๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•˜๋ ค๋ฉด --option stackdriver ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋˜๋Š” ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด Cloud Service Mesh๋ฅผ ์„ค์น˜ํ•œ ํ›„ Istio CA๊ฐ€ ํฌํ•จ๋œ Google Distributed Cloud์—์„œ ํŠธ๋ž˜ํ”ฝ ๋กœ๊ทธ๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ก์„ธ์Šค ๋กœ๊ทธ ๋ณด๊ธฐ

Envoy ์•ก์„ธ์Šค ๋กœ๊ทธ

๋ช…๋ น์ค„

istio-proxy ๋กœ๊ทธ์—์„œ Envoy ์•ก์„ธ์Šค ๋กœ๊ทธ๋ฅผ ๋ณด๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

kubectl logs POD_NAME -n NAMESPACE_NAME -c istio-proxy

๋กœ๊ทธ ํƒ์ƒ‰๊ธฐ

๋กœ๊ทธ ํƒ์ƒ‰๊ธฐ์—์„œ Envoy ์•ก์„ธ์Šค ๋กœ๊ทธ๋ฅผ ๋ณด๋ ค๋ฉด ๋‹ค์Œ ์•ˆ๋‚ด๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.

  1. ๋กœ๊ทธ ํƒ์ƒ‰๊ธฐ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

    ๋กœ๊ทธ ํƒ์ƒ‰๊ธฐ๋กœ ์ด๋™

  2. ์ ํ•ฉํ•œ Google Cloud ํ”„๋กœ์ ํŠธ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

  3. ๋‹ค์Œ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

resource.type="k8s_container" \
resource.labels.container_name="istio-proxy"
resource.labels.cluster_name="CLUSTER_NAME" \
resource.labels.namespace_name="NAMESPACE_NAME" \
resource.labels.pod_name="POD_NAME"

ํŠธ๋ž˜ํ”ฝ ๋กœ๊ทธ

๋กœ๊ทธ ํƒ์ƒ‰๊ธฐ์—์„œ ํŠธ๋ž˜ํ”ฝ ๋กœ๊ทธ๋ฅผ ๋ณด๋ ค๋ฉด ๋‹ค์Œ ์•ˆ๋‚ด๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.

  1. ๋กœ๊ทธ ํƒ์ƒ‰๊ธฐ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

    ๋กœ๊ทธ ํƒ์ƒ‰๊ธฐ๋กœ ์ด๋™

  2. ์ ํ•ฉํ•œ Google Cloud ํ”„๋กœ์ ํŠธ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

  3. ํ˜„์žฌ ๋ณด๊ณ  ์žˆ๋Š” ๋กœ๊ทธ๊ฐ€ ํด๋ผ์ด์–ธํŠธ ๋˜๋Š” ์„œ๋ฒ„ ์•ก์„ธ์Šค ๋กœ๊ทธ์ธ์ง€์— ๋”ฐ๋ผ ๋‹ค์Œ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    ์„œ๋ฒ„ ๋กœ๊ทธ

    resource.labels.cluster_name="CLUSTER_NAME" logName="projects/PROJECT_NAME/logs/server-accesslog-stackdriver"
    

    ํด๋ผ์ด์–ธํŠธ ๋กœ๊ทธ

    resource.labels.cluster_name="CLUSTER_NAME" logName="projects/PROJECT_NAME/logs/client-accesslog-stackdriver"
    

์ง€์ •๋œ ๊ธฐ๊ฐ„ ๋™์•ˆ ์„œ๋น„์Šค์˜ Cloud Service Mesh ํŽ˜์ด์ง€์—์„œ ํŠธ๋ž˜ํ”ฝ ๋กœ๊ทธ๋ฅผ ๋ณด๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. Google Cloud ์ฝ˜์†”์—์„œ Cloud Service Mesh ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

    Cloud Service Mesh ํŽ˜์ด์ง€๋กœ ์ด๋™

  2. ์„œ๋น„์Šค์—์„œ ๊ฒ€์‚ฌํ•˜๋ ค๋Š” ์„œ๋น„์Šค์˜ ์ด๋ฆ„์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

  3. ์ธก์ •ํ•ญ๋ชฉ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

  4. ์‹œ๊ฐ„ ๋ฒ”์œ„ ๋“œ๋กญ๋‹ค์šด ๋ฉ”๋‰ด์—์„œ ๊ธฐ๊ฐ„์„ ์ง€์ •ํ•˜๊ฑฐ๋‚˜ ํƒ€์ž„๋ผ์ธ์œผ๋กœ ์ปค์Šคํ…€ ์ŠคํŒฌ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  5. ํ•„ํ„ฐ ์˜ต์…˜ ์„ ํƒ์—์„œ ํŠธ๋ž˜ํ”ฝ ๋กœ๊ทธ ๋ณด๊ธฐ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

ํŠธ๋ž˜ํ”ฝ ๋กœ๊ทธ ์ด๋ฆ„์€ server-accesslog-stackdriver์ด๊ณ  ํŠธ๋ž˜ํ”ฝ ๋กœ๊ทธ๋Š” ์„œ๋น„์Šค์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํ•ด๋‹น ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฆฌ์†Œ์Šค(k8s_container ๋˜๋Š” gce_instance)์— ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ํŠธ๋ž˜ํ”ฝ ๋กœ๊ทธ์—๋Š” ๋‹ค์Œ ์ •๋ณด๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

  • ID, URL, ํฌ๊ธฐ, ์ง€์—ฐ ์‹œ๊ฐ„, ๊ณตํ†ต ํ—ค๋” ๋“ฑ HTTP ์š”์ฒญ ์†์„ฑ

  • ์ด๋ฆ„, ๋„ค์ž„์ŠคํŽ˜์ด์Šค, ID, ์ผ๋ฐ˜ ๋ผ๋ฒจ๊ณผ ๊ฐ™์€ ์†Œ์Šค ๋ฐ ๋Œ€์ƒ ์›Œํฌ๋กœ๋“œ ์ •๋ณด

  • ์ถ”์ ์ด ์‚ฌ์šฉ ์„ค์ •๋œ ๊ฒฝ์šฐ ์ƒ˜ํ”Œ๋ง, ์ถ”์  ID, ์ŠคํŒฌ ID์™€ ๊ฐ™์€ ์ถ”์  ์ •๋ณด

๋กœ๊ทธ ํ•ญ๋ชฉ์˜ ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

{
  insertId: "1awb4hug5pos2qi"
  httpRequest: {
    requestMethod: "GET"
    requestUrl: "YOUR-INGRESS/productpage"
    requestSize: "952"
    status: 200
    responseSize: "5875"
    remoteIp: "10.8.0.44:0"
    serverIp: "10.56.4.25:9080"
    latency: "1.587232023s"
    protocol: "http"
  }
  resource: {
    type: "k8s_container"
    labels: {
      location: "us-central1-a"
      project_id: "YOUR-PROJECT"
      pod_name: "productpage-v1-76589d9fdc-ptnt9"
      cluster_name: "YOUR-CLUSTER-NAME"
      container_name: "productpage"
      namespace_name: "default"
    }
  }
  timestamp: "2020-04-28T19:55:21.056759Z"
  severity: "INFO"
  labels: {
    destination_principal: "spiffe://cluster.local/ns/default/sa/bookinfo-productpage"
    response_flag: "-"
    destination_service_host: "productpage.default.svc.cluster.local"
    source_app: "istio-ingressgateway"
    service_authentication_policy: "MUTUAL_TLS"
    source_name: "istio-ingressgateway-5ff85d8dd8-mwplb"
    mesh_uid: "YOUR-MESH-UID"
    request_id: "021ce752-9001-4ac6-b6d6-3b15f5d3632"
    destination_namespace: "default"
    source_principal:  "spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account"
    destination_workload: "productpage-v1"
    destination_version: "v1"
    source_namespace: "istio-system"
    source_workload: "istio-ingressgateway"
    destination_name: "productpage-v1-76589d9fdc-ptnt9"
    destination_app: "productpage"
  }
  trace: "projects/YOUR-PROJECT/traces/d4197f59b7a43e3aeff3571bac99d536"
  receiveTimestamp: "2020-04-29T03:07:14.362416217Z"
  spanId: "43226343ca2bb2b1"
  traceSampled: true
  logName: "projects/YOUR-PROJECT/logs/server-accesslog-stackdriver"
  receiveTimestamp: "2020-04-28T19:55:32.185229100Z"
}

Cloud Service Mesh ์›๊ฒฉ ๋ถ„์„ ํ•ด์„

๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ๋ฉ”์‹œ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๊ณ  ๋ฌธ์ œ ํ•ด๊ฒฐ์— ๋„์›€์ด ๋˜๋Š” ์œ ์šฉํ•œ ์„ธ๋ถ€์ •๋ณด๊ฐ€ ํฌํ•จ๋œ ๋‹ค์–‘ํ•œ ์›๊ฒฉ ๋ถ„์„์„ ๊ฒ€ํ† ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์ œ์–ด ์˜์—ญ ์ธก์ •ํ•ญ๋ชฉ ํ•ด์„

๊ด€๋ฆฌํ˜• Cloud Service Mesh

๊ด€๋ฆฌํ˜• Cloud Service Mesh ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์„ ์‚ฌ์šฉํ•˜๋Š” Cloud Service Mesh์—์„œ๋Š” ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ์ธก์ •ํ•ญ๋ชฉ์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ด€๋ฆฌํ˜• istiod

๊ด€๋ฆฌํ˜• istiod ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์„ ์‚ฌ์šฉํ•˜๋Š” Cloud Service Mesh์—์„œ๋Š” ์ด ์„น์…˜์˜ ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ์ธก์ •ํ•ญ๋ชฉ์„ ๊ฒ€์‚ฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด

ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์œผ๋กœ Cloud Service Mesh๋ฅผ ์„ค์น˜ํ•  ๋•Œ istiod๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋งํ•  ์ˆ˜ ์žˆ๋„๋ก ์ธก์ •ํ•ญ๋ชฉ์„ Google Cloud Observability๋กœ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค. istiod๋Š” ์ด๋Ÿฌํ•œ ์ธก์ •ํ•ญ๋ชฉ์— istio.io/control๋กœ ํ”„๋ฆฌํ”ฝ์Šค๋ฅผ ์ง€์ •ํ•˜๊ณ  ๊ฐ ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ์ธ์Šคํ„ด์Šค์— ์—ฐ๊ฒฐ๋œ ํ”„๋ก์‹œ ์ˆ˜, ๊ตฌ์„ฑ ์ด๋ฒคํŠธ, ํ‘ธ์‹œ, ๊ฒ€์‚ฌ์™€ ๊ฐ™์€ ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ์ƒํƒœ์— ๋Œ€ํ•œ ์œ ์šฉํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ๋‹จ๊ณ„์— ๋”ฐ๋ผ ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์„ ๊ด€์ฐฐํ•˜๊ฑฐ๋‚˜ ๋ฌธ์ œ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

  1. ์ƒ˜ํ”Œ ๋Œ€์‹œ๋ณด๋“œ ๋กœ๋“œ:

    git clone https://github.com/GoogleCloudPlatform/monitoring-dashboard-samples && cd monitoring-dashboard-samples/dashboards && git checkout servicemesh
  2. Cloud Service Mesh ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

    gcloud monitoring dashboards create --config-from-file=dashboards/servicemesh/anthos-service-mesh-control-plane-monitoring.json
  3. ๋ชฉ๋ก์—์„œ Istio Control Plane Dashboard๋ผ๋Š” ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์„ค์น˜๋œ ๋Œ€์‹œ๋ณด๋“œ ๋ณด๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ „์ฒด ์ธก์ •ํ•ญ๋ชฉ ๋ชฉ๋ก์€ ๋‚ด๋ณด๋‚ธ ์ธก์ •ํ•ญ๋ชฉ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

๊ตฌ์„ฑ ์ง€์—ฐ ์ง„๋‹จ

๊ด€๋ฆฌํ˜• Cloud Service Mesh

๊ด€๋ฆฌํ˜• Cloud Service Mesh ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์„ ์‚ฌ์šฉํ•˜๋Š” Cloud Service Mesh์—์„œ๋Š” ๊ตฌ์„ฑ ์ง€์—ฐ์„ ์ง„๋‹จํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ด€๋ฆฌํ˜• istiod

๊ด€๋ฆฌํ˜• istiod ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์„ ์‚ฌ์šฉํ•˜๋Š” Cloud Service Mesh์—์„œ๋Š” ๊ตฌ์„ฑ ์ง€์—ฐ์„ ์ง„๋‹จํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด

๋‹ค์Œ ๋‹จ๊ณ„์—์„œ๋Š” pilot_proxy_convergence_time ์ธก์ • ํ•ญ๋ชฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์„ฑ ๋ณ€๊ฒฝ๊ณผ ๋ชจ๋“  ํ”„๋ก์‹œ ์ˆ˜๋ ด ์‚ฌ์ด์˜ ์ง€์—ฐ์„ ์ง„๋‹จํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

  1. ํฌ๋“œ์—์„œ ์…ธ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    kubectl debug --image istio/base --target istio-proxy -it $(kubectl get pod -l app=pilot -o jsonpath='{.items[0].metadata.name}' -n istio-system) -n istio-system -- curl -s
  2. ์ธก์ •ํ•ญ๋ชฉ์—์„œ convergence์˜ localhost:15014 ๋ฐ grep์— ์•ก์„ธ์Šคํ•ฉ๋‹ˆ๋‹ค.

    curl http://localhost:15014/metrics | grep convergence

ํŠธ๋ž˜ํ”ฝ ๋กœ๊ทธ ํ•ด์„

๋‹ค์Œ ์ •๋ณด์—์„œ๋Š” ํŠธ๋ž˜ํ”ฝ ๋กœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฐ๊ฒฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ํŠธ๋ž˜ํ”ฝ ๋กœ๊ทธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉ ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

Cloud Service Mesh๋Š” ๋‹ค์Œ ์œ ํ˜•์˜ ๋ฌธ์ œ๋ฅผ ๋””๋ฒ„๊น…ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํŠธ๋ž˜ํ”ฝ ๋กœ๊ทธ๋กœ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค.

  • ํŠธ๋ž˜ํ”ฝ ํ๋ฆ„ ๋ฐ ์žฅ์• 
  • ์—”๋“œ ํˆฌ ์—”๋“œ ์š”์ฒญ ๋ผ์šฐํŒ…

ํŠธ๋ž˜ํ”ฝ ๋กœ๊ทธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ Google Kubernetes Engine์˜ Cloud Service Mesh ์„ค์น˜์— ์‚ฌ์šฉ ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. asmcli install์„ ๋‹ค์‹œ ์‹คํ–‰ํ•˜์—ฌ ํŠธ๋ž˜ํ”ฝ ๋กœ๊ทธ๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์›๋ž˜ ์„ค์น˜ํ•œ ์˜ต์…˜๊ณผ ๋™์ผํ•œ ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋˜, Stackdriver๋ฅผ ์‚ฌ์šฉ ์ค‘์ง€ํ•œ ์ปค์Šคํ…€ ์˜ค๋ฒ„๋ ˆ์ด๋ฅผ ์ƒ๋žตํ•ฉ๋‹ˆ๋‹ค.

ํŠธ๋ž˜ํ”ฝ ๋กœ๊ทธ์—๋Š” ๋‘ ๊ฐ€์ง€ ์œ ํ˜•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์„œ๋ฒ„ ์•ก์„ธ์Šค ๋กœ๊ทธ๋Š” ์„œ๋ฒ„ ์ธก ์š”์ฒญ ๋ณด๊ธฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋กœ๊ทธ๋Š” k8s_container ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฆฌ์†Œ์Šค์— ์—ฐ๊ฒฐ๋˜์–ด server-accesslog-stackdriver ์•„๋ž˜์— ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ URL ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ฒ„ ์ธก ์•ก์„ธ์Šค ๋กœ๊ทธ๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

    https://console.cloud.google.com/logs/viewer?advancedFilter=logName="projects/PROJECT_ID/logs/server-accesslog-stackdriver"&project=PROJECT_ID
  • ํด๋ผ์ด์–ธํŠธ ์•ก์„ธ์Šค ๋กœ๊ทธ๋Š” ํด๋ผ์ด์–ธํŠธ ์ธก ์š”์ฒญ ๋ณด๊ธฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋กœ๊ทธ๋Š” k8s_pod ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฆฌ์†Œ์Šค์— ์—ฐ๊ฒฐ๋˜์–ด client-accesslog-stackdriver ์•„๋ž˜์— ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ URL ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ ์ธก ์•ก์„ธ์Šค ๋กœ๊ทธ๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

    https://console.cloud.google.com/logs/viewer?advancedFilter=logName="projects/PROJECT_ID/logs/client-accesslog-stackdriver"&project=PROJECT_ID

์•ก์„ธ์Šค ๋กœ๊ทธ์—๋Š” ๋‹ค์Œ ์ •๋ณด๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

  • ID, URL, ํฌ๊ธฐ, ์ง€์—ฐ ์‹œ๊ฐ„, ๊ณตํ†ต ํ—ค๋” ๋“ฑ HTTP ์š”์ฒญ ์†์„ฑ
  • ์ด๋ฆ„, ๋„ค์ž„์ŠคํŽ˜์ด์Šค, ID, ์ผ๋ฐ˜ ๋ผ๋ฒจ๊ณผ ๊ฐ™์€ ์†Œ์Šค ๋ฐ ๋Œ€์ƒ ์›Œํฌ๋กœ๋“œ ์ •๋ณด
  • ์†Œ์Šค ๋ฐ ๋Œ€์ƒ ํ‘œ์ค€ ์„œ๋น„์Šค์™€ ๋ฒ„์ „ ์ •๋ณด
  • ์ถ”์ ์ด ์‚ฌ์šฉ ์„ค์ •๋œ ๊ฒฝ์šฐ ์ƒ˜ํ”Œ๋ง, trace ID, ์ŠคํŒฌ ID์™€ ๊ฐ™์€ trace ์ •๋ณด๊ฐ€ ํฌํ•จ๋œ ๋กœ๊ทธ

ํŠธ๋ž˜ํ”ฝ ๋กœ๊ทธ์—๋Š” ๋‹ค์Œ ๋ผ๋ฒจ์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • route_name
  • upstream_cluster
  • X-Envoy-Original-Path

๋‹ค์Œ์€ ์˜ˆ์‹œ ๋กœ๊ทธ ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค.

{
  "insertId": "1j84zg8g68vb62z",
  "httpRequest": {
    "requestMethod": "GET",
    "requestUrl": "http://35.235.89.201:80/productpage",
    "requestSize": "795",
    "status": 200,
    "responseSize": "7005",
    "remoteIp": "10.168.0.26:0",
    "serverIp": "10.36.3.153:9080",
    "latency": "0.229384205s",
    "protocol": "http"
  },
  "resource": {
    "type": "k8s_container",
    "labels": {
      "cluster_name": "istio-e2e22",
      "namespace_name": "istio-bookinfo-1-68819",
      "container_name": "productpage",
      "project_id": "***",
      "location": "us-west2-a",
      "pod_name": "productpage-v1-64794f5db4-8xbtf"
    }
  },
  "timestamp": "2020-08-13T21:37:42.963881Z",
  "severity": "INFO",
  "labels": {
    "protocol": "http",
    "upstream_host": "127.0.0.1:9080",
    "source_canonical_service": "istio-ingressgateway",
    "source_namespace": "istio-system",
    "x-envoy-original-path": "",
    "source_canonical_revision": "latest",
    "connection_id": "32",
    "upstream_cluster": "inbound|9080|http|productpage.istio-bookinfo-1-68819.svc.cluster.local",
    "requested_server_name": "outbound_.9080_._.productpage.istio-bookinfo-1-68819.svc.cluster.local",
    "destination_version": "v1",
    "destination_workload": "productpage-v1",
    "source_workload": "istio-ingressgateway",
    "destination_canonical_revision": "v1",
    "mesh_uid": "cluster.local",
    "source_principal": "spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",
    "x-envoy-original-dst-host": "",
    "service_authentication_policy": "MUTUAL_TLS",
    "destination_principal": "spiffe://cluster.local/ns/istio-bookinfo-1-68819/sa/bookinfo-productpage",
    "response_flag": "-",
    "log_sampled": "false",
    "destination_service_host": "productpage.istio-bookinfo-1-68819.svc.cluster.local",
    "destination_name": "productpage-v1-64794f5db4-8xbtf",
    "destination_canonical_service": "productpage",
    "destination_namespace": "istio-bookinfo-1-68819",
    "source_name": "istio-ingressgateway-6845f6d664-lnfvp",
    "source_app": "istio-ingressgateway",
    "destination_app": "productpage",
    "request_id": "39013650-4e62-9be2-9d25-78682dd27ea4",
    "route_name": "default"
  },
  "logName": "projects/***/logs/server-accesslog-stackdriver",
  "trace": "projects/***t/traces/466d77d15753cb4d7749ba5413b5f70f",
  "receiveTimestamp": "2020-08-13T21:37:48.758673203Z",
  "spanId": "633831cb1fda4fd5",
  "traceSampled": true
}

์ด ๋กœ๊ทธ๋ฅผ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Cloud Service Mesh์˜ ์„ ํƒ์  ๊ธฐ๋Šฅ์ธ Cloud Trace์™€ ํ†ตํ•ฉ
  • ํŠธ๋ž˜ํ”ฝ ๋กœ๊ทธ๋ฅผ BigQuery๋กœ ๋‚ด๋ณด๋‚ด๊ธฐ. ์ด๋•Œ ๋ชจ๋“  ์š”์ฒญ ์„ ํƒ๊ณผ ๊ฐ™์€ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ 5์ดˆ ๋„˜๊ฒŒ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.
  • ๋กœ๊ทธ ๊ธฐ๋ฐ˜ ์ธก์ •ํ•ญ๋ชฉ ๋งŒ๋“ค๊ธฐ
  • 404 ๋ฐ 503 ์˜ค๋ฅ˜ ๋ฌธ์ œ ํ•ด๊ฒฐ

404 ๋ฐ 503 ์˜ค๋ฅ˜ ๋ฌธ์ œ ํ•ด๊ฒฐ

๋‹ค์Œ ์˜ˆ์‹œ์—์„œ๋Š” 404 ๋˜๋Š” 503 ์‘๋‹ต ์ฝ”๋“œ๋กœ ์š”์ฒญ์ด ์‹คํŒจํ•  ๋•Œ ๋ฌธ์ œ ํ•ด๊ฒฐ์„ ์œ„ํ•ด ์ด ๋กœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

  1. ํด๋ผ์ด์–ธํŠธ ์•ก์„ธ์Šค ๋กœ๊ทธ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•ญ๋ชฉ์„ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.

    httpRequest: {
    requestMethod: "GET"
    requestUrl: "://IP_ADDRESS/src/Util/PHP/eval-stdin.php"
    requestSize: "2088"
    status: 404
    responseSize: "75"
    remoteIp: "10.168.0.26:34165"
    serverIp: "10.36.3.149:8080"
    latency: "0.000371440s"
    protocol: "http"
    }
  2. ์•ก์„ธ์Šค ๋กœ๊ทธ ํ•ญ๋ชฉ์˜ ๋ผ๋ฒจ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด response_flag ํ•„๋“œ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.

    response_flag: "NR"

    NR ๊ฐ’์€ NoRoute์˜ ์•ฝ์–ด์ž…๋‹ˆ๋‹ค. ์ฆ‰, ๋Œ€์ƒ์— ๋Œ€ํ•œ ๊ฒฝ๋กœ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๊ฑฐ๋‚˜ ๋‹ค์šด์ŠคํŠธ๋ฆผ ์—ฐ๊ฒฐ์— ์ผ์น˜ํ•˜๋Š” ํ•„ํ„ฐ ์ฒด์ธ์ด ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ response_flag ๋ผ๋ฒจ์„ ์‚ฌ์šฉํ•˜์—ฌ 503 ์˜ค๋ฅ˜๋„ ๋ฌธ์ œ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  3. ํด๋ผ์ด์–ธํŠธ ๋ฐ ์„œ๋ฒ„ ์•ก์„ธ์Šค ๋กœ๊ทธ ๋ชจ๋‘์— 503 ์˜ค๋ฅ˜๊ฐ€ ํ‘œ์‹œ๋œ ๊ฒฝ์šฐ ๊ฐ ์„œ๋น„์Šค์— ์„ค์ •๋œ ํฌํŠธ ์ด๋ฆ„์ด ๋‘˜ ์‚ฌ์ด์— ์‚ฌ์šฉ ์ค‘์ธ ํ”„๋กœํ† ์ฝœ์˜ ์ด๋ฆ„๊ณผ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด golang ๋ฐ”์ด๋„ˆ๋ฆฌ ํด๋ผ์ด์–ธํŠธ๊ฐ€ HTTP๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ golang ์„œ๋ฒ„์— ์—ฐ๊ฒฐ๋˜์ง€๋งŒ ํฌํŠธ ์ด๋ฆ„์ด http2์ด๋ฉด ํ”„๋กœํ† ์ฝœ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž๋™ ํ˜‘์ƒ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ ์‘๋‹ต ํ”Œ๋ž˜๊ทธ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

Envoy ์•ก์„ธ์Šค ๋กœ๊ทธ ํ•ด์„

๋‹ค์Œ ๋‹จ๊ณ„์—์„œ๋Š” Envoy ์•ก์„ธ์Šค ๋กœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ œ ํ•ด๊ฒฐ์„ ์œ„ํ•ด ์—ฐ๊ฒฐ์˜ ์–‘ ๋๋‹จ ์‚ฌ์ด์˜ ํŠธ๋ž˜ํ”ฝ์„ ํ‘œ์‹œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

Envoy ์•ก์„ธ์Šค ๋กœ๊ทธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ์ง„๋‹จํ•˜๋Š” ๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • ํŠธ๋ž˜ํ”ฝ ํ๋ฆ„ ๋ฐ ์žฅ์• 
  • ์—”๋“œ ํˆฌ ์—”๋“œ ์š”์ฒญ ๋ผ์šฐํŒ…

Envoy ์•ก์„ธ์Šค ๋กœ๊ทธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ Cloud Service Mesh์—์„œ ์‚ฌ์šฉ ์„ค์ •๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉฐ ๋ฉ”์‹œ์˜ ํด๋Ÿฌ์Šคํ„ฐ์— ์‚ฌ์šฉ ์„ค์ •๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

HTTP ์š”์ฒญ์„ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ž‘์—…์„ ์ƒ์„ฑํ•œ ํ›„ ์†Œ์Šค ๋กœ๊ทธ๋‚˜ ๋Œ€์ƒ ๋กœ๊ทธ์—์„œ ์—ฐ๊ด€๋œ ์š”์ฒญ์„ ์กฐ์‚ฌํ•˜์—ฌ ์—ฐ๊ฒฐ ์˜ค๋ฅ˜๋‚˜ ์š”์ฒญ ์˜ค๋ฅ˜๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์š”์ฒญ์„ ํŠธ๋ฆฌ๊ฑฐํ•˜๊ณ  ์š”์ฒญ์ด ์†Œ์Šค ํ”„๋ก์‹œ ๋กœ๊ทธ์— ํ‘œ์‹œ๋˜๋ฉด iptables ํŠธ๋ž˜ํ”ฝ ๋ฆฌ๋””๋ ‰์…˜์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ ์ค‘์ด๊ณ  Envoy ํ”„๋ก์‹œ๊ฐ€ ํŠธ๋ž˜ํ”ฝ์„ ์ฒ˜๋ฆฌ ์ค‘์ž„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๋กœ๊ทธ์— ์˜ค๋ฅ˜๊ฐ€ ํ‘œ์‹œ๋˜๋ฉด Envoy ๊ตฌ์„ฑ ๋คํ”„๋ฅผ ์ƒ์„ฑํ•˜๊ณ  envoy ํด๋Ÿฌ์Šคํ„ฐ ๊ตฌ์„ฑ์„ ๊ฒ€์‚ฌํ•˜์—ฌ ์˜ฌ๋ฐ”๋ฅธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์š”์ฒญ์ด ํ‘œ์‹œ๋˜์ง€๋งŒ ๋กœ๊ทธ์— ์˜ค๋ฅ˜๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ๋Œ€์‹  ๋Œ€์ƒ ํ”„๋ก์‹œ ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

์š”์ฒญ์ด ๋Œ€์ƒ ํ”„๋ก์‹œ ๋กœ๊ทธ์— ํ‘œ์‹œ๋˜๋ฉด ๋ฉ”์‹œ ์ž์ฒด๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™๋˜๊ณ  ์žˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๋Œ€์‹  ์˜ค๋ฅ˜๊ฐ€ ํ‘œ์‹œ๋˜๋ฉด Envoy ๊ตฌ์„ฑ ๋คํ”„๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๋ฆฌ์Šค๋„ˆ ๊ตฌ์„ฑ์— ์„ค์ •๋œ ํŠธ๋ž˜ํ”ฝ ํฌํŠธ์— ๋Œ€ํ•ด ์˜ฌ๋ฐ”๋ฅธ ๊ฐ’์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

์ด์ „ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•œ ํ›„์—๋„ ๋ฌธ์ œ๊ฐ€ ์ง€์†๋˜๋ฉด Envoy๊ฐ€ ์‚ฌ์ด๋“œ์นด ๋ฐ ํ•ด๋‹น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํฌ๋“œ ์‚ฌ์ด์— ํ”„๋กœํ† ์ฝœ์„ ์ž๋™ ํ˜‘์ƒํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Kubernetes ์„œ๋น„์Šค ํฌํŠธ ์ด๋ฆ„(์˜ˆ: http-80)์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์‚ฌ์šฉ๋˜๋Š” ํ”„๋กœํ† ์ฝœ๊ณผ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

๋กœ๊ทธ ํƒ์ƒ‰๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๊ทธ ์ฟผ๋ฆฌ

๋กœ๊ทธ ํƒ์ƒ‰๊ธฐ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • Envoy ์•ก์„ธ์Šค ๋กœ๊ทธ๋ฅผ ์ฟผ๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด MULTUAL_TLS๊ฐ€ ์‚ฌ์šฉ ์„ค์ •๋œ ๋ชจ๋“  ์š”์ฒญ์„ ์ฟผ๋ฆฌํ•˜๊ณ  grpc ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์„œ๋ฒ„ ์•ก์„ธ์Šค ๋กœ๊ทธ ์ฟผ๋ฆฌ์— ๋‹ค์Œ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

labels.protocol="grpc" labels.service_authentication_policy="MULTUAL_TLS"

์•ก์„ธ์Šค ๋กœ๊ทธ ์ •์ฑ… ์„ค์ •

๊ด€๋ฆฌํ˜• Cloud Service Mesh

๊ด€๋ฆฌํ˜• Cloud Service Mesh ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์„ ์‚ฌ์šฉํ•˜๋Š” Cloud Service Mesh์˜ ์•ก์„ธ์Šค ๋กœ๊ทธ๋ฅผ ๊ตฌ์„ฑํ•˜๋ ค๋ฉด ์•ก์„ธ์Šค ๋กœ๊ทธ ์‚ฌ์šฉ ์„ค์ •์„ ์ฐธ์กฐํ•˜์„ธ์š”.

๊ด€๋ฆฌํ˜• istiod

๊ด€๋ฆฌํ˜• istiod ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์„ ์‚ฌ์šฉํ•˜๋Š” Cloud Service Mesh์˜ ์•ก์„ธ์Šค ๋กœ๊ทธ๋ฅผ ๊ตฌ์„ฑํ•˜๋ ค๋ฉด ์•ก์„ธ์Šค ๋กœ๊ทธ ์‚ฌ์šฉ ์„ค์ •์„ ์ฐธ์กฐํ•˜์„ธ์š”.

ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด

ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์„ ์‚ฌ์šฉํ•˜์—ฌ Cloud Service Mesh์˜ ์•ก์„ธ์Šค ๋กœ๊ทธ ์ •์ฑ…์„ ์„ค์ •ํ•˜๋ ค๋ฉด ๋‹ค์Œ ์•ˆ๋‚ด๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.

  1. ์‹œ๋‚˜๋ฆฌ์˜ค์— ์ ์šฉ ๊ฐ€๋Šฅํ•œ AccessLogPolicyConfig ๊ฐ’์„ ํฌํ•จํ•˜๋Š” IstioOperator ์ปค์Šคํ…€ ์˜ค๋ฒ„๋ ˆ์ด ํŒŒ์ผ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

  2. ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด ์ œ์–ด ์˜์—ญ ๊ตฌ์„ฑ์„ ์—…๋ฐ์ดํŠธํ•˜๋ ค๋ฉด --custom_overlay ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด ํŒŒ์ผ์„ asmcli์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์ปค์Šคํ…€ ์˜ค๋ฒ„๋ ˆ์ด ํŒŒ์ผ๋กœ asmcli install์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์„ ํƒ์  ๊ธฐ๋Šฅ์œผ๋กœ ์„ค์น˜๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์„œ๋น„์Šค ๋˜๋Š” ์›Œํฌ๋กœ๋“œ ๊ด€๋ จ ์ •๋ณด ๋ณด๊ธฐ

๋ฉ”์‹œ ์ „์ฒด ๋ฌธ์ œ๊ฐ€ ์•„๋‹Œ ํŠน์ • ์„œ๋น„์Šค ๋˜๋Š” ์›Œํฌ๋กœ๋“œ์™€ ๊ด€๋ จ๋œ ๋ฌธ์ œ์ธ ๊ฒฝ์šฐ ๊ฐœ๋ณ„ Envoy ํ”„๋ก์‹œ๋ฅผ ๊ฒ€์‚ฌํ•˜๊ณ  ๊ด€๋ จ ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค. ํŠน์ • ์›Œํฌ๋กœ๋“œ ๋ฐ ํ•ด๋‹น ํ”„๋ก์‹œ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•˜๋ ค๋ฉด pilot-agent๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

kubectl exec POD_NAME -n NAMESPACE_NAME -c istio-proxy -- pilot-agent request GET SCOPE

์ด ์˜ˆ์‹œ์—์„œ SCOPE๋Š” ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

  • certs - Envoy ์ธ์Šคํ„ด์Šค ๋‚ด์˜ ์ธ์ฆ์„œ
  • clusters - Envoy๊ฐ€ ๊ตฌ์„ฑ๋œ ํด๋Ÿฌ์Šคํ„ฐ
  • config_dump - Envoy ๊ตฌ์„ฑ ๋คํ”„
  • listeners - Envoy๊ฐ€ ๊ตฌ์„ฑ๋œ ๋ฆฌ์Šค๋„ˆ
  • logging - ๋กœ๊น… ์„ค์ • ํ™•์ธ ๋ฐ ๋ณ€๊ฒฝ
  • stats - Envoy ํ†ต๊ณ„
  • stats/prometheus - Prometheus ๋ ˆ์ฝ”๋“œ์ธ Envoy ํ†ต๊ณ„

ํ”„๋ก์‹œ ์†Œ์ผ“ ์ƒํƒœ ๋ณด๊ธฐ

๋‹ค์Œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Envoy ํ”„๋ก์‹œ ์†Œ์ผ“์˜ ์ƒํƒœ๋ฅผ ์ง์ ‘ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. TIME_WAIT ์ƒํƒœ์˜ ์†Œ์ผ“์„ ํฌํ•จํ•˜์—ฌ ์„ค์ •๋œ ์†Œ์ผ“์˜ ๋ชฉ๋ก์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ์ˆ˜๊ฐ€ ๋งŽ์œผ๋ฉด ํ™•์žฅ์„ฑ์— ๋ถ€์ •์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    kubectl debug --image istio/base --target istio-proxy -it POD_NAME -n NAMESPACE_NAME -- ss -anopim
  2. ์†Œ์ผ“ ํ†ต๊ณ„์˜ ์š”์•ฝ์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

    kubectl debug --image istio/base --target istio-proxy -it POD_NAME -n NAMESPACE_NAME -- ss -s

์ž์„ธํ•œ ๋‚ด์šฉ์€ ss ๋ช…๋ น์–ด ์†Œ๊ฐœ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

istio-proxy ๋ฐ istio-init ๋กœ๊ทธ

๋˜ํ•œ istio-proxy ๋กœ๊ทธ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ  ๋ฌธ์ œ ์›์ธ์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋Š” ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š”์ง€ ํ•ด๋‹น ์ฝ˜ํ…์ธ ๋ฅผ ๊ฒ€ํ† ํ•ฉ๋‹ˆ๋‹ค.

kubectl logs POD_NAME -n NAMESPACE_NAME -c istio-proxy

init ์ปจํ…Œ์ด๋„ˆ์—๋„ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

kubectl logs POD_NAME -n NAMESPACE_NAME -c istio-init

๋‹ค์Œ ๋‹จ๊ณ„