|
| 1 | +--- |
| 2 | +title: Istio Bookinfo Demo |
| 3 | +permalink: /auto-tracing/istio-bookinfo-demo |
| 4 | +--- |
| 5 | + |
| 6 | +# Introduction |
| 7 | + |
| 8 | +This chapter uses a microservices application implemented in four languages: Java, Python, Ruby, and Node.js, to demonstrate DeepFlow's AutoTracing capabilities within a multi-language Istio service mesh environment. |
| 9 | + |
| 10 | +# Deploy Istio Bookinfo Demo |
| 11 | + |
| 12 | +## Deploy Istio |
| 13 | + |
| 14 | +You can refer to the [official Istio documentation](https://istio.io/latest/zh/docs/setup/getting-started/) for deploying Istio. Alternatively, you can use the following command for a quick deployment: |
| 15 | +```bash |
| 16 | +curl -L https://istio.io/downloadIstio | sh - |
| 17 | +cd istio-* |
| 18 | +export PATH=$PWD/bin:$PATH |
| 19 | +istioctl install --set profile=demo -y |
| 20 | +``` |
| 21 | + |
| 22 | +Currently, DeepFlow has already supported HTTPS data collection for Golang applications, and support for other languages is still in progress. For this demo, we will temporarily disable Istio mTLS: |
| 23 | +```bash |
| 24 | +kubectl apply -f - <<EOF |
| 25 | +apiVersion: security.istio.io/v1beta1 |
| 26 | +kind: PeerAuthentication |
| 27 | +metadata: |
| 28 | + name: "default" |
| 29 | + namespace: "istio-system" |
| 30 | +spec: |
| 31 | + mtls: |
| 32 | + mode: DISABLE |
| 33 | +EOF |
| 34 | +``` |
| 35 | + |
| 36 | +## Deploy Bookinfo Demo |
| 37 | + |
| 38 | +The demo we are using is sourced from [this GitHub repository](https://github.com/istio/istio/tree/master/samples/bookinfo), and its application architecture is as follows: |
| 39 | + |
| 40 | + |
| 41 | + |
| 42 | +You can quickly deploy the demo in Kubernetes using the following command: |
| 43 | +```bash |
| 44 | +kubectl apply -f https://raw.githubusercontent.com/deepflowio/deepflow-demo/main/Istio-Bookinfo/bookinfo.yaml |
| 45 | +``` |
| 46 | + |
| 47 | +The original GitHub code repository for this demo utilizes Jaeger for active tracing. However, to showcase the AutoTracing capability, we intentionally removed Jaeger from the deployment script mentioned above. |
| 48 | + |
| 49 | +# View Distributed Tracing |
| 50 | + |
| 51 | +Go to Grafana, open the `Distributed Tracing` Dashboard, and select `namespace = deepflow-ebpf-istio-demo`. You can then choose a call for tracing, and the result will be as shown in the following image: |
| 52 | + |
| 53 | + |
| 54 | + |
| 55 | +[Access the DeepFlow Online Demo](https://ce-demo.deepflow.yunshan.net/d/Distributed_Tracing/distributed-tracing?var-namespace=deepflow-ebpf-istio-demo&from=deepflow-doc) You can also observe the tracing effect. The topology diagram corresponding to the call chain flame graph in the above image is as follows: |
| 56 | + |
| 57 | +```mermaid |
| 58 | +flowchart TD |
| 59 | +
|
| 60 | +loadgenerator_curl_send(1-eBPF: loadgenerator curl send):::loadgenerator |
| 61 | +loadgenerator_envoy_egress_recv(2-eBPF: loadgenerator envoy egress recv):::loadgenerator |
| 62 | +loadgenerator_envoy_egress_send(3-eBPF: loadgenerator envoy egress send):::loadgenerator |
| 63 | +loadgenerator_vnic_send(4-BPF: loadgenerator vnic send):::nic |
| 64 | +
|
| 65 | +productpage_vnic_recv(5-BPF: productpage vnic recv):::nic |
| 66 | +productpage_envoy_ingress_recv(6-eBPF: productpage envoy ingress recv):::productpage_1 |
| 67 | +productpage_envoy_ingress_send(7-eBPF: productpage envoy ingress send):::productpage_1 |
| 68 | +productpage_python_recv(8-eBPF: productpage python recv):::productpage_2 |
| 69 | +productpage_python_send_d("9-eBPF: productpage python send ->details"):::productpage_2 |
| 70 | +productpage_envoy_egress_recv_d("10-eBPF: productpage envoy egress recv ->details"):::productpage_2 |
| 71 | +productpage_envoy_egress_send_d("11-eBPF: productpage envoy egress send ->details"):::productpage_2 |
| 72 | +productpage_vnic_send_d("12-BPF: productpage vnic send ->details"):::nic |
| 73 | +node2_nic_send_pd("13-BPF: node2 nic send prod->details"):::nic |
| 74 | +node1_nic_recv_pd("14-BPF: node1 nic recv prod->details"):::nic |
| 75 | +
|
| 76 | +details_vnic_recv(15-BPF: details vnic recv):::nic |
| 77 | +details_envoy_ingress_recv(16-eBPF: details envoy ingress recv):::details_1 |
| 78 | +details_envoy_ingress_send(17-eBPF: details envoy ingress send):::details_1 |
| 79 | +details_ruby_recv(18-eBPF: details ruby recv):::details_2 |
| 80 | +
|
| 81 | +productpage_python_send_r("19-eBPF: productpage python send prod->review"):::productpage_2 |
| 82 | +productpage_envoy_egress_recv_r("20-eBPF: productpage envoy egress recv prod->review"):::productpage_2 |
| 83 | +productpage_envoy_egress_send_r("21-eBPF: productpage envoy egress send prod->review"):::productpage_2 |
| 84 | +productpage_vnic_send_r("22-BPF: productpage vnic send prod->review"):::nic |
| 85 | +node2_nic_send_pr("23-BPF: node2 nic send prod->review"):::nic |
| 86 | +node1_nic_recv_pr("24-BPF: node1 nic recv prod->review"):::nic |
| 87 | +
|
| 88 | +reviews_vnic_recv(25-BPF: reviews vnic recv):::nic |
| 89 | +reviews_envoy_ingress_recv(26-eBPF: reviews envoy ingress recv):::reviews_1 |
| 90 | +reviews_envoy_ingress_send(27-eBPF: reviews envoy ingress send):::reviews_1 |
| 91 | +reviews_java_recv(28-eBPF: reviews java recv):::reviews_2 |
| 92 | +reviews_java_send(29-eBPF: reviews java send):::reviews_2 |
| 93 | +reviews_envoy_egress_recv(30-eBPF: reviews envoy egress recv):::reviews_2 |
| 94 | +reviews_envoy_egress_send(31-eBPF: reviews envoy egress send):::reviews_2 |
| 95 | +reviews_vnic_send(32-BPF: reviews vnic send):::nic |
| 96 | +node1_nic_send_rr("33-BPF: node1 nic send reviews->ratings"):::nic |
| 97 | +node2_nic_recv_rr("34-BPF: node2 nic recv reviews->ratings"):::nic |
| 98 | +
|
| 99 | +ratings_vnic_recv(35-BPF: ratings vnic recv):::nic |
| 100 | +ratings_envoy_ingress_recv(36-eBPF: ratings envoy ingress recv):::ratings_1 |
| 101 | +ratings_envoy_ingress_send(37-eBPF: ratings envoy ingress send):::ratings_1 |
| 102 | +ratings_nodejs_recv(38-eBPF: ratings node.js recv):::ratings_2 |
| 103 | +
|
| 104 | +subgraph node2-1 [k8s node2] |
| 105 | + subgraph loadgenerator pod |
| 106 | + subgraph loadgenerator curl container |
| 107 | + loadgenerator_curl_send |
| 108 | + end |
| 109 | + subgraph loadgenerator envoy container |
| 110 | + loadgenerator_envoy_egress_recv |
| 111 | + loadgenerator_envoy_egress_send |
| 112 | + end |
| 113 | + end |
| 114 | +
|
| 115 | + loadgenerator_vnic_send |
| 116 | + productpage_vnic_recv |
| 117 | +
|
| 118 | + subgraph productpage pod |
| 119 | + subgraph productpage envoy container |
| 120 | + productpage_envoy_ingress_recv |
| 121 | + productpage_envoy_ingress_send |
| 122 | + productpage_envoy_egress_recv_d |
| 123 | + productpage_envoy_egress_send_d |
| 124 | + productpage_envoy_egress_recv_r |
| 125 | + productpage_envoy_egress_send_r |
| 126 | + end |
| 127 | + subgraph productpage python container |
| 128 | + productpage_python_recv |
| 129 | + productpage_python_send_d |
| 130 | + productpage_python_send_r |
| 131 | + end |
| 132 | + end |
| 133 | +
|
| 134 | + productpage_vnic_send_d |
| 135 | + productpage_vnic_send_r |
| 136 | + node2_nic_send_pd |
| 137 | + node2_nic_send_pr |
| 138 | +end |
| 139 | +
|
| 140 | +subgraph node2-2 [k8s node2] |
| 141 | + node2_nic_recv_rr |
| 142 | + ratings_vnic_recv |
| 143 | +
|
| 144 | + subgraph ratings pod |
| 145 | + subgraph ratings envoy container |
| 146 | + ratings_envoy_ingress_recv |
| 147 | + ratings_envoy_ingress_send |
| 148 | + end |
| 149 | + subgraph ratings nodejs container |
| 150 | + ratings_nodejs_recv |
| 151 | + end |
| 152 | + end |
| 153 | +end |
| 154 | +
|
| 155 | +subgraph k8s node1 |
| 156 | + node1_nic_recv_pd |
| 157 | + node1_nic_recv_pr |
| 158 | + details_vnic_recv |
| 159 | + reviews_vnic_recv |
| 160 | +
|
| 161 | + subgraph details pod |
| 162 | + subgraph details envoy container |
| 163 | + details_envoy_ingress_recv |
| 164 | + details_envoy_ingress_send |
| 165 | + end |
| 166 | + subgraph details ruby container |
| 167 | + details_ruby_recv |
| 168 | + end |
| 169 | + end |
| 170 | + subgraph reviews pod |
| 171 | + subgraph reviews envoy container |
| 172 | + reviews_envoy_ingress_recv |
| 173 | + reviews_envoy_ingress_send |
| 174 | + reviews_envoy_egress_recv |
| 175 | + reviews_envoy_egress_send |
| 176 | + end |
| 177 | + subgraph reviews java container |
| 178 | + reviews_java_recv |
| 179 | + reviews_java_send |
| 180 | + end |
| 181 | + end |
| 182 | +
|
| 183 | + reviews_vnic_send |
| 184 | + node1_nic_send_rr |
| 185 | +end |
| 186 | +
|
| 187 | +loadgenerator_curl_send --> loadgenerator_envoy_egress_recv --> loadgenerator_envoy_egress_send --> loadgenerator_vnic_send --> productpage_vnic_recv |
| 188 | +
|
| 189 | +productpage_vnic_recv --> productpage_envoy_ingress_recv --> productpage_envoy_ingress_send --> productpage_python_recv |
| 190 | +productpage_python_recv --> productpage_python_send_d --> productpage_envoy_egress_recv_d --> productpage_envoy_egress_send_d --> productpage_vnic_send_d --> node2_nic_send_pd -->|IPIP encap| node1_nic_recv_pd --> details_vnic_recv |
| 191 | +productpage_python_recv --> productpage_python_send_r --> productpage_envoy_egress_recv_r --> productpage_envoy_egress_send_r --> productpage_vnic_send_r --> node2_nic_send_pr -->|IPIP encap| node1_nic_recv_pr --> reviews_vnic_recv |
| 192 | +
|
| 193 | +details_vnic_recv --> details_envoy_ingress_recv --> details_envoy_ingress_send --> details_ruby_recv |
| 194 | +
|
| 195 | +reviews_vnic_recv --> reviews_envoy_ingress_recv --> reviews_envoy_ingress_send --> reviews_java_recv |
| 196 | +reviews_java_recv --> reviews_java_send --> reviews_envoy_egress_recv --> reviews_envoy_egress_send --> reviews_vnic_send --> node1_nic_send_rr -->|IPIP encap| node2_nic_recv_rr --> ratings_vnic_recv |
| 197 | +
|
| 198 | +ratings_vnic_recv --> ratings_envoy_ingress_recv --> ratings_envoy_ingress_send --> ratings_nodejs_recv |
| 199 | +
|
| 200 | +classDef loadgenerator fill:#8498d1,color:white; |
| 201 | +classDef nic fill:#a1a1a1,color:white; |
| 202 | +classDef productpage_1 fill:#9cdbc3,color:black; |
| 203 | +classDef productpage_2 fill:#eadb92,color:black; |
| 204 | +classDef details_1 fill:#16a9e8,color:white; |
| 205 | +classDef details_2 fill:#b38ebc,color:white; |
| 206 | +classDef reviews_1 fill:#49b292,color:white; |
| 207 | +classDef reviews_2 fill:#ceb961,color:black; |
| 208 | +classDef ratings_1 fill:#6aaec6,color:black; |
| 209 | +classDef ratings_2 fill:#aa48bc,color:black; |
| 210 | +``` |
| 211 | + |
| 212 | +Let's summarize this tracing demo: |
| 213 | + |
| 214 | +- Zero Intrusion: The entire tracing process requires no manual insertion of tracking code and no injection of TraceID/SpanID into HTTP Headers. |
| 215 | +- Multi-Language: Supports tracing of applications in Java, Python, Ruby, NodeJS, and basic services in C/C++ (curl/envoy) languages. |
| 216 | +- End-to-End: Utilizing eBPF and cBPF, automatic tracing encompasses 38 spans for this trace, including 24 eBPF spans and 14 BPF spans. |
| 217 | +- Full-Stack: Supports tracing network paths between two pods on the same K8s node, e.g., Span 4-5. |
| 218 | +- Full-Stack: Supports tracing network paths between two pods across K8s nodes, even when traversing tunnel encapsulation, e.g., Span 12-15 (IPIP tunnel encapsulation). |
| 219 | +- Full-Stack: Supports tracing the complete journey within a single pod, including from Envoy Ingress, service process, to Envoy Egress, e.g., Span 6-11. |
| 220 | + |
0 commit comments