ํ๋ก์ ๋ก๊ทธ ์์ฒญ
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 ์ก์ธ์ค ๋ก๊น ์ ์ฌ์ฉ ์ค์ ํฉ๋๋ค.
๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํ์ฌ
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
).๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํ์ฌ ๊ตฌ์ฑ ๋งต์ ํ์ธํฉ๋๋ค.
kubectl get configmap istio-release-channel -n istio-system -o yaml
์ก์ธ์ค ๋ก๊น ์ด ์ฌ์ฉ ์ค์ ๋์๋์ง ํ์ธํ๋ ค๋ฉด
accessLogFile: /dev/stdout
์ค์ดmesh:
์น์ ์ ํ์๋๋์ง ํ์ธํฉ๋๋ค.... apiVersion: v1 data: mesh: | .... accessLogFile: /dev/stdout ...
ํธ๋ํฝ ๋ก๊ทธ
ํธ๋ํฝ ๋ก๊ทธ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉ ์ค์ ๋์ด ์์ต๋๋ค.
ํด๋ฌ์คํฐ ๋ด
Envoy ์ก์ธ์ค ๋ก๊ทธ
์์ธํ ๋ด์ฉ์ 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 ์ก์ธ์ค ๋ก๊ทธ๋ฅผ ๋ณด๋ ค๋ฉด ๋ค์ ์๋ด๋ฅผ ๋ฐ๋ฅด์ธ์.
๋ก๊ทธ ํ์๊ธฐ๋ก ์ด๋ํฉ๋๋ค.
์ ํฉํ Google Cloud ํ๋ก์ ํธ๋ฅผ ์ ํํฉ๋๋ค.
๋ค์ ์ฟผ๋ฆฌ๋ฅผ ์คํํฉ๋๋ค.
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"
ํธ๋ํฝ ๋ก๊ทธ
๋ก๊ทธ ํ์๊ธฐ์์ ํธ๋ํฝ ๋ก๊ทธ๋ฅผ ๋ณด๋ ค๋ฉด ๋ค์ ์๋ด๋ฅผ ๋ฐ๋ฅด์ธ์.
๋ก๊ทธ ํ์๊ธฐ๋ก ์ด๋ํฉ๋๋ค.
์ ํฉํ Google Cloud ํ๋ก์ ํธ๋ฅผ ์ ํํฉ๋๋ค.
ํ์ฌ ๋ณด๊ณ ์๋ ๋ก๊ทธ๊ฐ ํด๋ผ์ด์ธํธ ๋๋ ์๋ฒ ์ก์ธ์ค ๋ก๊ทธ์ธ์ง์ ๋ฐ๋ผ ๋ค์ ์ฟผ๋ฆฌ๋ฅผ ์คํํฉ๋๋ค.
์๋ฒ ๋ก๊ทธ
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 ํ์ด์ง์์ ํธ๋ํฝ ๋ก๊ทธ๋ฅผ ๋ณด๋ ค๋ฉด ๋ค์ ๋จ๊ณ๋ฅผ ์ํํฉ๋๋ค.
Google Cloud ์ฝ์์์ Cloud Service Mesh ํ์ด์ง๋ก ์ด๋ํฉ๋๋ค.
์๋น์ค์์ ๊ฒ์ฌํ๋ ค๋ ์๋น์ค์ ์ด๋ฆ์ ์ ํํฉ๋๋ค.
์ธก์ ํญ๋ชฉ ํ์ด์ง๋ก ์ด๋ํฉ๋๋ค.
์๊ฐ ๋ฒ์ ๋๋กญ๋ค์ด ๋ฉ๋ด์์ ๊ธฐ๊ฐ์ ์ง์ ํ๊ฑฐ๋ ํ์๋ผ์ธ์ผ๋ก ์ปค์คํ ์คํฌ์ ์ค์ ํฉ๋๋ค.
filter_list ํํฐ ์ต์ ์ ํ์์ ํธ๋ํฝ ๋ก๊ทธ ๋ณด๊ธฐ๋ฅผ ํด๋ฆญํฉ๋๋ค.
ํธ๋ํฝ ๋ก๊ทธ ์ด๋ฆ์ 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
๋ก ํ๋ฆฌํฝ์ค๋ฅผ ์ง์ ํ๊ณ ๊ฐ ์ปจํธ๋กค ํ๋ ์ธ ์ธ์คํด์ค์ ์ฐ๊ฒฐ๋ ํ๋ก์ ์, ๊ตฌ์ฑ ์ด๋ฒคํธ, ํธ์, ๊ฒ์ฌ์ ๊ฐ์ ์ปจํธ๋กค ํ๋ ์ธ ์ํ์ ๋ํ ์ ์ฉํ ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค.
๋ค์ ๋จ๊ณ์ ๋ฐ๋ผ ์ปจํธ๋กค ํ๋ ์ธ์ ๊ด์ฐฐํ๊ฑฐ๋ ๋ฌธ์ ํด๊ฒฐํฉ๋๋ค.
์ํ ๋์๋ณด๋ ๋ก๋:
git clone https://github.com/GoogleCloudPlatform/monitoring-dashboard-samples && cd monitoring-dashboard-samples/dashboards && git checkout servicemesh
Cloud Service Mesh ๋์๋ณด๋๋ฅผ ์ค์นํฉ๋๋ค.
gcloud monitoring dashboards create --config-from-file=dashboards/servicemesh/anthos-service-mesh-control-plane-monitoring.json
๋ชฉ๋ก์์
Istio Control Plane Dashboard
๋ผ๋ ๋์๋ณด๋๋ฅผ ์ฐพ์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ์ค์น๋ ๋์๋ณด๋ ๋ณด๊ธฐ๋ฅผ ์ฐธ์กฐํ์ธ์.
์ฌ์ฉ ๊ฐ๋ฅํ ์ ์ฒด ์ธก์ ํญ๋ชฉ ๋ชฉ๋ก์ ๋ด๋ณด๋ธ ์ธก์ ํญ๋ชฉ์ ์ฐธ์กฐํ์ธ์.
๊ตฌ์ฑ ์ง์ฐ ์ง๋จ
๊ด๋ฆฌํ Cloud Service Mesh
๊ด๋ฆฌํ Cloud Service Mesh ์ปจํธ๋กค ํ๋ ์ธ์ ์ฌ์ฉํ๋ Cloud Service Mesh์์๋ ๊ตฌ์ฑ ์ง์ฐ์ ์ง๋จํ ์ ์์ต๋๋ค.
๊ด๋ฆฌํ istiod
๊ด๋ฆฌํ istiod ์ปจํธ๋กค ํ๋ ์ธ์ ์ฌ์ฉํ๋ Cloud Service Mesh์์๋ ๊ตฌ์ฑ ์ง์ฐ์ ์ง๋จํ ์ ์์ต๋๋ค.
ํด๋ฌ์คํฐ ๋ด
๋ค์ ๋จ๊ณ์์๋ pilot_proxy_convergence_time
์ธก์ ํญ๋ชฉ์ ์ฌ์ฉํ์ฌ ๊ตฌ์ฑ ๋ณ๊ฒฝ๊ณผ ๋ชจ๋ ํ๋ก์ ์๋ ด ์ฌ์ด์ ์ง์ฐ์ ์ง๋จํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช
ํฉ๋๋ค.
ํฌ๋์์ ์ ธ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
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
์ธก์ ํญ๋ชฉ์์
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
์๋ต ์ฝ๋๋ก ์์ฒญ์ด ์คํจํ ๋ ๋ฌธ์ ํด๊ฒฐ์ ์ํด ์ด ๋ก๊ทธ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช
ํฉ๋๋ค.
ํด๋ผ์ด์ธํธ ์ก์ธ์ค ๋ก๊ทธ์์ ๋ค์๊ณผ ๊ฐ์ด ํญ๋ชฉ์ ๊ฒ์ํฉ๋๋ค.
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" }
์ก์ธ์ค ๋ก๊ทธ ํญ๋ชฉ์ ๋ผ๋ฒจ๋ก ์ด๋ํฉ๋๋ค. ๋ค์๊ณผ ๊ฐ์ด
response_flag
ํ๋๋ฅผ ์ฐพ์ต๋๋ค.response_flag: "NR"
NR
๊ฐ์NoRoute
์ ์ฝ์ด์ ๋๋ค. ์ฆ, ๋์์ ๋ํ ๊ฒฝ๋ก๋ฅผ ์ฐพ์ ์ ์๊ฑฐ๋ ๋ค์ด์คํธ๋ฆผ ์ฐ๊ฒฐ์ ์ผ์นํ๋ ํํฐ ์ฒด์ธ์ด ์์์ ์๋ฏธํฉ๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋กresponse_flag
๋ผ๋ฒจ์ ์ฌ์ฉํ์ฌ503
์ค๋ฅ๋ ๋ฌธ์ ํด๊ฒฐํ ์ ์์ต๋๋ค.ํด๋ผ์ด์ธํธ ๋ฐ ์๋ฒ ์ก์ธ์ค ๋ก๊ทธ ๋ชจ๋์
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์ ์ก์ธ์ค ๋ก๊ทธ ์ ์ฑ ์ ์ค์ ํ๋ ค๋ฉด ๋ค์ ์๋ด๋ฅผ ๋ฐ๋ฅด์ธ์.
์๋๋ฆฌ์ค์ ์ ์ฉ ๊ฐ๋ฅํ
AccessLogPolicyConfig
๊ฐ์ ํฌํจํ๋IstioOperator
์ปค์คํ ์ค๋ฒ๋ ์ด ํ์ผ์ ๋ง๋ญ๋๋ค.ํด๋ฌ์คํฐ ๋ด ์ ์ด ์์ญ ๊ตฌ์ฑ์ ์ ๋ฐ์ดํธํ๋ ค๋ฉด
--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 ํ๋ก์ ์์ผ์ ์ํ๋ฅผ ์ง์ ํ์ธํ ์ ์์ต๋๋ค.
TIME_WAIT
์ํ์ ์์ผ์ ํฌํจํ์ฌ ์ค์ ๋ ์์ผ์ ๋ชฉ๋ก์ ํ์ํฉ๋๋ค. ๊ฐ์๊ฐ ๋ง์ผ๋ฉด ํ์ฅ์ฑ์ ๋ถ์ ์ ์ธ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค.kubectl debug --image istio/base --target istio-proxy -it POD_NAME -n NAMESPACE_NAME -- ss -anopim
์์ผ ํต๊ณ์ ์์ฝ์ ํ์ํฉ๋๋ค.
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
๋ค์ ๋จ๊ณ
Cloud Trace์ ํตํฉํ๊ธฐ. Cloud Trace๋ Cloud Service Mesh์ ์ ํ์ ๊ธฐ๋ฅ์ ๋๋ค.