From 157e3a8664b389994681588ddbf66e9083abf576 Mon Sep 17 00:00:00 2001
From: "imgbot[bot]"
Date: Fri, 19 Jun 2020 06:33:32 +0000
Subject: [PATCH] deploy: 3234ce689bec207551b071a6cf5d8327f644b69b
---
cloud-native/application-scope.html | 4 +-
cloud-native/cloud-native-definition.html | 4 +-
.../cloud-native-local-quick-start.html | 18 ++++-----
cloud-native/cloud-native-philosophy.html | 4 +-
...native-programming-language-ballerina.html | 16 ++++----
...ud-native-programming-language-pulumi.html | 6 +--
.../cloud-native-programming-languages.html | 4 +-
cloud-native/component.html | 4 +-
cloud-native/define-cloud-native-app.html | 8 ++--
.../from-kubernetes-to-cloud-native.html | 38 +++++++++---------
...ernetes-and-cloud-native-app-overview.html | 36 ++++++++---------
cloud-native/play-with-kubernetes.html | 6 +--
...up-kubernetes-with-rancher-and-aliyun.html | 10 ++---
cloud-native/the-future-of-cloud-native.html | 36 ++++++++---------
cloud-native/trait.html | 4 +-
cloud-native/workload.html | 4 +-
images/cloud-native-app-model.png | Bin 82236 -> 57262 bytes
images/roles.png | Bin 83860 -> 64385 bytes
index.html | 14 +++----
19 files changed, 108 insertions(+), 108 deletions(-)
diff --git a/cloud-native/application-scope.html b/cloud-native/application-scope.html
index 911d590a3..0f2109744 100644
--- a/cloud-native/application-scope.html
+++ b/cloud-native/application-scope.html
@@ -4606,7 +4606,7 @@
The Open Application Model specification - github.com
@@ -4650,7 +4650,7 @@
diff --git a/cloud-native/cloud-native-definition.html b/cloud-native/cloud-native-definition.html
index a575cf67d..ca999e4b7 100644
--- a/cloud-native/cloud-native-definition.html
+++ b/cloud-native/cloud-native-definition.html
@@ -4612,7 +4612,7 @@
CNCF Cloud Native Definition v1.0 - github.com
@@ -4656,7 +4656,7 @@
diff --git a/cloud-native/cloud-native-local-quick-start.html b/cloud-native/cloud-native-local-quick-start.html
index 23f27c8b0..05929cee3 100644
--- a/cloud-native/cloud-native-local-quick-start.html
+++ b/cloud-native/cloud-native-local-quick-start.html
@@ -4678,7 +4678,7 @@ kubectl get nodes
kubectl -n kube-system describe secret ` kubectl -n kube-system get secret| grep admin-token| cut -d " " -f1` | grep "token:" | tr -s " " | cut -d " " -f2
注意 :token的值也可以在vagrant up
的日志的最后看到。
-图片 - Kubernetes dashboard
+图片 - Kubernetes dashboard
Heapster监控
创建Heapster监控:
kubectl apply -f addon/heapster/
@@ -4688,7 +4688,7 @@ kubectl get nodes
172.17.8.102 grafana.jimmysong.io
访问Grafana:http://grafana.jimmysong.io
-图片 - Grafana
+图片 - Grafana
Traefik
部署Traefik ingress controller和增加ingress配置:
kubectl apply -f addon/traefik-ingress
@@ -4697,7 +4697,7 @@ kubectl get nodes
172.17.8.102 traefik.jimmysong.io
访问Traefik UI:http://traefik.jimmysong.io
-图片 - Traefik dashboard
+图片 - Traefik dashboard
EFK
使用EFK做日志收集。
kubectl apply -f addon/efk/
@@ -4747,7 +4747,7 @@ istioctl create -f yaml/istio-bookinfo/bookinfo-gateway.yaml
注意 :JAEGER_PORT
可以通过kubectl -n istio-system get svc tracing -o jsonpath='{.spec.ports[0].nodePort}'
获取,GATEWAY_PORT
可以通过kubectl -n istio-system get svc istio-ingressgateway -o jsonpath='{.spec.ports[0].nodePort}'
获取。
-图片 - bookinfo示例
+图片 - bookinfo示例
Vistio
Vizceral 是Netflix发布的一个开源项目,用于近乎实时地监控应用程序和集群之间的网络流量。Vistio是使用Vizceral对Istio和网格监控的改进。它利用Istio Mixer生成的指标,然后将其输入Prometheus。Vistio查询Prometheus并将数据存储在本地以允许重播流量。
@@ -4760,7 +4760,7 @@ kubectl -n default port-forward $( kubectl -n default get pod -l app = vistio-web -o jsonpath = '{.items[0].metadata.name}' ) 8080 :8080 &
如果一切都已经启动并准备就绪,您就可以访问Vistio UI,开始探索服务网格网络,访问http://localhost:8080 您将会看到类似下图的输出。
-图片 - vistio视图动画
+图片 - vistio视图动画
更多详细内容请参考Vistio—使用Netflix的Vizceral可视化Istio service mesh 。
Kiali
Kiali是一个用于提供Istio service mesh观察性的项目,更多信息请查看 https://kiali.io 。
@@ -4769,7 +4769,7 @@ kubectl -n default port-forward 图片 - Kiali页面
+图片 - Kiali页面
注意 :Kilia使用Jaeger做追踪,请不用屏蔽kilia页面的弹出窗口。
Weave scope
Weave scope 可用于监控、可视化和管理Docker&Kubernetes集群,详情见 https://www.weave.works/oss/scope/
@@ -4779,7 +4779,7 @@ kubectl -n default port-forward 172.17.8.102 scope.weave.jimmysong.io
现在打开浏览器,访问 http://scope.weave.jimmysong.io/
-图片 - Scope页面
+图片 - Scope页面
管理
除了特别说明,以下命令都在当前的repo目录下操作。
挂起
@@ -4833,7 +4833,7 @@ vagrant ssh node3
Vistio—使用Netflix的Vizceral可视化Istio service mesh
@@ -4877,7 +4877,7 @@ vagrant ssh node3
diff --git a/cloud-native/cloud-native-philosophy.html b/cloud-native/cloud-native-philosophy.html
index a843b3849..9c7013703 100644
--- a/cloud-native/cloud-native-philosophy.html
+++ b/cloud-native/cloud-native-philosophy.html
@@ -4722,7 +4722,7 @@
“Cloud Native Infrastructure”, a Free O’Reilly eBook
@@ -4766,7 +4766,7 @@
diff --git a/cloud-native/cloud-native-programming-language-ballerina.html b/cloud-native/cloud-native-programming-language-ballerina.html
index b999a9690..ccc3143db 100644
--- a/cloud-native/cloud-native-programming-language-ballerina.html
+++ b/cloud-native/cloud-native-programming-language-ballerina.html
@@ -4576,7 +4576,7 @@
云原生编程语言 Ballerina
当我第一眼看到 Ballerina 还真有点惊艳的感觉。Ballerina 这个单词的意思是“芭蕾舞女演员”。我想他们之所以给公司和这们语言起这个名字,可能是希望它成为云原生这个大舞台中,Ballerina 能像一个灵活的芭蕾舞者一样轻松自如吧!
Ballerina 是一款开源的编译式的强类型语言,该语言本身的代码可以通过 GitHub 上获取。我们可以通过 Ballerina 官网上的设计哲学页面来对这门云原生编程语言一探究竟。
-图片 - 云原生编程语言ballerina
+图片 - 云原生编程语言ballerina
未来的应用程序应该是基于 API 的,而众多 API 之间的通讯和集成就成了关键问题。Ballerina 是一款使用文本和图形语法编译的、事务的、静态和强类型编程语言。Ballerina 包含分布式系统集成到语言的基本概念,并提供类型安全,并发环境下实现的分布式事务,可靠的消息传递,流处理和工作流。
为什么创建 Ballerina?
与 ESB 集成仍然是瀑布式开发。你必须部署服务器,配置连接器,使用 XML 编程服务逻辑以及使用 XPath 查询和转换数据。这不是开发者友好的。
@@ -4584,7 +4584,7 @@
ESB、EAI、BPM 和 DSL 需要 XML 和配置来中断迭代开发流程:编辑、构建、运行和测试。这与运行实际应用之间是有一条鸿沟的,而云原生编程语言 Ballerina 的出现就是为了解决这条“集成鸿沟”的。
Ballerina 设计理念
序列图
-图片 - 云原生编程语言Ballerina的序列图设计理念
+图片 - 云原生编程语言Ballerina的序列图设计理念
语言灵感
序列图反映了设计开发人员记录的互联的系统。Ballerina 的语法和高效的编码模式要求开发人员使用强大的交互最佳实践来编码。
序列图可视化
@@ -4592,7 +4592,7 @@
Actor 与 action
客户端、worker 和远程系统在 Ballerina 的序列图中以不同的 actor 表示。在代码中,远程端点通过连接器进行连接,连接器提供类型安全操作。在图形上,每个连接器在序列图中表示为一个 actor(即一条垂直线),action 表示为与这些actor 的交互。
并发
-图片 - 云原生编程语言Ballerina的并发理念
+图片 - 云原生编程语言Ballerina的并发理念
序列图和并发
Ballerina 的并发模型是并行优先的,因为与远程方的交互总是涉及多个 worker。Worker 之间的交互作为消息传递进行处理,它们之间没有共享状态。
Worker 语义
@@ -4636,7 +4636,7 @@ type myObject object {
Ballerina 如何工作?
Ballerina 的语法、代码和编译器创建了运行时服务和部署构件,这些工件都是云原生就绪的,您可以选择将其部署在 IaaS、编排系统或 service mesh 中的。开发人员的体验旨在维护流程,包括快速的编辑、构建、调试周期并集成到团队的生命周期工具链中。
运行时架构
-图片 - 云原生编程语言ballerina运行时架构
+图片 - 云原生编程语言ballerina运行时架构
Ballerina API 网关
强制执行身份策略并保证性能。通过代码注解(类似于 Spring 中的注解)进行配置和部署。可以运行嵌入式服务、作为管理多个服务的容器代理或者使用 API 管理解决方案(如 WSO2 API Manager)。
Ballerina service
@@ -4646,7 +4646,7 @@ type myObject object {
消息代理、事务协调者和身份代理
为参与事务、事件驱动的通信和为认证流程的 Ballerina 服务提供代理基础设施功能。这些组件可以嵌入到单个服务部署中或者进行单独部署和扩展以管理多个服务。
部署架构
-图片 - 云原生编程语言ballerina部署架构图
+图片 - 云原生编程语言ballerina部署架构图
IaaS
使用代码注解和构建系统,可以打包 Ballerina 服务和其他运行时组件(如 API 网关)以部署到任何云原生环境中。在 IaaS 环境中,Ballerina 服务可以以虚拟机或容器的方式运行,也可以在构建期间将镜像推送到 registry 中。
编排器
@@ -4654,7 +4654,7 @@ type myObject object {
Service mesh
Ballerina 可以选择断路器和事务流程逻辑委托给像 Istio 或 Envoy 这样的 service mesh(如果有的话)。如果没有 service mesh 的话,Ballerina 服务将嵌入相应的功能。
生命周期
-图片 - 云原生编程语言ballerina生命周期架构图
+图片 - 云原生编程语言ballerina生命周期架构图
Ballerina 工具
使用我们的语言服务器可以在 VS Code 和 IntelliJ 中获取自动补全和调试等智能感知。Ballerina 的关键字和语法结构可以用序列图的方式来表示。使用 Ballerina Composer 可以可视化的编辑 Ballerina 代码。另外它也可以做可视化得运行时和开发环境追踪。
Ballerina 构建
@@ -4692,7 +4692,7 @@ type myObject object {
Microservices, Docker, Kubernetes, Serverless, Service Mesh, and Beyond
@@ -4736,7 +4736,7 @@ type myObject object {
diff --git a/cloud-native/cloud-native-programming-language-pulumi.html b/cloud-native/cloud-native-programming-language-pulumi.html
index 083d3de4e..a28015103 100644
--- a/cloud-native/cloud-native-programming-language-pulumi.html
+++ b/cloud-native/cloud-native-programming-language-pulumi.html
@@ -4576,7 +4576,7 @@
云原生编程语言Pulumi
2018年6月18日 Joe Duffy在他的博客 中宣布开源了云原生编程语言Pulumi 。这是继Ballerina 之后我看到的另一款云原生编程语言,他们之间有一些共同的特点,例如都是为了支持多种云环境,基于不可变基础设施和基础设施即代码的理念构建,使云原生应用的集成更加方便,但也有一些不同,Ballerina是直接创建了一个基于JVM的语言,而Pulumi是为不同编程语言构建了SDK。
下文部分来自Joe Duffy的博客Hello, Pulumi !
-图片 - 云原生编程语言Pulumi
+图片 - 云原生编程语言Pulumi
TL;DR 有了Pulumi,38页的手动操作说明将变成了38行代码。25000行YAML配置变成了使用真实编程语言的500行语句。
Pulumi的整个运行时、CLI、支持的库都可以在GitHub上免费下载。我们的团队正急切的等待您的反馈。与此同时,我需要告诉您一些关于Pulumi的事情,为什么我们会创造它。
Pulumi是什么?
@@ -4677,7 +4677,7 @@ serverless. cloudwatchHello, Pulumi!
@@ -4721,7 +4721,7 @@ serverless. cloudwatch加入中国最大的有技术、有温度、有情怀的云原生社区
Copyright © 2017-2020 | Distributed under CC BY 4.0 | jimmysong.io ","modify_label":" Updated at ","modify_format":"YYYY-MM-DD HH:mm:ss"},"prism":{"css":["prism-themes/themes/prism-ghcolors.css"]},"github":{"url":"https://github.com/rootsongjc/kubernetes-handbook"},"editlink":{"label":"编辑本页","multilingual":false,"base":"https://github.com/rootsongjc/kubernetes-handbook/blob/master/"},"splitter":{},"codesnippet":{},"sitemap-general":{"prefix":"https://jimmysong.io/kubernetes-handbook/"},"fontsettings":{"theme":"white","family":"sans","size":2},"favicon":{"shortcut":"favicon.ico","bookmark":"favicon.ico"},"lightbox":{"jquery":true,"sameUuid":false},"page-toc-button":{},"back-to-top-button":{},"prism-themes":{},"alerts":{},"github-buttons":{"repo":"rootsongjc/kubernetes-handbook","types":["star"],"size":"small"},"3-ba":{"configuration":"auto","token":"11f7d254cfa4e0ca44b175c66d379ecc"},"copy-code-button":{},"ga":{"configuration":"auto","token":"UA-93485976-1"},"sharing":{"facebook":true,"twitter":true,"google":false,"weibo":false,"instapaper":false,"vk":false,"all":["facebook","google","twitter","weibo","instapaper"]},"theme-default":{"showLevel":true,"styles":{"ebook":"styles/ebook.css","epub":"styles/epub.css","mobi":"styles/mobi.css","pdf":"styles/pdf.css","print":"styles/print.css","website":"styles/website.css"}},"search-plus":{},"image-captions":{"caption":"图片 - _CAPTION_","variable_name":"_pictures"}},"theme":"default","author":"Jimmy Song(宋净超)","pdf":{"pageNumbers":true,"fontSize":12,"fontFamily":"Arial","paperSize":"a4","chapterMark":"pagebreak","pageBreaksBefore":"/","margin":{"right":62,"left":62,"top":56,"bottom":56}},"structure":{"langs":"LANGS.md","readme":"README.md","glossary":"GLOSSARY.md","summary":"SUMMARY.md"},"variables":{"_pictures":[{"backlink":"index.html#fig1.1.1","level":"1.1","list_caption":"Figure: Stargazers over time","alt":"Stargazers over time","nro":1,"url":"https://starcharts.herokuapp.com/rootsongjc/kubernetes-handbook.svg","index":1,"caption_template":"图片 - _CAPTION_","label":"Stargazers over time","attributes":{},"skip":false,"key":"1.1.1"},{"backlink":"cloud-native/play-with-kubernetes.html#fig2.3.1","level":"2.3","list_caption":"Figure: Play with Kubernetes网页截图","alt":"Play with Kubernetes网页截图","nro":2,"url":"../images/play-with-kubernetes.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Play with Kubernetes网页截图","attributes":{},"skip":false,"key":"2.3.1"},{"backlink":"cloud-native/cloud-native-local-quick-start.html#fig2.4.1","level":"2.4","list_caption":"Figure: Kubernetes dashboard","alt":"Kubernetes dashboard","nro":3,"url":"https://github.com/rootsongjc/kubernetes-vagrant-centos-cluster/raw/master/images/dashboard-animation.gif","index":1,"caption_template":"图片 - _CAPTION_","label":"Kubernetes dashboard","attributes":{},"skip":false,"key":"2.4.1"},{"backlink":"cloud-native/cloud-native-local-quick-start.html#fig2.4.2","level":"2.4","list_caption":"Figure: Grafana","alt":"Grafana","nro":4,"url":"https://github.com/rootsongjc/kubernetes-vagrant-centos-cluster/raw/master/images/grafana-animation.gif","index":2,"caption_template":"图片 - _CAPTION_","label":"Grafana","attributes":{},"skip":false,"key":"2.4.2"},{"backlink":"cloud-native/cloud-native-local-quick-start.html#fig2.4.3","level":"2.4","list_caption":"Figure: Traefik dashboard","alt":"Traefik dashboard","nro":5,"url":"https://github.com/rootsongjc/kubernetes-vagrant-centos-cluster/raw/master/images/traefik-ingress.gif","index":3,"caption_template":"图片 - _CAPTION_","label":"Traefik dashboard","attributes":{},"skip":false,"key":"2.4.3"},{"backlink":"cloud-native/cloud-native-local-quick-start.html#fig2.4.4","level":"2.4","list_caption":"Figure: bookinfo示例","alt":"bookinfo示例","nro":6,"url":"https://github.com/rootsongjc/kubernetes-vagrant-centos-cluster/raw/master/images/bookinfo-demo.gif","index":4,"caption_template":"图片 - _CAPTION_","label":"bookinfo示例","attributes":{},"skip":false,"key":"2.4.4"},{"backlink":"cloud-native/cloud-native-local-quick-start.html#fig2.4.5","level":"2.4","list_caption":"Figure: vistio视图动画","alt":"vistio视图动画","nro":7,"url":"https://github.com/rootsongjc/kubernetes-vagrant-centos-cluster/raw/master/images/vistio-animation.gif","index":5,"caption_template":"图片 - _CAPTION_","label":"vistio视图动画","attributes":{},"skip":false,"key":"2.4.5"},{"backlink":"cloud-native/cloud-native-local-quick-start.html#fig2.4.6","level":"2.4","list_caption":"Figure: Kiali页面","alt":"Kiali页面","nro":8,"url":"https://github.com/rootsongjc/kubernetes-vagrant-centos-cluster/raw/master/images/kiali.gif","index":6,"caption_template":"图片 - _CAPTION_","label":"Kiali页面","attributes":{},"skip":false,"key":"2.4.6"},{"backlink":"cloud-native/cloud-native-local-quick-start.html#fig2.4.7","level":"2.4","list_caption":"Figure: Scope页面","alt":"Scope页面","nro":9,"url":"https://github.com/rootsongjc/kubernetes-vagrant-centos-cluster/raw/master/images/weave-scope-animation.gif","index":7,"caption_template":"图片 - _CAPTION_","label":"Scope页面","attributes":{},"skip":false,"key":"2.4.7"},{"backlink":"cloud-native/setup-kubernetes-with-rancher-and-aliyun.html#fig2.5.1","level":"2.5","list_caption":"Figure: Rancher 界面","alt":"Rancher 界面","nro":10,"url":"../images/rancher-web.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Rancher 界面","attributes":{},"skip":false,"key":"2.5.1"},{"backlink":"cloud-native/setup-kubernetes-with-rancher-and-aliyun.html#fig2.5.2","level":"2.5","list_caption":"Figure: 自定义节点信息","alt":"自定义节点信息","nro":11,"url":"../images/rancher-customize-node.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"自定义节点信息","attributes":{},"skip":false,"key":"2.5.2"},{"backlink":"cloud-native/setup-kubernetes-with-rancher-and-aliyun.html#fig2.5.3","level":"2.5","list_caption":"Figure: Rancher 集群监控页面","alt":"Rancher 集群监控页面","nro":12,"url":"../images/rancher-cluster.jpg","index":3,"caption_template":"图片 - _CAPTION_","label":"Rancher 集群监控页面","attributes":{},"skip":false,"key":"2.5.3"},{"backlink":"cloud-native/kubernetes-and-cloud-native-app-overview.html#fig2.6.1","level":"2.6","list_caption":"Figure: 云计算演进历程","alt":"云计算演进历程","nro":13,"url":"../images/cloud-computing-evolution-road.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"云计算演进历程","attributes":{},"skip":false,"key":"2.6.1"},{"backlink":"cloud-native/kubernetes-and-cloud-native-app-overview.html#fig2.6.2","level":"2.6","list_caption":"Figure: 来自Twitter @MarcWilczek","alt":"来自Twitter @MarcWilczek","nro":14,"url":"../images/cloud-native-comes-of-age.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"来自Twitter @MarcWilczek","attributes":{},"skip":false,"key":"2.6.2"},{"backlink":"cloud-native/kubernetes-and-cloud-native-app-overview.html#fig2.6.3","level":"2.6","list_caption":"Figure: Cloud native思维导图","alt":"Cloud native思维导图","nro":15,"url":"../images/cloud-native-architecutre-mindnode.jpg","index":3,"caption_template":"图片 - _CAPTION_","label":"Cloud native思维导图","attributes":{},"skip":false,"key":"2.6.3"},{"backlink":"cloud-native/kubernetes-and-cloud-native-app-overview.html#fig2.6.4","level":"2.6","list_caption":"Figure: 十二因素应用","alt":"十二因素应用","nro":16,"url":"../images/12-factor-app.png","index":4,"caption_template":"图片 - _CAPTION_","label":"十二因素应用","attributes":{},"skip":false,"key":"2.6.4"},{"backlink":"cloud-native/kubernetes-and-cloud-native-app-overview.html#fig2.6.5","level":"2.6","list_caption":"Figure: 容器生态","alt":"容器生态","nro":17,"url":"../images/container-ecosystem.png","index":5,"caption_template":"图片 - _CAPTION_","label":"容器生态","attributes":{},"skip":false,"key":"2.6.5"},{"backlink":"cloud-native/kubernetes-and-cloud-native-app-overview.html#fig2.6.6","level":"2.6","list_caption":"Figure: 使用Jenkins进行持续集成与发布流程图","alt":"使用Jenkins进行持续集成与发布流程图","nro":18,"url":"../images/kubernetes-jenkins-ci-cd.png","index":6,"caption_template":"图片 - _CAPTION_","label":"使用Jenkins进行持续集成与发布流程图","attributes":{},"skip":false,"key":"2.6.6"},{"backlink":"cloud-native/kubernetes-and-cloud-native-app-overview.html#fig2.6.7","level":"2.6","list_caption":"Figure: filebeat日志收集架构图","alt":"filebeat日志收集架构图","nro":19,"url":"../images/filebeat-log-collector-arch.png","index":7,"caption_template":"图片 - _CAPTION_","label":"filebeat日志收集架构图","attributes":{},"skip":false,"key":"2.6.7"},{"backlink":"cloud-native/kubernetes-and-cloud-native-app-overview.html#fig2.6.8","level":"2.6","list_caption":"Figure: API文档","alt":"API文档","nro":20,"url":"../images/k8s-app-monitor-test-api-doc.jpg","index":8,"caption_template":"图片 - _CAPTION_","label":"API文档","attributes":{},"skip":false,"key":"2.6.8"},{"backlink":"cloud-native/kubernetes-and-cloud-native-app-overview.html#fig2.6.9","level":"2.6","list_caption":"Figure: 迁移步骤示意图","alt":"迁移步骤示意图","nro":21,"url":"../images/migrating-hadoop-yarn-to-kubernetes.png","index":9,"caption_template":"图片 - _CAPTION_","label":"迁移步骤示意图","attributes":{},"skip":false,"key":"2.6.9"},{"backlink":"cloud-native/kubernetes-and-cloud-native-app-overview.html#fig2.6.10","level":"2.6","list_caption":"Figure: service mesh架构图","alt":"service mesh架构图","nro":22,"url":"../images/serivce-mesh-control-plane.png","index":10,"caption_template":"图片 - _CAPTION_","label":"service mesh架构图","attributes":{},"skip":false,"key":"2.6.10"},{"backlink":"cloud-native/kubernetes-and-cloud-native-app-overview.html#fig2.6.11","level":"2.6","list_caption":"Figure: kibana界面","alt":"kibana界面","nro":23,"url":"../images/filebeat-docker-test.jpg","index":11,"caption_template":"图片 - _CAPTION_","label":"kibana界面","attributes":{},"skip":false,"key":"2.6.11"},{"backlink":"cloud-native/kubernetes-and-cloud-native-app-overview.html#fig2.6.12","level":"2.6","list_caption":"Figure: Grafana界面示意图1","alt":"Grafana界面示意图1","nro":24,"url":"../images/kubernetes-devops-example-grafana-1.png","index":12,"caption_template":"图片 - _CAPTION_","label":"Grafana界面示意图1","attributes":{},"skip":false,"key":"2.6.12"},{"backlink":"cloud-native/kubernetes-and-cloud-native-app-overview.html#fig2.6.13","level":"2.6","list_caption":"Figure: Grafana界面示意图2","alt":"Grafana界面示意图2","nro":25,"url":"../images/kubernetes-devops-example-grafana-2.png","index":13,"caption_template":"图片 - _CAPTION_","label":"Grafana界面示意图2","attributes":{},"skip":false,"key":"2.6.13"},{"backlink":"cloud-native/kubernetes-and-cloud-native-app-overview.html#fig2.6.14","level":"2.6","list_caption":"Figure: Grafana界面示意图3","alt":"Grafana界面示意图3","nro":26,"url":"../images/kubernetes-devops-example-grafana-3.png","index":14,"caption_template":"图片 - _CAPTION_","label":"Grafana界面示意图3","attributes":{},"skip":false,"key":"2.6.14"},{"backlink":"cloud-native/kubernetes-and-cloud-native-app-overview.html#fig2.6.15","level":"2.6","list_caption":"Figure: dashboard","alt":"dashboard","nro":27,"url":"../images/spark-job-on-kubernetes-example-1.jpg","index":15,"caption_template":"图片 - _CAPTION_","label":"dashboard","attributes":{},"skip":false,"key":"2.6.15"},{"backlink":"cloud-native/kubernetes-and-cloud-native-app-overview.html#fig2.6.16","level":"2.6","list_caption":"Figure: Grafana","alt":"Grafana","nro":28,"url":"../images/spark-job-on-kubernetes-example-2.jpg","index":16,"caption_template":"图片 - _CAPTION_","label":"Grafana","attributes":{},"skip":false,"key":"2.6.16"},{"backlink":"cloud-native/from-kubernetes-to-cloud-native.html#fig2.7.1","level":"2.7","list_caption":"Figure: 容器生态图 Container ecosystem","alt":"容器生态图 Container ecosystem","nro":29,"url":"../images/container-ecosystem.png","index":1,"caption_template":"图片 - _CAPTION_","label":"容器生态图 Container ecosystem","attributes":{},"skip":false,"key":"2.7.1"},{"backlink":"cloud-native/from-kubernetes-to-cloud-native.html#fig2.7.2","level":"2.7","list_caption":"Figure: Kubernetes架构","alt":"Kubernetes架构","nro":30,"url":"../images/kubernetes-high-level-component-archtecture.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"Kubernetes架构","attributes":{},"skip":false,"key":"2.7.2"},{"backlink":"cloud-native/from-kubernetes-to-cloud-native.html#fig2.7.3","level":"2.7","list_caption":"Figure: Cloud Native Core target","alt":"Cloud Native Core target","nro":31,"url":"../images/cloud-native-core-target.jpg","index":3,"caption_template":"图片 - _CAPTION_","label":"Cloud Native Core target","attributes":{},"skip":false,"key":"2.7.3"},{"backlink":"cloud-native/from-kubernetes-to-cloud-native.html#fig2.7.4","level":"2.7","list_caption":"Figure: FaaS Landscape","alt":"FaaS Landscape","nro":32,"url":"../images/redpoint-faas-landscape.jpg","index":4,"caption_template":"图片 - _CAPTION_","label":"FaaS Landscape","attributes":{},"skip":false,"key":"2.7.4"},{"backlink":"cloud-native/from-kubernetes-to-cloud-native.html#fig2.7.5","level":"2.7","list_caption":"Figure: Workloads running on Kubernetes","alt":"Workloads running on Kubernetes","nro":33,"url":"../images/0069RVTdgy1fv5mxr6fxtj31kw11q484.jpg","index":5,"caption_template":"图片 - _CAPTION_","label":"Workloads running on Kubernetes","attributes":{},"skip":false,"key":"2.7.5"},{"backlink":"cloud-native/from-kubernetes-to-cloud-native.html#fig2.7.6","level":"2.7","list_caption":"Figure: Gartner技术爆发趋势图2017","alt":"Gartner技术爆发趋势图2017","nro":34,"url":"../images/0069RVTdgy1fv5my2jtxzj315o0z8dkr.jpg","index":6,"caption_template":"图片 - _CAPTION_","label":"Gartner技术爆发趋势图2017","attributes":{},"skip":false,"key":"2.7.6"},{"backlink":"cloud-native/from-kubernetes-to-cloud-native.html#fig2.7.7","level":"2.7","list_caption":"Figure: Microservices concerns","alt":"Microservices concerns","nro":35,"url":"../images/microservices-concerns.jpg","index":7,"caption_template":"图片 - _CAPTION_","label":"Microservices concerns","attributes":{},"skip":false,"key":"2.7.7"},{"backlink":"cloud-native/from-kubernetes-to-cloud-native.html#fig2.7.8","level":"2.7","list_caption":"Figure: 两种服务发现方式","alt":"两种服务发现方式","nro":36,"url":"../images/service-discovery-in-microservices.png","index":8,"caption_template":"图片 - _CAPTION_","label":"两种服务发现方式","attributes":{},"skip":false,"key":"2.7.8"},{"backlink":"cloud-native/from-kubernetes-to-cloud-native.html#fig2.7.9","level":"2.7","list_caption":"Figure: Cloud Native Features","alt":"Cloud Native Features","nro":37,"url":"https://jimmysong.io/kubernetes-handbook/images/cloud-native-architecutre-mindnode.jpg","index":9,"caption_template":"图片 - _CAPTION_","label":"Cloud Native Features","attributes":{},"skip":false,"key":"2.7.9"},{"backlink":"cloud-native/from-kubernetes-to-cloud-native.html#fig2.7.10","level":"2.7","list_caption":"Figure: Cloud Native Landscape v1.0","alt":"Cloud Native Landscape v1.0","nro":38,"url":"../images/0069RVTdgy1fv5myp6ednj31kw0w0u0x.jpg","index":10,"caption_template":"图片 - _CAPTION_","label":"Cloud Native Landscape v1.0","attributes":{},"skip":false,"key":"2.7.10"},{"backlink":"cloud-native/from-kubernetes-to-cloud-native.html#fig2.7.11","level":"2.7","list_caption":"Figure: Building a Cloud Native Architecture with Kubernetes followed 12 factor app","alt":"Building a Cloud Native Architecture with Kubernetes followed 12 factor app","nro":39,"url":"../images/building-cloud-native-architecture-with-kubernetes.png","index":11,"caption_template":"图片 - _CAPTION_","label":"Building a Cloud Native Architecture with Kubernetes followed 12 factor app","attributes":{},"skip":false,"key":"2.7.11"},{"backlink":"cloud-native/from-kubernetes-to-cloud-native.html#fig2.7.12","level":"2.7","list_caption":"Figure: Creating Kubernetes native app","alt":"Creating Kubernetes native app","nro":40,"url":"../images/creating-kubernetes-native-app.jpg","index":12,"caption_template":"图片 - _CAPTION_","label":"Creating Kubernetes native app","attributes":{},"skip":false,"key":"2.7.12"},{"backlink":"cloud-native/from-kubernetes-to-cloud-native.html#fig2.7.13","level":"2.7","list_caption":"Figure: istio vs linkerd","alt":"istio vs linkerd","nro":41,"url":"../images/istio-vs-linkerd.jpg","index":13,"caption_template":"图片 - _CAPTION_","label":"istio vs linkerd","attributes":{},"skip":false,"key":"2.7.13"},{"backlink":"cloud-native/from-kubernetes-to-cloud-native.html#fig2.7.14","level":"2.7","list_caption":"Figure: Deployment pipeline","alt":"Deployment pipeline","nro":42,"url":"../images/0069RVTdgy1fv5mzj8rj6j318g1ewtfc.jpg","index":14,"caption_template":"图片 - _CAPTION_","label":"Deployment pipeline","attributes":{},"skip":false,"key":"2.7.14"},{"backlink":"cloud-native/from-kubernetes-to-cloud-native.html#fig2.7.15","level":"2.7","list_caption":"Figure: Spark on Kubernetes with different schedulers","alt":"Spark on Kubernetes with different schedulers","nro":43,"url":"../images/spark-on-kubernetes-with-different-schedulers.jpg","index":15,"caption_template":"图片 - _CAPTION_","label":"Spark on Kubernetes with different schedulers","attributes":{},"skip":false,"key":"2.7.15"},{"backlink":"cloud-native/from-kubernetes-to-cloud-native.html#fig2.7.16","level":"2.7","list_caption":"Figure: Kubernetes solutions","alt":"Kubernetes solutions","nro":44,"url":"../images/0069RVTdgy1fv5mzywc83j31fk1i8qg4.jpg","index":16,"caption_template":"图片 - _CAPTION_","label":"Kubernetes solutions","attributes":{},"skip":false,"key":"2.7.16"},{"backlink":"cloud-native/from-kubernetes-to-cloud-native.html#fig2.7.17","level":"2.7","list_caption":"Figure: Kubernetes SIG","alt":"Kubernetes SIG","nro":45,"url":"../images/kubernetes-sigs.jpg","index":17,"caption_template":"图片 - _CAPTION_","label":"Kubernetes SIG","attributes":{},"skip":false,"key":"2.7.17"},{"backlink":"cloud-native/cloud-native-programming-language-ballerina.html#fig2.8.1.1","level":"2.8.1","list_caption":"Figure: 云原生编程语言ballerina","alt":"云原生编程语言ballerina","nro":46,"url":"../images/philosophy-page-diagrams-top.png","index":1,"caption_template":"图片 - _CAPTION_","label":"云原生编程语言ballerina","attributes":{},"skip":false,"key":"2.8.1.1"},{"backlink":"cloud-native/cloud-native-programming-language-ballerina.html#fig2.8.1.2","level":"2.8.1","list_caption":"Figure: 云原生编程语言Ballerina的序列图设计理念","alt":"云原生编程语言Ballerina的序列图设计理念","nro":47,"url":"../images/philosophy-principle-diagrams-01.png","index":2,"caption_template":"图片 - _CAPTION_","label":"云原生编程语言Ballerina的序列图设计理念","attributes":{},"skip":false,"key":"2.8.1.2"},{"backlink":"cloud-native/cloud-native-programming-language-ballerina.html#fig2.8.1.3","level":"2.8.1","list_caption":"Figure: 云原生编程语言Ballerina的并发理念","alt":"云原生编程语言Ballerina的并发理念","nro":48,"url":"../images/philosophy-principle-diagrams-02.png","index":3,"caption_template":"图片 - _CAPTION_","label":"云原生编程语言Ballerina的并发理念","attributes":{},"skip":false,"key":"2.8.1.3"},{"backlink":"cloud-native/cloud-native-programming-language-ballerina.html#fig2.8.1.4","level":"2.8.1","list_caption":"Figure: 云原生编程语言ballerina运行时架构","alt":"云原生编程语言ballerina运行时架构","nro":49,"url":"../images/philosophy-diagrams-for-site-02.png","index":4,"caption_template":"图片 - _CAPTION_","label":"云原生编程语言ballerina运行时架构","attributes":{},"skip":false,"key":"2.8.1.4"},{"backlink":"cloud-native/cloud-native-programming-language-ballerina.html#fig2.8.1.5","level":"2.8.1","list_caption":"Figure: 云原生编程语言ballerina部署架构图","alt":"云原生编程语言ballerina部署架构图","nro":50,"url":"../images/philosophy-diagrams-for-site-03.png","index":5,"caption_template":"图片 - _CAPTION_","label":"云原生编程语言ballerina部署架构图","attributes":{},"skip":false,"key":"2.8.1.5"},{"backlink":"cloud-native/cloud-native-programming-language-ballerina.html#fig2.8.1.6","level":"2.8.1","list_caption":"Figure: 云原生编程语言ballerina生命周期架构图","alt":"云原生编程语言ballerina生命周期架构图","nro":51,"url":"../images/philosophy-diagrams-for-site-04.png","index":6,"caption_template":"图片 - _CAPTION_","label":"云原生编程语言ballerina生命周期架构图","attributes":{},"skip":false,"key":"2.8.1.6"},{"backlink":"cloud-native/cloud-native-programming-language-pulumi.html#fig2.8.2.1","level":"2.8.2","list_caption":"Figure: 云原生编程语言Pulumi","alt":"云原生编程语言Pulumi","nro":52,"url":"../images/00704eQkgy1fsm4v0a6qwj30xc0m8t9d.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"云原生编程语言Pulumi","attributes":{},"skip":false,"key":"2.8.2.1"},{"backlink":"cloud-native/the-future-of-cloud-native.html#fig2.9.1","level":"2.9","list_caption":"Figure: Kubernetes 云原生的操作系统","alt":"Kubernetes 云原生的操作系统","nro":53,"url":"../images/00704eQkgy1frr4z08j6oj31p20w2n6n.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Kubernetes 云原生的操作系统","attributes":{},"skip":false,"key":"2.9.1"},{"backlink":"cloud-native/the-future-of-cloud-native.html#fig2.9.2","level":"2.9","list_caption":"Figure: 操作系统层次","alt":"操作系统层次","nro":54,"url":"../images/00704eQkgy1frr52hl4eaj31qy15en74.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"操作系统层次","attributes":{},"skip":false,"key":"2.9.2"},{"backlink":"cloud-native/the-future-of-cloud-native.html#fig2.9.3","level":"2.9","list_caption":"Figure: 云原生景观图","alt":"云原生景观图","nro":55,"url":"../images/00704eQkgy1frr53j3aiuj32fs1dc7wi.jpg","index":3,"caption_template":"图片 - _CAPTION_","label":"云原生景观图","attributes":{},"skip":false,"key":"2.9.3"},{"backlink":"cloud-native/the-future-of-cloud-native.html#fig2.9.4","level":"2.9","list_caption":"Figure: KubeVirt架构图","alt":"KubeVirt架构图","nro":56,"url":"../images/00704eQkgy1frr54de5oyj31qw14qn2x.jpg","index":4,"caption_template":"图片 - _CAPTION_","label":"KubeVirt架构图","attributes":{},"skip":false,"key":"2.9.4"},{"backlink":"cloud-native/the-future-of-cloud-native.html#fig2.9.5","level":"2.9","list_caption":"Figure: Kubernetes中的资源隔离","alt":"Kubernetes中的资源隔离","nro":57,"url":"../images/00704eQkgy1frr54ztql2j329q0zwwlf.jpg","index":5,"caption_template":"图片 - _CAPTION_","label":"Kubernetes中的资源隔离","attributes":{},"skip":false,"key":"2.9.5"},{"backlink":"cloud-native/the-future-of-cloud-native.html#fig2.9.6","level":"2.9","list_caption":"Figure: OpenEBS 控制平面架构","alt":"OpenEBS 控制平面架构","nro":58,"url":"../images/00704eQkgy1frr56m7z2sj31y010y17y.jpg","index":6,"caption_template":"图片 - _CAPTION_","label":"OpenEBS 控制平面架构","attributes":{},"skip":false,"key":"2.9.6"},{"backlink":"cloud-native/the-future-of-cloud-native.html#fig2.9.7","level":"2.9","list_caption":"Figure: OpenEBS 的存储卷管理","alt":"OpenEBS 的存储卷管理","nro":59,"url":"../images/00704eQkgy1frr57nm2mnj31xk11qqej.jpg","index":7,"caption_template":"图片 - _CAPTION_","label":"OpenEBS 的存储卷管理","attributes":{},"skip":false,"key":"2.9.7"},{"backlink":"cloud-native/the-future-of-cloud-native.html#fig2.9.8","level":"2.9","list_caption":"Figure: Hadoop YARN 迁移到 Kubernetes的示例","alt":"Hadoop YARN 迁移到 Kubernetes的示例","nro":60,"url":"../images/00704eQkgy1frr58ebf2lj323o11219r.jpg","index":8,"caption_template":"图片 - _CAPTION_","label":"Hadoop YARN 迁移到 Kubernetes的示例","attributes":{},"skip":false,"key":"2.9.8"},{"backlink":"cloud-native/the-future-of-cloud-native.html#fig2.9.9","level":"2.9","list_caption":"Figure: Spark on Yarn with Kubernetes","alt":"Spark on Yarn with Kubernetes","nro":61,"url":"../images/00704eQkgy1frr59gzzwsj32gg16k4qp.jpg","index":9,"caption_template":"图片 - _CAPTION_","label":"Spark on Yarn with Kubernetes","attributes":{},"skip":false,"key":"2.9.9"},{"backlink":"cloud-native/the-future-of-cloud-native.html#fig2.9.10","level":"2.9","list_caption":"Figure: 云原生与12因素应用","alt":"云原生与12因素应用","nro":62,"url":"../images/00704eQkgy1frr5arzvetj31no12mdre.jpg","index":10,"caption_template":"图片 - _CAPTION_","label":"云原生与12因素应用","attributes":{},"skip":false,"key":"2.9.10"},{"backlink":"cloud-native/the-future-of-cloud-native.html#fig2.9.11","level":"2.9","list_caption":"Figure: 云原生编程语言","alt":"云原生编程语言","nro":63,"url":"../images/00704eQkgy1frr5c8bwmtj31ou152qc3.jpg","index":11,"caption_template":"图片 - _CAPTION_","label":"云原生编程语言","attributes":{},"skip":false,"key":"2.9.11"},{"backlink":"cloud-native/the-future-of-cloud-native.html#fig2.9.12","level":"2.9","list_caption":"Figure: Gitkube","alt":"Gitkube","nro":64,"url":"../images/00704eQkgy1frr5bulhuhj329m10iwua.jpg","index":12,"caption_template":"图片 - _CAPTION_","label":"Gitkube","attributes":{},"skip":false,"key":"2.9.12"},{"backlink":"cloud-native/the-future-of-cloud-native.html#fig2.9.13","level":"2.9","list_caption":"Figure: Kuberentes中的流量管理","alt":"Kuberentes中的流量管理","nro":65,"url":"../images/00704eQkgy1frr5dsurx6j320i140tpf.jpg","index":13,"caption_template":"图片 - _CAPTION_","label":"Kuberentes中的流量管理","attributes":{},"skip":false,"key":"2.9.13"},{"backlink":"cloud-native/the-future-of-cloud-native.html#fig2.9.14","level":"2.9","list_caption":"Figure: Istio Service Mesh架构图","alt":"Istio Service Mesh架构图","nro":66,"url":"../images/00704eQkgy1frr5exqm7kj320u18mh2t.jpg","index":14,"caption_template":"图片 - _CAPTION_","label":"Istio Service Mesh架构图","attributes":{},"skip":false,"key":"2.9.14"},{"backlink":"cloud-native/the-future-of-cloud-native.html#fig2.9.15","level":"2.9","list_caption":"Figure: Service Mesh架构","alt":"Service Mesh架构","nro":67,"url":"../images/00704eQkgy1frr5fxzoltj32f81akqr2.jpg","index":15,"caption_template":"图片 - _CAPTION_","label":"Service Mesh架构","attributes":{},"skip":false,"key":"2.9.15"},{"backlink":"cloud-native/the-future-of-cloud-native.html#fig2.9.16","level":"2.9","list_caption":"Figure: Envoy proxy架构图","alt":"Envoy proxy架构图","nro":68,"url":"../images/envoy-arch.png","index":16,"caption_template":"图片 - _CAPTION_","label":"Envoy proxy架构图","attributes":{},"skip":false,"key":"2.9.16"},{"backlink":"cloud-native/define-cloud-native-app.html#fig2.10.1","level":"2.10","list_caption":"Figure: 云原生应用模型","alt":"云原生应用模型","nro":69,"url":"../images/cloud-native-app-model.png","index":1,"caption_template":"图片 - _CAPTION_","label":"云原生应用模型","attributes":{},"skip":false,"key":"2.10.1"},{"backlink":"cloud-native/define-cloud-native-app.html#fig2.10.2","level":"2.10","list_caption":"Figure: 云原生应用模型中的目标角色","alt":"云原生应用模型中的目标角色","nro":70,"url":"../images/roles.png","index":2,"caption_template":"图片 - _CAPTION_","label":"云原生应用模型中的目标角色","attributes":{},"skip":false,"key":"2.10.2"},{"backlink":"concepts/index.html#fig3.1.1","level":"3.1","list_caption":"Figure: Borg架构","alt":"Borg架构","nro":71,"url":"../images/borg.png","index":1,"caption_template":"图片 - _CAPTION_","label":"Borg架构","attributes":{},"skip":false,"key":"3.1.1"},{"backlink":"concepts/index.html#fig3.1.2","level":"3.1","list_caption":"Figure: Kubernetes架构","alt":"Kubernetes架构","nro":72,"url":"../images/architecture.png","index":2,"caption_template":"图片 - _CAPTION_","label":"Kubernetes架构","attributes":{},"skip":false,"key":"3.1.2"},{"backlink":"concepts/index.html#fig3.1.3","level":"3.1","list_caption":"Figure: Kuberentes架构(图片来自于网络)","alt":"Kuberentes架构(图片来自于网络)","nro":73,"url":"../images/kubernetes-high-level-component-archtecture.jpg","index":3,"caption_template":"图片 - _CAPTION_","label":"Kuberentes架构(图片来自于网络)","attributes":{},"skip":false,"key":"3.1.3"},{"backlink":"concepts/index.html#fig3.1.4","level":"3.1","list_caption":"Figure: kubernetes整体架构示意图","alt":"kubernetes整体架构示意图","nro":74,"url":"../images/kubernetes-whole-arch.png","index":4,"caption_template":"图片 - _CAPTION_","label":"kubernetes整体架构示意图","attributes":{},"skip":false,"key":"3.1.4"},{"backlink":"concepts/index.html#fig3.1.5","level":"3.1","list_caption":"Figure: Kubernetes master架构示意图","alt":"Kubernetes master架构示意图","nro":75,"url":"../images/kubernetes-master-arch.png","index":5,"caption_template":"图片 - _CAPTION_","label":"Kubernetes master架构示意图","attributes":{},"skip":false,"key":"3.1.5"},{"backlink":"concepts/index.html#fig3.1.6","level":"3.1","list_caption":"Figure: kubernetes node架构示意图","alt":"kubernetes node架构示意图","nro":76,"url":"../images/kubernetes-node-arch.png","index":6,"caption_template":"图片 - _CAPTION_","label":"kubernetes node架构示意图","attributes":{},"skip":false,"key":"3.1.6"},{"backlink":"concepts/index.html#fig3.1.7","level":"3.1","list_caption":"Figure: Kubernetes分层架构示意图","alt":"Kubernetes分层架构示意图","nro":77,"url":"../images/kubernetes-layers-arch.png","index":7,"caption_template":"图片 - _CAPTION_","label":"Kubernetes分层架构示意图","attributes":{},"skip":false,"key":"3.1.7"},{"backlink":"concepts/concepts.html#fig3.1.1.1","level":"3.1.1","list_caption":"Figure: Kubernetes 分层架构示意图","alt":"Kubernetes 分层架构示意图","nro":78,"url":"../images/006tNc79ly1fzniqvmi51j31gq0s0q5u.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Kubernetes 分层架构示意图","attributes":{},"skip":false,"key":"3.1.1.1"},{"backlink":"concepts/open-interfaces.html#fig3.1.3.1","level":"3.1.3","list_caption":"Figure: 开放接口","alt":"开放接口","nro":79,"url":"../images/open-interfaces.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"开放接口","attributes":{},"skip":false,"key":"3.1.3.1"},{"backlink":"concepts/cri.html#fig3.1.3.1.1","level":"3.1.3.1","list_caption":"Figure: CRI架构-图片来自kubernetes blog","alt":"CRI架构-图片来自kubernetes blog","nro":80,"url":"../images/cri-architecture.png","index":1,"caption_template":"图片 - _CAPTION_","label":"CRI架构-图片来自kubernetes blog","attributes":{},"skip":false,"key":"3.1.3.1.1"},{"backlink":"concepts/flannel.html#fig3.2.1.1","level":"3.2.1","list_caption":"Figure: flannel网络架构(图片来自openshift)","alt":"flannel网络架构(图片来自openshift)","nro":81,"url":"../images/flannel-networking.png","index":1,"caption_template":"图片 - _CAPTION_","label":"flannel网络架构(图片来自openshift)","attributes":{},"skip":false,"key":"3.2.1.1"},{"backlink":"concepts/calico.html#fig3.2.2.1","level":"3.2.2","list_caption":"Figure: Calico","alt":"Calico","nro":82,"url":"../images/006tNc79gy1fz65bt7ieej30c90bsgn2.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Calico","attributes":{},"skip":false,"key":"3.2.2.1"},{"backlink":"concepts/calico.html#fig3.2.2.2","level":"3.2.2","list_caption":"Figure: CRI架构-图片来自https://www.jianshu.com/p/f0177b84de66","alt":"CRI架构-图片来自https://www.jianshu.com/p/f0177b84de66","nro":83,"url":"../images/calico.png","index":2,"caption_template":"图片 - _CAPTION_","label":"CRI架构-图片来自https://www.jianshu.com/p/f0177b84de66","attributes":{},"skip":false,"key":"3.2.2.2"},{"backlink":"concepts/cilium.html#fig3.2.3.1","level":"3.2.3","list_caption":"Figure: Cilium","alt":"Cilium","nro":84,"url":"../images/006tNbRwly1fwqi98i51ij30sc0j80zn.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Cilium","attributes":{},"skip":false,"key":"3.2.3.1"},{"backlink":"concepts/cilium-concepts.html#fig3.2.3.1.1","level":"3.2.3.1","list_caption":"Figure: Cilium 组件(来自 Cilium 官网)","alt":"Cilium 组件(来自 Cilium 官网)","nro":85,"url":"../images/006tNbRwly1fwztvhg0gmj318z143tdv.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Cilium 组件(来自 Cilium 官网)","attributes":{},"skip":false,"key":"3.2.3.1.1"},{"backlink":"concepts/cilium-concepts.html#fig3.2.3.1.2","level":"3.2.3.1","list_caption":"Figure: Cilium 网络配置策略","alt":"Cilium 网络配置策略","nro":86,"url":"../images/006tNbRwly1fwzreaalj6j30dz0dy3z3.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"Cilium 网络配置策略","attributes":{},"skip":false,"key":"3.2.3.1.2"},{"backlink":"concepts/pod-overview.html#fig3.4.1.1","level":"3.4.1","list_caption":"Figure: pod diagram","alt":"pod diagram","nro":87,"url":"../images/pod-overview.png","index":1,"caption_template":"图片 - _CAPTION_","label":"pod diagram","attributes":{},"skip":false,"key":"3.4.1.1"},{"backlink":"concepts/pod.html#fig3.4.2.1","level":"3.4.2","list_caption":"Figure: Pod示意图","alt":"Pod示意图","nro":88,"url":"../images/pod-overview.png","index":1,"caption_template":"图片 - _CAPTION_","label":"Pod示意图","attributes":{},"skip":false,"key":"3.4.2.1"},{"backlink":"concepts/pod.html#fig3.4.2.2","level":"3.4.2","list_caption":"Figure: Pod Cheatsheet","alt":"Pod Cheatsheet","nro":89,"url":"../images/kubernetes-pod-cheatsheet.png","index":2,"caption_template":"图片 - _CAPTION_","label":"Pod Cheatsheet","attributes":{},"skip":false,"key":"3.4.2.2"},{"backlink":"concepts/pause-container.html#fig3.4.4.1","level":"3.4.4","list_caption":"Figure: Pause容器","alt":"Pause容器","nro":90,"url":"../images/pause-container.png","index":1,"caption_template":"图片 - _CAPTION_","label":"Pause容器","attributes":{},"skip":false,"key":"3.4.4.1"},{"backlink":"concepts/pod-lifecycle.html#fig3.4.6.1","level":"3.4.6","list_caption":"Figure: Pod的生命周期示意图(图片来自网络)","alt":"Pod的生命周期示意图(图片来自网络)","nro":91,"url":"../images/kubernetes-pod-life-cycle.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Pod的生命周期示意图(图片来自网络)","attributes":{},"skip":false,"key":"3.4.6.1"},{"backlink":"concepts/label.html#fig3.5.3.1","level":"3.5.3","list_caption":"Figure: label示意图","alt":"label示意图","nro":92,"url":"../images/labels.png","index":1,"caption_template":"图片 - _CAPTION_","label":"label示意图","attributes":{},"skip":false,"key":"3.5.3.1"},{"backlink":"concepts/horizontal-pod-autoscaling.html#fig3.6.7.1","level":"3.6.7","list_caption":"Figure: horizontal-pod-autoscaler","alt":"horizontal-pod-autoscaler","nro":93,"url":"../images/horizontal-pod-autoscaler.png","index":1,"caption_template":"图片 - _CAPTION_","label":"horizontal-pod-autoscaler","attributes":{},"skip":false,"key":"3.6.7.1"},{"backlink":"concepts/service.html#fig3.7.1.1","level":"3.7.1","list_caption":"Figure: userspace代理模式下Service概览图","alt":"userspace代理模式下Service概览图","nro":94,"url":"../images/services-userspace-overview.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"userspace代理模式下Service概览图","attributes":{},"skip":false,"key":"3.7.1.1"},{"backlink":"concepts/service.html#fig3.7.1.2","level":"3.7.1","list_caption":"Figure: iptables代理模式下Service概览图","alt":"iptables代理模式下Service概览图","nro":95,"url":"../images/services-iptables-overview.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"iptables代理模式下Service概览图","attributes":{},"skip":false,"key":"3.7.1.2"},{"backlink":"concepts/service.html#fig3.7.1.3","level":"3.7.1","list_caption":"Figure: ipvs代理模式下Service概览图","alt":"ipvs代理模式下Service概览图","nro":96,"url":"../images/service-ipvs-overview.png","index":3,"caption_template":"图片 - _CAPTION_","label":"ipvs代理模式下Service概览图","attributes":{},"skip":false,"key":"3.7.1.3"},{"backlink":"concepts/service-catalog.html#fig3.10.5.1","level":"3.10.5","list_caption":"Figure: Service Catalog Architecture","alt":"Service Catalog Architecture","nro":97,"url":"../images/service-catalog-architecture.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Service Catalog Architecture","attributes":{},"skip":false,"key":"3.10.5.1"},{"backlink":"concepts/service-catalog.html#fig3.10.5.2","level":"3.10.5","list_caption":"Figure: List Services","alt":"List Services","nro":98,"url":"../images/service-catalog-list.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"List Services","attributes":{},"skip":false,"key":"3.10.5.2"},{"backlink":"concepts/service-catalog.html#fig3.10.5.3","level":"3.10.5","list_caption":"Figure: Provision a Service","alt":"Provision a Service","nro":99,"url":"../images/service-catalog-provision.jpg","index":3,"caption_template":"图片 - _CAPTION_","label":"Provision a Service","attributes":{},"skip":false,"key":"3.10.5.3"},{"backlink":"concepts/service-catalog.html#fig3.10.5.4","level":"3.10.5","list_caption":"Figure: Bind to a managed service","alt":"Bind to a managed service","nro":100,"url":"../images/service-catalog-bind.jpg","index":4,"caption_template":"图片 - _CAPTION_","label":"Bind to a managed service","attributes":{},"skip":false,"key":"3.10.5.4"},{"backlink":"concepts/service-catalog.html#fig3.10.5.5","level":"3.10.5","list_caption":"Figure: Map connection credentials","alt":"Map connection credentials","nro":101,"url":"../images/service-catalog-map.jpg","index":5,"caption_template":"图片 - _CAPTION_","label":"Map connection credentials","attributes":{},"skip":false,"key":"3.10.5.5"},{"backlink":"guide/using-kubectl.html#fig4.3.2.1","level":"4.3.2","list_caption":"Figure: kubectl cheatsheet","alt":"kubectl cheatsheet","nro":102,"url":"../images/kubernetes-kubectl-cheatsheet.png","index":1,"caption_template":"图片 - _CAPTION_","label":"kubectl cheatsheet","attributes":{},"skip":false,"key":"4.3.2.1"},{"backlink":"guide/using-kubectl.html#fig4.3.2.2","level":"4.3.2","list_caption":"Figure: 增加kubeclt命令的工具(图片来自网络)","alt":"增加kubeclt命令的工具(图片来自网络)","nro":103,"url":"../images/tools-to-supercharge-kubectl.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"增加kubeclt命令的工具(图片来自网络)","attributes":{},"skip":false,"key":"4.3.2.2"},{"backlink":"guide/using-kubectl.html#fig4.3.2.3","level":"4.3.2","list_caption":"Figure: 增强的kubectl命令","alt":"增强的kubectl命令","nro":104,"url":"../images/supercharged-kubectl.jpg","index":3,"caption_template":"图片 - _CAPTION_","label":"增强的kubectl命令","attributes":{},"skip":false,"key":"4.3.2.3"},{"backlink":"guide/using-kubectl.html#fig4.3.2.4","level":"4.3.2","list_caption":"Figure: kube-shell页面","alt":"kube-shell页面","nro":105,"url":"../images/kube-shell.jpg","index":4,"caption_template":"图片 - _CAPTION_","label":"kube-shell页面","attributes":{},"skip":false,"key":"4.3.2.4"},{"backlink":"guide/ip-masq-agent.html#fig4.4.5.1","level":"4.4.5","list_caption":"Figure: IP伪装代理示意图","alt":"IP伪装代理示意图","nro":106,"url":"../images/ip-masq.png","index":1,"caption_template":"图片 - _CAPTION_","label":"IP伪装代理示意图","attributes":{},"skip":false,"key":"4.4.5.1"},{"backlink":"guide/auth-with-kubeconfig-or-token.html#fig4.4.6.1","level":"4.4.6","list_caption":"Figure: kubeconfig文件","alt":"kubeconfig文件","nro":107,"url":"../images/brand-kubeconfig-yaml.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"kubeconfig文件","attributes":{},"skip":false,"key":"4.4.6.1"},{"backlink":"guide/authentication.html#fig4.4.7.1","level":"4.4.7","list_caption":"Figure: Kubernetes OpenID Connect Flow","alt":"Kubernetes OpenID Connect Flow","nro":108,"url":"../images/kubernetes-oidc-login.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Kubernetes OpenID Connect Flow","attributes":{},"skip":false,"key":"4.4.7.1"},{"backlink":"guide/cabin-mobile-dashboard-for-kubernetes.html#fig4.5.6.1","level":"4.5.6","list_caption":"Figure: App Store","alt":"App Store","nro":109,"url":"../images/cabin-kubernetes-mobile-dashboard-1.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"App Store","attributes":{},"skip":false,"key":"4.5.6.1"},{"backlink":"guide/cabin-mobile-dashboard-for-kubernetes.html#fig4.5.6.2","level":"4.5.6","list_caption":"Figure: 在手机上操作Kubernetes集群","alt":"在手机上操作Kubernetes集群","nro":110,"url":"../images/cabin-kubernetes-mobile-dashboard-4.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"在手机上操作Kubernetes集群","attributes":{},"skip":false,"key":"4.5.6.2"},{"backlink":"guide/kubernetes-desktop-client.html#fig4.5.7.1","level":"4.5.7","list_caption":"Figure: Kubernetic客户端","alt":"Kubernetic客户端","nro":111,"url":"../images/kubernetic-desktop-ui.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Kubernetic客户端","attributes":{},"skip":false,"key":"4.5.7.1"},{"backlink":"guide/kubernator-kubernetes-ui.html#fig4.5.8.1","level":"4.5.8","list_caption":"Figure: Kubernator catalog页面","alt":"Kubernator catalog页面","nro":112,"url":"../images/kubernator-catalog.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Kubernator catalog页面","attributes":{},"skip":false,"key":"4.5.8.1"},{"backlink":"guide/kubernator-kubernetes-ui.html#fig4.5.8.2","level":"4.5.8","list_caption":"Figure: Kubernator rbac页面","alt":"Kubernator rbac页面","nro":113,"url":"../images/kubernator-rbac.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"Kubernator rbac页面","attributes":{},"skip":false,"key":"4.5.8.2"},{"backlink":"guide/deploy-applications-in-kubernetes.html#fig4.6.1.1","level":"4.6.1","list_caption":"Figure: 流程图","alt":"流程图","nro":114,"url":"../images/how-to-use-kubernetes-with-istio.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"流程图","attributes":{},"skip":false,"key":"4.6.1.1"},{"backlink":"guide/deploy-applications-in-kubernetes.html#fig4.6.1.2","level":"4.6.1","list_caption":"Figure: API","alt":"API","nro":115,"url":"../images/k8s-app-monitor-test-api-doc.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"API","attributes":{},"skip":false,"key":"4.6.1.2"},{"backlink":"guide/deploy-applications-in-kubernetes.html#fig4.6.1.3","level":"4.6.1","list_caption":"Figure: wercker构建页面","alt":"wercker构建页面","nro":116,"url":"../images/k8s-app-monitor-agent-wercker.jpg","index":3,"caption_template":"图片 - _CAPTION_","label":"wercker构建页面","attributes":{},"skip":false,"key":"4.6.1.3"},{"backlink":"guide/deploy-applications-in-kubernetes.html#fig4.6.1.4","level":"4.6.1","list_caption":"Figure: 图表","alt":"图表","nro":117,"url":"../images/k8s-app-monitor-agent.jpg","index":4,"caption_template":"图片 - _CAPTION_","label":"图表","attributes":{},"skip":false,"key":"4.6.1.4"},{"backlink":"guide/deploy-applications-in-kubernetes.html#fig4.6.1.5","level":"4.6.1","list_caption":"Figure: Grafana页面","alt":"Grafana页面","nro":118,"url":"../images/k8s-app-monitor-istio-grafana.png","index":5,"caption_template":"图片 - _CAPTION_","label":"Grafana页面","attributes":{},"skip":false,"key":"4.6.1.5"},{"backlink":"guide/deploy-applications-in-kubernetes.html#fig4.6.1.6","level":"4.6.1","list_caption":"Figure: servicegraph页面","alt":"servicegraph页面","nro":119,"url":"../images/k8s-app-monitor-istio-servicegraph-dotviz.png","index":6,"caption_template":"图片 - _CAPTION_","label":"servicegraph页面","attributes":{},"skip":false,"key":"4.6.1.6"},{"backlink":"guide/deploy-applications-in-kubernetes.html#fig4.6.1.7","level":"4.6.1","list_caption":"Figure: Zipkin页面","alt":"Zipkin页面","nro":120,"url":"../images/k8s-app-monitor-istio-zipkin.png","index":7,"caption_template":"图片 - _CAPTION_","label":"Zipkin页面","attributes":{},"skip":false,"key":"4.6.1.7"},{"backlink":"guide/migrating-hadoop-yarn-to-kubernetes.html#fig4.6.2.1","level":"4.6.2","list_caption":"Figure: 将单体应用迁移到云原生(图片来自DevOpsDay Toronto)","alt":"将单体应用迁移到云原生(图片来自DevOpsDay Toronto)","nro":121,"url":"../images/migrating-monolith-to-kubernetes.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"将单体应用迁移到云原生(图片来自DevOpsDay Toronto)","attributes":{},"skip":false,"key":"4.6.2.1"},{"backlink":"guide/migrating-hadoop-yarn-to-kubernetes.html#fig4.6.2.2","level":"4.6.2","list_caption":"Figure: spark on yarn with kubernetes","alt":"spark on yarn with kubernetes","nro":122,"url":"../images/spark-on-yarn-with-kubernetes.png","index":2,"caption_template":"图片 - _CAPTION_","label":"spark on yarn with kubernetes","attributes":{},"skip":false,"key":"4.6.2.2"},{"backlink":"guide/migrating-hadoop-yarn-to-kubernetes.html#fig4.6.2.3","level":"4.6.2","list_caption":"Figure: Terms","alt":"Terms","nro":123,"url":"../images/terms-in-kubernetes-app-deployment.png","index":3,"caption_template":"图片 - _CAPTION_","label":"Terms","attributes":{},"skip":false,"key":"4.6.2.3"},{"backlink":"guide/migrating-hadoop-yarn-to-kubernetes.html#fig4.6.2.4","level":"4.6.2","list_caption":"Figure: 分解步骤解析","alt":"分解步骤解析","nro":124,"url":"../images/migrating-hadoop-yarn-to-kubernetes.png","index":4,"caption_template":"图片 - _CAPTION_","label":"分解步骤解析","attributes":{},"skip":false,"key":"4.6.2.4"},{"backlink":"practice/node-installation.html#fig5.2.7.1","level":"5.2.7","list_caption":"Figure: nginx欢迎页面","alt":"nginx欢迎页面","nro":125,"url":"../images/kubernetes-installation-test-nginx.png","index":1,"caption_template":"图片 - _CAPTION_","label":"nginx欢迎页面","attributes":{},"skip":false,"key":"5.2.7.1"},{"backlink":"practice/dashboard-addon-installation.html#fig5.2.9.1","level":"5.2.9","list_caption":"Figure: kubernetes dashboard","alt":"kubernetes dashboard","nro":126,"url":"../images/kubernetes-dashboard-raw.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"kubernetes dashboard","attributes":{},"skip":false,"key":"5.2.9.1"},{"backlink":"practice/dashboard-addon-installation.html#fig5.2.9.2","level":"5.2.9","list_caption":"Figure: V1.6.3版本的dashboard界面","alt":"V1.6.3版本的dashboard界面","nro":127,"url":"../images/dashboard-v163.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"V1.6.3版本的dashboard界面","attributes":{},"skip":false,"key":"5.2.9.2"},{"backlink":"practice/dashboard-addon-installation.html#fig5.2.9.3","level":"5.2.9","list_caption":"Figure: pod无法正常启动","alt":"pod无法正常启动","nro":128,"url":"../images/dashboard-addon-installation001.png","index":3,"caption_template":"图片 - _CAPTION_","label":"pod无法正常启动","attributes":{},"skip":false,"key":"5.2.9.3"},{"backlink":"practice/heapster-addon-installation.html#fig5.2.10.1","level":"5.2.10","list_caption":"Figure: dashboard-heapster","alt":"dashboard-heapster","nro":129,"url":"../images/kubernetes-dashboard-with-heapster.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"dashboard-heapster","attributes":{},"skip":false,"key":"5.2.10.1"},{"backlink":"practice/heapster-addon-installation.html#fig5.2.10.2","level":"5.2.10","list_caption":"Figure: grafana","alt":"grafana","nro":130,"url":"../images/kubernetes-heapster-grafana.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"grafana","attributes":{},"skip":false,"key":"5.2.10.2"},{"backlink":"practice/heapster-addon-installation.html#fig5.2.10.3","level":"5.2.10","list_caption":"Figure: kubernetes-influxdb-heapster","alt":"kubernetes-influxdb-heapster","nro":131,"url":"../images/kubernetes-influxdb-heapster.jpg","index":3,"caption_template":"图片 - _CAPTION_","label":"kubernetes-influxdb-heapster","attributes":{},"skip":false,"key":"5.2.10.3"},{"backlink":"practice/heapster-addon-installation.html#fig5.2.10.4","level":"5.2.10","list_caption":"Figure: 修改grafana模板","alt":"修改grafana模板","nro":132,"url":"../images/grafana-dashboard-setting.jpg","index":4,"caption_template":"图片 - _CAPTION_","label":"修改grafana模板","attributes":{},"skip":false,"key":"5.2.10.4"},{"backlink":"practice/efk-addon-installation.html#fig5.2.11.1","level":"5.2.11","list_caption":"Figure: es-setting","alt":"es-setting","nro":133,"url":"../images/es-setting.png","index":1,"caption_template":"图片 - _CAPTION_","label":"es-setting","attributes":{},"skip":false,"key":"5.2.11.1"},{"backlink":"practice/efk-addon-installation.html#fig5.2.11.2","level":"5.2.11","list_caption":"Figure: es-home","alt":"es-home","nro":134,"url":"../images/kubernetes-efk-kibana.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"es-home","attributes":{},"skip":false,"key":"5.2.11.2"},{"backlink":"practice/traefik-ingress-installation.html#fig5.4.1.1","level":"5.4.1","list_caption":"Figure: kubernetes-dashboard","alt":"kubernetes-dashboard","nro":135,"url":"../images/traefik-dashboard.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"kubernetes-dashboard","attributes":{},"skip":false,"key":"5.4.1.1"},{"backlink":"practice/traefik-ingress-installation.html#fig5.4.1.2","level":"5.4.1","list_caption":"Figure: traefik-nginx","alt":"traefik-nginx","nro":136,"url":"../images/traefik-nginx.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"traefik-nginx","attributes":{},"skip":false,"key":"5.4.1.2"},{"backlink":"practice/traefik-ingress-installation.html#fig5.4.1.3","level":"5.4.1","list_caption":"Figure: traefik-guestbook","alt":"traefik-guestbook","nro":137,"url":"../images/traefik-guestbook.jpg","index":3,"caption_template":"图片 - _CAPTION_","label":"traefik-guestbook","attributes":{},"skip":false,"key":"5.4.1.3"},{"backlink":"practice/distributed-load-test.html#fig5.4.2.1","level":"5.4.2","list_caption":"Figure: 使用dashboard来扩容","alt":"使用dashboard来扩容","nro":138,"url":"../images/dashbaord-scale.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"使用dashboard来扩容","attributes":{},"skip":false,"key":"5.4.2.1"},{"backlink":"practice/distributed-load-test.html#fig5.4.2.2","level":"5.4.2","list_caption":"Figure: Traefik的UI","alt":"Traefik的UI","nro":139,"url":"../images/traefik-dashboard-locust.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"Traefik的UI","attributes":{},"skip":false,"key":"5.4.2.2"},{"backlink":"practice/distributed-load-test.html#fig5.4.2.3","level":"5.4.2","list_caption":"Figure: Locust启动界面","alt":"Locust启动界面","nro":140,"url":"../images/locust-start-swarming.jpg","index":3,"caption_template":"图片 - _CAPTION_","label":"Locust启动界面","attributes":{},"skip":false,"key":"5.4.2.3"},{"backlink":"practice/distributed-load-test.html#fig5.4.2.4","level":"5.4.2","list_caption":"Figure: Dashboard查看页面","alt":"Dashboard查看页面","nro":141,"url":"../images/sample-webapp-rc.jpg","index":4,"caption_template":"图片 - _CAPTION_","label":"Dashboard查看页面","attributes":{},"skip":false,"key":"5.4.2.4"},{"backlink":"practice/distributed-load-test.html#fig5.4.2.5","level":"5.4.2","list_caption":"Figure: Locust测试结果页面","alt":"Locust测试结果页面","nro":142,"url":"../images/locust-dashboard.jpg","index":5,"caption_template":"图片 - _CAPTION_","label":"Locust测试结果页面","attributes":{},"skip":false,"key":"5.4.2.5"},{"backlink":"practice/network-and-cluster-perfermance-test.html#fig5.4.3.1","level":"5.4.3","list_caption":"Figure: kubernetes-dashboard","alt":"kubernetes-dashboard","nro":143,"url":"../images/kubenetes-e2e-test.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"kubernetes-dashboard","attributes":{},"skip":false,"key":"5.4.3.1"},{"backlink":"practice/network-and-cluster-perfermance-test.html#fig5.4.3.2","level":"5.4.3","list_caption":"Figure: locust测试页面","alt":"locust测试页面","nro":144,"url":"../images/kubernetes-locust-test.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"locust测试页面","attributes":{},"skip":false,"key":"5.4.3.2"},{"backlink":"practice/edge-node-configuration.html#fig5.4.4.1","level":"5.4.4","list_caption":"Figure: 边缘节点架构","alt":"边缘节点架构","nro":145,"url":"../images/kubernetes-edge-node-architecture.png","index":1,"caption_template":"图片 - _CAPTION_","label":"边缘节点架构","attributes":{},"skip":false,"key":"5.4.4.1"},{"backlink":"practice/edge-node-configuration.html#fig5.4.4.2","level":"5.4.4","list_caption":"Figure: 使用域名来访问Kubernetes中的服务","alt":"使用域名来访问Kubernetes中的服务","nro":146,"url":"../images/accessing-kubernetes-services-with-dns-name.png","index":2,"caption_template":"图片 - _CAPTION_","label":"使用域名来访问Kubernetes中的服务","attributes":{},"skip":false,"key":"5.4.4.2"},{"backlink":"practice/configuring-dns.html#fig5.4.6.1.1","level":"5.4.6.1","list_caption":"Figure: DNS lookup flow","alt":"DNS lookup flow","nro":147,"url":"https://d33wubrfki0l68.cloudfront.net/340889cb80e81dcd19a16bc34697a7907e2b229a/24ad0/docs/tasks/administer-cluster/dns-custom-nameservers/dns.png","index":1,"caption_template":"图片 - _CAPTION_","label":"DNS lookup flow","attributes":{},"skip":false,"key":"5.4.6.1.1"},{"backlink":"practice/master-ha.html#fig5.5.1.1","level":"5.5.1","list_caption":"Figure: Master HA架构图","alt":"Master HA架构图","nro":148,"url":"../images/master-ha.JPG","index":1,"caption_template":"图片 - _CAPTION_","label":"Master HA架构图","attributes":{},"skip":false,"key":"5.5.1.1"},{"backlink":"practice/app-log-collection.html#fig5.5.3.1","level":"5.5.3","list_caption":"Figure: filebeat日志收集架构图","alt":"filebeat日志收集架构图","nro":149,"url":"../images/filebeat-log-collector.png","index":1,"caption_template":"图片 - _CAPTION_","label":"filebeat日志收集架构图","attributes":{},"skip":false,"key":"5.5.3.1"},{"backlink":"practice/app-log-collection.html#fig5.5.3.2","level":"5.5.3","list_caption":"Figure: Kibana页面","alt":"Kibana页面","nro":150,"url":"../images/filebeat-docker-test.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"Kibana页面","attributes":{},"skip":false,"key":"5.5.3.2"},{"backlink":"practice/app-log-collection.html#fig5.5.3.3","level":"5.5.3","list_caption":"Figure: filebeat收集的日志详细信息","alt":"filebeat收集的日志详细信息","nro":151,"url":"../images/kubernetes-filebeat-detail.png","index":3,"caption_template":"图片 - _CAPTION_","label":"filebeat收集的日志详细信息","attributes":{},"skip":false,"key":"5.5.3.3"},{"backlink":"practice/monitor.html#fig5.5.5.1","level":"5.5.5","list_caption":"Figure: Kubernetes集群中的监控","alt":"Kubernetes集群中的监控","nro":152,"url":"../images/monitoring-in-kubernetes.png","index":1,"caption_template":"图片 - _CAPTION_","label":"Kubernetes集群中的监控","attributes":{},"skip":false,"key":"5.5.5.1"},{"backlink":"practice/monitor.html#fig5.5.5.2","level":"5.5.5","list_caption":"Figure: kubernetes的容器命名规则示意图","alt":"kubernetes的容器命名规则示意图","nro":153,"url":"../images/kubernetes-container-naming-rule.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"kubernetes的容器命名规则示意图","attributes":{},"skip":false,"key":"5.5.5.2"},{"backlink":"practice/monitor.html#fig5.5.5.3","level":"5.5.5","list_caption":"Figure: Heapster架构图(改进版)","alt":"Heapster架构图(改进版)","nro":154,"url":"../images/kubernetes-heapster-monitoring.png","index":3,"caption_template":"图片 - _CAPTION_","label":"Heapster架构图(改进版)","attributes":{},"skip":false,"key":"5.5.5.3"},{"backlink":"practice/monitor.html#fig5.5.5.4","level":"5.5.5","list_caption":"Figure: 应用监控架构图","alt":"应用监控架构图","nro":155,"url":"../images/kubernetes-app-monitoring.png","index":4,"caption_template":"图片 - _CAPTION_","label":"应用监控架构图","attributes":{},"skip":false,"key":"5.5.5.4"},{"backlink":"practice/monitor.html#fig5.5.5.5","level":"5.5.5","list_caption":"Figure: 应用拓扑图","alt":"应用拓扑图","nro":156,"url":"../images/weave-scope-service-topology.jpg","index":5,"caption_template":"图片 - _CAPTION_","label":"应用拓扑图","attributes":{},"skip":false,"key":"5.5.5.5"},{"backlink":"practice/data-persistence-problem.html#fig5.5.6.1","level":"5.5.6","list_caption":"Figure: 日志持久化收集解决方案示意图","alt":"日志持久化收集解决方案示意图","nro":157,"url":"../images/log-persistence-logstash.png","index":1,"caption_template":"图片 - _CAPTION_","label":"日志持久化收集解决方案示意图","attributes":{},"skip":false,"key":"5.5.6.1"},{"backlink":"practice/storage-for-containers-using-glusterfs-with-openshift.html#fig5.6.1.3.1","level":"5.6.1.3","list_caption":"Figure: 创建存储","alt":"创建存储","nro":158,"url":"../images/create-gluster-storage.png","index":1,"caption_template":"图片 - _CAPTION_","label":"创建存储","attributes":{},"skip":false,"key":"5.6.1.3.1"},{"backlink":"practice/storage-for-containers-using-glusterfs-with-openshift.html#fig5.6.1.3.2","level":"5.6.1.3","list_caption":"Figure: Screen Shot 2017-03-24 at 11.09.34.png","alt":"Screen Shot 2017-03-24 at 11.09.34.png","nro":159,"url":"https://keithtenzer.files.wordpress.com/2017/03/screen-shot-2017-03-24-at-11-09-341.png?w=440","index":2,"caption_template":"图片 - _CAPTION_","label":"Screen Shot 2017-03-24 at 11.09.34.png","attributes":{},"skip":false,"key":"5.6.1.3.2"},{"backlink":"practice/openebs.html#fig5.6.4.1","level":"5.6.4","list_caption":"Figure: OpenEBS集群数据平面(图片来自https://github.com/openebs/openebs/blob/master/contribute/design/README.md)","alt":"OpenEBS集群数据平面(图片来自https://github.com/openebs/openebs/blob/master/contribute/design/README.md)","nro":160,"url":"../images/OpenEBS-Data-Plane.png","index":1,"caption_template":"图片 - _CAPTION_","label":"OpenEBS集群数据平面(图片来自https://github.com/openebs/openebs/blob/master/contribute/design/README.md)","attributes":{},"skip":false,"key":"5.6.4.1"},{"backlink":"practice/openebs.html#fig5.6.4.2","level":"5.6.4","list_caption":"Figure: OpenEBS集群的控制平面(图片来自https://github.com/openebs/openebs/blob/master/contribute/design/README.md)","alt":"OpenEBS集群的控制平面(图片来自https://github.com/openebs/openebs/blob/master/contribute/design/README.md)","nro":161,"url":"../images/OpenEBS-Control-Plane.png","index":2,"caption_template":"图片 - _CAPTION_","label":"OpenEBS集群的控制平面(图片来自https://github.com/openebs/openebs/blob/master/contribute/design/README.md)","attributes":{},"skip":false,"key":"5.6.4.2"},{"backlink":"practice/using-openebs-for-persistent-storage.html#fig5.6.4.1.1","level":"5.6.4.1","list_caption":"Figure: Kubernetes iSCSI架构","alt":"Kubernetes iSCSI架构","nro":162,"url":"../images/iscsi-on-kubernetes.png","index":1,"caption_template":"图片 - _CAPTION_","label":"Kubernetes iSCSI架构","attributes":{},"skip":false,"key":"5.6.4.1.1"},{"backlink":"practice/using-heapster-to-get-object-metrics.html#fig5.7.1.1.1","level":"5.7.1.1","list_caption":"Figure: Heapster架构图","alt":"Heapster架构图","nro":163,"url":"../images/heapster-architecture.png","index":1,"caption_template":"图片 - _CAPTION_","label":"Heapster架构图","attributes":{},"skip":false,"key":"5.7.1.1.1"},{"backlink":"practice/prometheus.html#fig5.7.2.1","level":"5.7.2","list_caption":"Figure: Prometheus 架构图","alt":"Prometheus 架构图","nro":164,"url":"../images/006tNbRwly1fwcgsn11fej311j0mjadw.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Prometheus 架构图","attributes":{},"skip":false,"key":"5.7.2.1"},{"backlink":"practice/using-prometheus-to-monitor-kuberentes-cluster.html#fig5.7.2.1.1","level":"5.7.2.1","list_caption":"Figure: Grafana页面","alt":"Grafana页面","nro":165,"url":"../images/kubernetes-prometheus-monitoring.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Grafana页面","attributes":{},"skip":false,"key":"5.7.2.1.1"},{"backlink":"practice/promql.html#fig5.7.2.2.1","level":"5.7.2.2","list_caption":"Figure: Prometheus 的查询页面","alt":"Prometheus 的查询页面","nro":166,"url":"../images/006tNbRwly1fwcl7v28rhj30xl0onadv.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Prometheus 的查询页面","attributes":{},"skip":false,"key":"5.7.2.2.1"},{"backlink":"practice/vistio-visualize-your-istio-mesh.html#fig5.7.3.1","level":"5.7.3","list_caption":"Figure: Vistio的集群级别可视化","alt":"Vistio的集群级别可视化","nro":167,"url":"../images/00704eQkgy1fshft5oxlwj318g0pe0wp.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Vistio的集群级别可视化","attributes":{},"skip":false,"key":"5.7.3.1"},{"backlink":"practice/vistio-visualize-your-istio-mesh.html#fig5.7.3.2","level":"5.7.3","list_caption":"Figure: Prometheus查询","alt":"Prometheus查询","nro":168,"url":"../images/00704eQkgy1fshg0vw25ij318g0jzqjq.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"Prometheus查询","attributes":{},"skip":false,"key":"5.7.3.2"},{"backlink":"practice/vistio-visualize-your-istio-mesh.html#fig5.7.3.3","level":"5.7.3","list_caption":"Figure: vistio-api的期望输出","alt":"vistio-api的期望输出","nro":169,"url":"../images/00704eQkgy1fshi61t04oj310q17c0y1.jpg","index":3,"caption_template":"图片 - _CAPTION_","label":"vistio-api的期望输出","attributes":{},"skip":false,"key":"5.7.3.3"},{"backlink":"practice/vistio-visualize-your-istio-mesh.html#fig5.7.3.4","level":"5.7.3","list_caption":"Figure: Vistio主页面","alt":"Vistio主页面","nro":170,"url":"../images/00704eQkgy1fshi98duzgj318g0l2406.jpg","index":4,"caption_template":"图片 - _CAPTION_","label":"Vistio主页面","attributes":{},"skip":false,"key":"5.7.3.4"},{"backlink":"practice/vistio-visualize-your-istio-mesh.html#fig5.7.3.5","level":"5.7.3","list_caption":"Figure: istio mesh的网络流量","alt":"istio mesh的网络流量","nro":171,"url":"../images/00704eQkgy1fshibdwcj3j318g0p8th1.jpg","index":5,"caption_template":"图片 - _CAPTION_","label":"istio mesh的网络流量","attributes":{},"skip":false,"key":"5.7.3.5"},{"backlink":"practice/vistio-visualize-your-istio-mesh.html#fig5.7.3.6","level":"5.7.3","list_caption":"Figure: 查明网络问题","alt":"查明网络问题","nro":172,"url":"../images/00704eQkgy1fshicc7or1j318g0p8ahr.jpg","index":6,"caption_template":"图片 - _CAPTION_","label":"查明网络问题","attributes":{},"skip":false,"key":"5.7.3.6"},{"backlink":"practice/vistio-visualize-your-istio-mesh.html#fig5.7.3.7","level":"5.7.3","list_caption":"Figure: vistio api的不正确输出","alt":"vistio api的不正确输出","nro":173,"url":"../images/00704eQkgy1fshie7wxkyj30ks0f4myd.jpg","index":7,"caption_template":"图片 - _CAPTION_","label":"vistio api的不正确输出","attributes":{},"skip":false,"key":"5.7.3.7"},{"backlink":"practice/opentracing.html#fig5.8.1.1","level":"5.8.1","list_caption":"Figure: Jaeger UI","alt":"Jaeger UI","nro":174,"url":"../images/006tNbRwly1fwjg48fh7xj31kw0wedrg.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Jaeger UI","attributes":{},"skip":false,"key":"5.8.1.1"},{"backlink":"practice/opentracing.html#fig5.8.1.2","level":"5.8.1","list_caption":"Figure: Chrome Inspector","alt":"Chrome Inspector","nro":175,"url":"../images/006tNbRwly1fwjkfbvfluj30y70hf0y9.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"Chrome Inspector","attributes":{},"skip":false,"key":"5.8.1.2"},{"backlink":"practice/helm.html#fig5.9.1.1","level":"5.9.1","list_caption":"Figure: Helm 架构图(来自 IBM Developer Blog)","alt":"Helm 架构图(来自 IBM Developer Blog)","nro":176,"url":"../images/helm-chart.png","index":1,"caption_template":"图片 - _CAPTION_","label":"Helm 架构图(来自 IBM Developer Blog)","attributes":{},"skip":false,"key":"5.9.1.1"},{"backlink":"practice/create-private-charts-repo.html#fig5.9.2.1","level":"5.9.2","list_caption":"Figure: Helm monocular界面","alt":"Helm monocular界面","nro":177,"url":"../images/helm-monocular-jimmysong.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Helm monocular界面","attributes":{},"skip":false,"key":"5.9.2.1"},{"backlink":"practice/ci-cd.html#fig5.10.1","level":"5.10","list_caption":"Figure: CI/CD with Kubernetes","alt":"CI/CD with Kubernetes","nro":178,"url":"../images/00704eQkgy1fsaxszh01vj30da0j2jvn.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"CI/CD with Kubernetes","attributes":{},"skip":false,"key":"5.10.1"},{"backlink":"practice/ci-cd.html#fig5.10.2","level":"5.10","list_caption":"Figure: Kubernetes改变了应用的基础架构","alt":"Kubernetes改变了应用的基础架构","nro":179,"url":"../images/00704eQkgy1fsayashxz3j31c00w6aed.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"Kubernetes改变了应用的基础架构","attributes":{},"skip":false,"key":"5.10.2"},{"backlink":"practice/ci-cd.html#fig5.10.3","level":"5.10","list_caption":"Figure: Kubernetes中的CI/CD","alt":"Kubernetes中的CI/CD","nro":180,"url":"../images/00704eQkgy1fsayfzk3ezj31bu0tkdky.jpg","index":3,"caption_template":"图片 - _CAPTION_","label":"Kubernetes中的CI/CD","attributes":{},"skip":false,"key":"5.10.3"},{"backlink":"practice/ci-cd.html#fig5.10.4","level":"5.10","list_caption":"Figure: 云原生工作负载","alt":"云原生工作负载","nro":181,"url":"../images/00704eQkgy1fsayrk6vppj31bu0w0gsd.jpg","index":4,"caption_template":"图片 - _CAPTION_","label":"云原生工作负载","attributes":{},"skip":false,"key":"5.10.4"},{"backlink":"practice/ci-cd.html#fig5.10.5","level":"5.10","list_caption":"Figure: 云原生工作负载映射到Kuberentes原语","alt":"云原生工作负载映射到Kuberentes原语","nro":182,"url":"../images/00704eQkgy1fsaytbabxgj31c00w2n4r.jpg","index":5,"caption_template":"图片 - _CAPTION_","label":"云原生工作负载映射到Kuberentes原语","attributes":{},"skip":false,"key":"5.10.5"},{"backlink":"practice/ci-cd.html#fig5.10.6","level":"5.10","list_caption":"Figure: spinnaker中的组件及角色交互关系","alt":"spinnaker中的组件及角色交互关系","nro":183,"url":"../images/00704eQkgy1fsaz2wirz9j31bs0vygsb.jpg","index":6,"caption_template":"图片 - _CAPTION_","label":"spinnaker中的组件及角色交互关系","attributes":{},"skip":false,"key":"5.10.6"},{"backlink":"practice/ci-cd.html#fig5.10.7","level":"5.10","list_caption":"Figure: Spinnaker部署流水线","alt":"Spinnaker部署流水线","nro":184,"url":"../images/00704eQkgy1fsaz3yo227j31c60mgdim.jpg","index":7,"caption_template":"图片 - _CAPTION_","label":"Spinnaker部署流水线","attributes":{},"skip":false,"key":"5.10.7"},{"backlink":"practice/ci-cd.html#fig5.10.8","level":"5.10","list_caption":"Figure: Spinnaker的预发布流水线","alt":"Spinnaker的预发布流水线","nro":185,"url":"../images/00704eQkgy1fsaz50k2atj31bs0mitbn.jpg","index":8,"caption_template":"图片 - _CAPTION_","label":"Spinnaker的预发布流水线","attributes":{},"skip":false,"key":"5.10.8"},{"backlink":"practice/ci-cd.html#fig5.10.9","level":"5.10","list_caption":"Figure: Spinnaker的生产流水线","alt":"Spinnaker的生产流水线","nro":186,"url":"../images/00704eQkgy1fsaz5n5qs9j31by0motbm.jpg","index":9,"caption_template":"图片 - _CAPTION_","label":"Spinnaker的生产流水线","attributes":{},"skip":false,"key":"5.10.9"},{"backlink":"practice/ci-cd.html#fig5.10.10","level":"5.10","list_caption":"Figure: 可观察性","alt":"可观察性","nro":187,"url":"../images/00704eQkgy1fsazabn0b9j31by0w6791.jpg","index":10,"caption_template":"图片 - _CAPTION_","label":"可观察性","attributes":{},"skip":false,"key":"5.10.10"},{"backlink":"practice/ci-cd.html#fig5.10.11","level":"5.10","list_caption":"Figure: Prometheus生态系统中的组件","alt":"Prometheus生态系统中的组件","nro":188,"url":"../images/00704eQkgy1fsazcclee6j31c20w6n5y.jpg","index":11,"caption_template":"图片 - _CAPTION_","label":"Prometheus生态系统中的组件","attributes":{},"skip":false,"key":"5.10.11"},{"backlink":"practice/jenkins-ci-cd.html#fig5.10.1.1","level":"5.10.1","list_caption":"Figure: 基于Jenkins的持续集成与发布","alt":"基于Jenkins的持续集成与发布","nro":189,"url":"../images/kubernetes-jenkins-ci-cd.png","index":1,"caption_template":"图片 - _CAPTION_","label":"基于Jenkins的持续集成与发布","attributes":{},"skip":false,"key":"5.10.1.1"},{"backlink":"practice/drone-ci-cd.html#fig5.10.2.1","level":"5.10.2","list_caption":"Figure: OAuth注册","alt":"OAuth注册","nro":190,"url":"../images/github-oauth-register.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"OAuth注册","attributes":{},"skip":false,"key":"5.10.2.1"},{"backlink":"practice/drone-ci-cd.html#fig5.10.2.2","level":"5.10.2","list_caption":"Figure: OAuth key","alt":"OAuth key","nro":191,"url":"../images/github-oauth-drone-key.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"OAuth key","attributes":{},"skip":false,"key":"5.10.2.2"},{"backlink":"practice/drone-ci-cd.html#fig5.10.2.3","level":"5.10.2","list_caption":"Figure: Drone登陆界面","alt":"Drone登陆界面","nro":192,"url":"../images/drone-login-github.jpg","index":3,"caption_template":"图片 - _CAPTION_","label":"Drone登陆界面","attributes":{},"skip":false,"key":"5.10.2.3"},{"backlink":"practice/drone-ci-cd.html#fig5.10.2.4","level":"5.10.2","list_caption":"Figure: Github启用repo设置","alt":"Github启用repo设置","nro":193,"url":"../images/drone-github-active.jpg","index":4,"caption_template":"图片 - _CAPTION_","label":"Github启用repo设置","attributes":{},"skip":false,"key":"5.10.2.4"},{"backlink":"practice/drone-ci-cd.html#fig5.10.2.5","level":"5.10.2","list_caption":"Figure: Github单个repo设置","alt":"Github单个repo设置","nro":194,"url":"../images/drone-github-repo-setting.jpg","index":5,"caption_template":"图片 - _CAPTION_","label":"Github单个repo设置","attributes":{},"skip":false,"key":"5.10.2.5"},{"backlink":"practice/manually-upgrade.html#fig5.11.1.1","level":"5.11.1","list_caption":"Figure: Kubernetes零宕机时间升级建议","alt":"Kubernetes零宕机时间升级建议","nro":195,"url":"../images/zero-downtime-kubernetes-upgrade-tips.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Kubernetes零宕机时间升级建议","attributes":{},"skip":false,"key":"5.11.1.1"},{"backlink":"practice/manually-upgrade.html#fig5.11.1.2","level":"5.11.1","list_caption":"Figure: Kuberentes API对象的版本演进","alt":"Kuberentes API对象的版本演进","nro":196,"url":"../images/kubernetes-apversions-changes.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"Kuberentes API对象的版本演进","attributes":{},"skip":false,"key":"5.11.1.2"},{"backlink":"practice/dashboard-upgrade.html#fig5.11.2.1","level":"5.11.2","list_caption":"Figure: 登陆界面","alt":"登陆界面","nro":197,"url":"../images/kubernetes-dashboard-1.7.1-login.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"登陆界面","attributes":{},"skip":false,"key":"5.11.2.1"},{"backlink":"practice/dashboard-upgrade.html#fig5.11.2.2","level":"5.11.2","list_caption":"Figure: Dashboard首页","alt":"Dashboard首页","nro":198,"url":"../images/kubernetes-dashboard-1.7.1-default-page.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"Dashboard首页","attributes":{},"skip":false,"key":"5.11.2.2"},{"backlink":"practice/dashboard-upgrade.html#fig5.11.2.3","level":"5.11.2","list_caption":"Figure: Dashboard用户空间页面","alt":"Dashboard用户空间页面","nro":199,"url":"../images/kubernetes-dashboard-1.7.1-brand.jpg","index":3,"caption_template":"图片 - _CAPTION_","label":"Dashboard用户空间页面","attributes":{},"skip":false,"key":"5.11.2.3"},{"backlink":"practice/dashboard-upgrade.html#fig5.11.2.4","level":"5.11.2","list_caption":"Figure: kubeconfig文件","alt":"kubeconfig文件","nro":200,"url":"../images/brand-kubeconfig-yaml.jpg","index":4,"caption_template":"图片 - _CAPTION_","label":"kubeconfig文件","attributes":{},"skip":false,"key":"5.11.2.4"},{"backlink":"usecases/microservices.html#fig6.2.1","level":"6.2","list_caption":"Figure: 微服务关注的部分","alt":"微服务关注的部分","nro":201,"url":"../images/microservices-concerns.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"微服务关注的部分","attributes":{},"skip":false,"key":"6.2.1"},{"backlink":"usecases/service-discovery-in-microservices.html#fig6.2.1.1","level":"6.2.1","list_caption":"Figure: 微服务中的服务发现","alt":"微服务中的服务发现","nro":202,"url":"../images/service-discovery-in-microservices.png","index":1,"caption_template":"图片 - _CAPTION_","label":"微服务中的服务发现","attributes":{},"skip":false,"key":"6.2.1.1"},{"backlink":"usecases/microservices-for-java-developers.html#fig6.2.2.1","level":"6.2.2","list_caption":"Figure: Spring技术栈","alt":"Spring技术栈","nro":203,"url":"../images/spring-stack.png","index":1,"caption_template":"图片 - _CAPTION_","label":"Spring技术栈","attributes":{},"skip":false,"key":"6.2.2.1"},{"backlink":"usecases/microservices-for-java-developers.html#fig6.2.2.2","level":"6.2.2","list_caption":"Figure: Spring Boot的知识点","alt":"Spring Boot的知识点","nro":204,"url":"../images/spring-boot-note-spots.png","index":2,"caption_template":"图片 - _CAPTION_","label":"Spring Boot的知识点","attributes":{},"skip":false,"key":"6.2.2.2"},{"backlink":"usecases/service-mesh.html#fig6.3.1","level":"6.3","list_caption":"Figure: 下一代异构微服务架构","alt":"下一代异构微服务架构","nro":205,"url":"../images/polyglot-microservices-serivce-mesh.png","index":1,"caption_template":"图片 - _CAPTION_","label":"下一代异构微服务架构","attributes":{},"skip":false,"key":"6.3.1"},{"backlink":"usecases/service-mesh.html#fig6.3.2","level":"6.3","list_caption":"Figure: Service Mesh 架构图","alt":"Service Mesh 架构图","nro":206,"url":"../images/serivce-mesh-control-plane.png","index":2,"caption_template":"图片 - _CAPTION_","label":"Service Mesh 架构图","attributes":{},"skip":false,"key":"6.3.2"},{"backlink":"usecases/service-mesh.html#fig6.3.3","level":"6.3","list_caption":"Figure: Istio vs linkerd","alt":"Istio vs linkerd","nro":207,"url":"../images/istio-vs-linkerd.jpg","index":3,"caption_template":"图片 - _CAPTION_","label":"Istio vs linkerd","attributes":{},"skip":false,"key":"6.3.3"},{"backlink":"usecases/service-mesh-fundamental.html#fig6.3.1.1.1","level":"6.3.1.1","list_caption":"Figure: Service Mesh模型对比","alt":"Service Mesh模型对比","nro":208,"url":"../images/0069RVTdly1fuafvbnuc7j310a0oqdm9.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Service Mesh模型对比","attributes":{},"skip":false,"key":"6.3.1.1.1"},{"backlink":"usecases/service-mesh-fundamental.html#fig6.3.1.1.2","level":"6.3.1.1","list_caption":"Figure: 网状网络拓扑","alt":"网状网络拓扑","nro":209,"url":"../images/0069RVTdly1fuaie8jan8j310a0kitem.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"网状网络拓扑","attributes":{},"skip":false,"key":"6.3.1.1.2"},{"backlink":"usecases/service-mesh-fundamental.html#fig6.3.1.1.3","level":"6.3.1.1","list_caption":"Figure: Service Mesh架构图","alt":"Service Mesh架构图","nro":210,"url":"../images/0069RVTdly1fuail4d24jj31080rkgr7.jpg","index":3,"caption_template":"图片 - _CAPTION_","label":"Service Mesh架构图","attributes":{},"skip":false,"key":"6.3.1.1.3"},{"backlink":"usecases/service-mesh-fundamental.html#fig6.3.1.1.4","level":"6.3.1.1","list_caption":"Figure: Istio Mixer","alt":"Istio Mixer","nro":211,"url":"../images/0069RVTdly1fuam4ln45jj30yu0o6wkc.jpg","index":4,"caption_template":"图片 - _CAPTION_","label":"Istio Mixer","attributes":{},"skip":false,"key":"6.3.1.1.4"},{"backlink":"usecases/service-mesh-fundamental.html#fig6.3.1.1.5","level":"6.3.1.1","list_caption":"Figure: Istio架构图","alt":"Istio架构图","nro":212,"url":"../images/0069RVTdly1fuamvq97cuj30yu0wg7cr.jpg","index":5,"caption_template":"图片 - _CAPTION_","label":"Istio架构图","attributes":{},"skip":false,"key":"6.3.1.1.5"},{"backlink":"usecases/service-mesh-fundamental.html#fig6.3.1.1.6","level":"6.3.1.1","list_caption":"Figure: OSI模型","alt":"OSI模型","nro":213,"url":"../images/0069RVTdly1fuanez4qbtj30v4183n7p.jpg","index":6,"caption_template":"图片 - _CAPTION_","label":"OSI模型","attributes":{},"skip":false,"key":"6.3.1.1.6"},{"backlink":"usecases/service-mesh-fundamental.html#fig6.3.1.1.7","level":"6.3.1.1","list_caption":"Figure: 在L5解耦","alt":"在L5解耦","nro":214,"url":"../images/006tNbRwly1fubfiiryirj30w20ayjui.jpg","index":7,"caption_template":"图片 - _CAPTION_","label":"在L5解耦","attributes":{},"skip":false,"key":"6.3.1.1.7"},{"backlink":"usecases/comparing-service-mesh-technologies.html#fig6.3.1.2.1","level":"6.3.1.2","list_caption":"Figure: 客户端库","alt":"客户端库","nro":215,"url":"../images/006tNbRwly1fubnx0q9bpj30vq0pq465.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"客户端库","attributes":{},"skip":false,"key":"6.3.1.2.1"},{"backlink":"usecases/service-mesh-adoption-and-evolution.html#fig6.3.1.3.1","level":"6.3.1.3","list_caption":"Figure: Service Mesh架构图","alt":"Service Mesh架构图","nro":216,"url":"../images/006tNbRwly1fubs6ts3sgj30vo0osdnj.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Service Mesh架构图","attributes":{},"skip":false,"key":"6.3.1.3.1"},{"backlink":"usecases/service-mesh-adoption-and-evolution.html#fig6.3.1.3.2","level":"6.3.1.3","list_caption":"Figure: Ingress或边缘代理架构图","alt":"Ingress或边缘代理架构图","nro":217,"url":"../images/006tNbRwly1fubsk4v16hj30vo0bq75z.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"Ingress或边缘代理架构图","attributes":{},"skip":false,"key":"6.3.1.3.2"},{"backlink":"usecases/service-mesh-adoption-and-evolution.html#fig6.3.1.3.3","level":"6.3.1.3","list_caption":"Figure: 路由器网格架构图","alt":"路由器网格架构图","nro":218,"url":"../images/006tNbRwly1fubsxrph3dj30vq0duq53.jpg","index":3,"caption_template":"图片 - _CAPTION_","label":"路由器网格架构图","attributes":{},"skip":false,"key":"6.3.1.3.3"},{"backlink":"usecases/service-mesh-adoption-and-evolution.html#fig6.3.1.3.4","level":"6.3.1.3","list_caption":"Figure: Proxy per Node架构图","alt":"Proxy per Node架构图","nro":219,"url":"../images/006tNbRwly1fubt5a97h7j30vq0bcq5p.jpg","index":4,"caption_template":"图片 - _CAPTION_","label":"Proxy per Node架构图","attributes":{},"skip":false,"key":"6.3.1.3.4"},{"backlink":"usecases/service-mesh-adoption-and-evolution.html#fig6.3.1.3.5","level":"6.3.1.3","list_caption":"Figure: Sidecar代理/Fabric模型架构图","alt":"Sidecar代理/Fabric模型架构图","nro":220,"url":"../images/006tNbRwly1fubvi0dnhlj30vo0ekwhx.jpg","index":5,"caption_template":"图片 - _CAPTION_","label":"Sidecar代理/Fabric模型架构图","attributes":{},"skip":false,"key":"6.3.1.3.5"},{"backlink":"usecases/service-mesh-adoption-and-evolution.html#fig6.3.1.3.6","level":"6.3.1.3","list_caption":"Figure: Sidecar代理/控制平面架构图","alt":"Sidecar代理/控制平面架构图","nro":221,"url":"../images/006tNbRwly1fubvr83wvgj30vq0mmdip.jpg","index":6,"caption_template":"图片 - _CAPTION_","label":"Sidecar代理/控制平面架构图","attributes":{},"skip":false,"key":"6.3.1.3.6"},{"backlink":"usecases/service-mesh-customization-and-integration.html#fig6.3.1.4.1","level":"6.3.1.4","list_caption":"Figure: nginMesh架构图","alt":"nginMesh架构图","nro":222,"url":"../images/006tNbRwly1fucp8yralaj30vu0sijx8.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"nginMesh架构图","attributes":{},"skip":false,"key":"6.3.1.4.1"},{"backlink":"usecases/service-mesh-customization-and-integration.html#fig6.3.1.4.2","level":"6.3.1.4","list_caption":"Figure: Mixer adapter","alt":"Mixer adapter","nro":223,"url":"../images/006tNbRwly1fucplat3l9j30vo0lw43l.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"Mixer adapter","attributes":{},"skip":false,"key":"6.3.1.4.2"},{"backlink":"usecases/service-mesh-customization-and-integration.html#fig6.3.1.4.3","level":"6.3.1.4","list_caption":"Figure: SOFAMesh","alt":"SOFAMesh","nro":224,"url":"../images/mosn-with-service-mesh.png","index":3,"caption_template":"图片 - _CAPTION_","label":"SOFAMesh","attributes":{},"skip":false,"key":"6.3.1.4.3"},{"backlink":"usecases/service-mesh-customization-and-integration.html#fig6.3.1.4.4","level":"6.3.1.4","list_caption":"Figure: SOFAMosn模块架构图","alt":"SOFAMosn模块架构图","nro":225,"url":"../images/006tNbRwly1fucpc5fn8wj31kw0sfdnu.jpg","index":4,"caption_template":"图片 - _CAPTION_","label":"SOFAMosn模块架构图","attributes":{},"skip":false,"key":"6.3.1.4.4"},{"backlink":"usecases/istio.html#fig6.3.2.1","level":"6.3.2","list_caption":"Figure: Istio的mindmap","alt":"Istio的mindmap","nro":226,"url":"../images/istio-mindmap.png","index":1,"caption_template":"图片 - _CAPTION_","label":"Istio的mindmap","attributes":{},"skip":false,"key":"6.3.2.1"},{"backlink":"usecases/istio.html#fig6.3.2.2","level":"6.3.2","list_caption":"Figure: Istio架构图","alt":"Istio架构图","nro":227,"url":"../images/istio-arch.png","index":2,"caption_template":"图片 - _CAPTION_","label":"Istio架构图","attributes":{},"skip":false,"key":"6.3.2.2"},{"backlink":"usecases/istio-installation.html#fig6.3.2.1.1","level":"6.3.2.1","list_caption":"Figure: Istio 在 Kubernetes 中的部署架构图","alt":"Istio 在 Kubernetes 中的部署架构图","nro":228,"url":"../images/istio-deployment-architecture-diagram.png","index":1,"caption_template":"图片 - _CAPTION_","label":"Istio 在 Kubernetes 中的部署架构图","attributes":{},"skip":false,"key":"6.3.2.1.1"},{"backlink":"usecases/istio-installation.html#fig6.3.2.1.2","level":"6.3.2.1","list_caption":"Figure: BookInfo Sample应用架构图","alt":"BookInfo Sample应用架构图","nro":229,"url":"../images/bookinfo-sample-arch.png","index":2,"caption_template":"图片 - _CAPTION_","label":"BookInfo Sample应用架构图","attributes":{},"skip":false,"key":"6.3.2.1.2"},{"backlink":"usecases/istio-installation.html#fig6.3.2.1.3","level":"6.3.2.1","list_caption":"Figure: BookInfo Sample页面","alt":"BookInfo Sample页面","nro":230,"url":"../images/bookinfo-sample.jpg","index":3,"caption_template":"图片 - _CAPTION_","label":"BookInfo Sample页面","attributes":{},"skip":false,"key":"6.3.2.1.3"},{"backlink":"usecases/istio-installation.html#fig6.3.2.1.4","level":"6.3.2.1","list_caption":"Figure: Istio Grafana界面","alt":"Istio Grafana界面","nro":231,"url":"../images/istio-grafana.jpg","index":4,"caption_template":"图片 - _CAPTION_","label":"Istio Grafana界面","attributes":{},"skip":false,"key":"6.3.2.1.4"},{"backlink":"usecases/istio-installation.html#fig6.3.2.1.5","level":"6.3.2.1","list_caption":"Figure: Prometheus页面","alt":"Prometheus页面","nro":232,"url":"../images/istio-prometheus.jpg","index":5,"caption_template":"图片 - _CAPTION_","label":"Prometheus页面","attributes":{},"skip":false,"key":"6.3.2.1.5"},{"backlink":"usecases/istio-installation.html#fig6.3.2.1.6","level":"6.3.2.1","list_caption":"Figure: Zipkin页面","alt":"Zipkin页面","nro":233,"url":"../images/istio-zipkin.jpg","index":6,"caption_template":"图片 - _CAPTION_","label":"Zipkin页面","attributes":{},"skip":false,"key":"6.3.2.1.6"},{"backlink":"usecases/istio-installation.html#fig6.3.2.1.7","level":"6.3.2.1","list_caption":"Figure: ServiceGraph页面","alt":"ServiceGraph页面","nro":234,"url":"../images/istio-servicegraph.jpg","index":7,"caption_template":"图片 - _CAPTION_","label":"ServiceGraph页面","attributes":{},"skip":false,"key":"6.3.2.1.7"},{"backlink":"usecases/istio-tutorials-collection.html#fig6.3.2.4.1","level":"6.3.2.4","list_caption":"Figure: katacoda","alt":"katacoda","nro":235,"url":"../images/006tNc79gy1ftwe77v4u5j31kw0ziwtw.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"katacoda","attributes":{},"skip":false,"key":"6.3.2.4.1"},{"backlink":"usecases/istio-tutorials-collection.html#fig6.3.2.4.2","level":"6.3.2.4","list_caption":"Figure: weavescope","alt":"weavescope","nro":236,"url":"../images/006tNc79gy1ftwhtmzhfej31kw0ziww1.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"weavescope","attributes":{},"skip":false,"key":"6.3.2.4.2"},{"backlink":"usecases/istio-tutorials-collection.html#fig6.3.2.4.3","level":"6.3.2.4","list_caption":"Figure: weavescope","alt":"weavescope","nro":237,"url":"../images/006tNc79gy1ftwhvtu1vxj31kw0zitvc.jpg","index":3,"caption_template":"图片 - _CAPTION_","label":"weavescope","attributes":{},"skip":false,"key":"6.3.2.4.3"},{"backlink":"usecases/istio-tutorials-collection.html#fig6.3.2.4.4","level":"6.3.2.4","list_caption":"Figure: Red Hat","alt":"Red Hat","nro":238,"url":"../images/006tNc79gy1ftwiolw1tyj31kw0zib29.jpg","index":4,"caption_template":"图片 - _CAPTION_","label":"Red Hat","attributes":{},"skip":false,"key":"6.3.2.4.4"},{"backlink":"usecases/istio-tutorials-collection.html#fig6.3.2.4.5","level":"6.3.2.4","list_caption":"Figure: Red Hat developers","alt":"Red Hat developers","nro":239,"url":"../images/006tNc79gy1ftwjyxiw1pj31kw0zi4qp.jpg","index":5,"caption_template":"图片 - _CAPTION_","label":"Red Hat developers","attributes":{},"skip":false,"key":"6.3.2.4.5"},{"backlink":"usecases/istio-tutorials-collection.html#fig6.3.2.4.6","level":"6.3.2.4","list_caption":"Figure: IBM developerWorks","alt":"IBM developerWorks","nro":240,"url":"../images/006tNc79gy1ftweryj0zrj31kw0zix6q.jpg","index":6,"caption_template":"图片 - _CAPTION_","label":"IBM developerWorks","attributes":{},"skip":false,"key":"6.3.2.4.6"},{"backlink":"usecases/istio-tutorials-collection.html#fig6.3.2.4.7","level":"6.3.2.4","list_caption":"Figure: IBM developers","alt":"IBM developers","nro":241,"url":"../images/006tNc79gy1ftwesjg1e2j31kw0s8woq.jpg","index":7,"caption_template":"图片 - _CAPTION_","label":"IBM developers","attributes":{},"skip":false,"key":"6.3.2.4.7"},{"backlink":"usecases/understand-sidecar-injection-and-traffic-hijack-in-istio-service-mesh.html#fig6.3.2.5.1","level":"6.3.2.5","list_caption":"Figure: Sidecar 模式示意图","alt":"Sidecar 模式示意图","nro":242,"url":"../images/sidecar-pattern.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Sidecar 模式示意图","attributes":{},"skip":false,"key":"6.3.2.5.1"},{"backlink":"usecases/understand-sidecar-injection-and-traffic-hijack-in-istio-service-mesh.html#fig6.3.2.5.2","level":"6.3.2.5","list_caption":"Figure: Sidecar 流量劫持示意图","alt":"Sidecar 流量劫持示意图","nro":243,"url":"../images/envoy-sidecar-traffic-interception-jimmysong-blog.png","index":2,"caption_template":"图片 - _CAPTION_","label":"Sidecar 流量劫持示意图","attributes":{},"skip":false,"key":"6.3.2.5.2"},{"backlink":"usecases/understand-sidecar-injection-and-traffic-hijack-in-istio-service-mesh.html#fig6.3.2.5.3","level":"6.3.2.5","list_caption":"Figure: iptables 调用链","alt":"iptables 调用链","nro":244,"url":"../images/iptables.jpg","index":3,"caption_template":"图片 - _CAPTION_","label":"iptables 调用链","attributes":{},"skip":false,"key":"6.3.2.5.3"},{"backlink":"usecases/understand-sidecar-injection-and-traffic-hijack-in-istio-service-mesh.html#fig6.3.2.5.4","level":"6.3.2.5","list_caption":"Figure: hook-connect 原理示意图","alt":"hook-connect 原理示意图","nro":245,"url":"../images/hook-connect.jpg","index":4,"caption_template":"图片 - _CAPTION_","label":"hook-connect 原理示意图","attributes":{},"skip":false,"key":"6.3.2.5.4"},{"backlink":"usecases/envoy-sidecar-routing-of-istio-service-mesh-deep-dive.html#fig6.3.2.6.1","level":"6.3.2.6","list_caption":"Figure: Bookinfo 示例","alt":"Bookinfo 示例","nro":246,"url":"../images/006tNbRwgy1fvlwjd3302j31bo0ro0x5.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Bookinfo 示例","attributes":{},"skip":false,"key":"6.3.2.6.1"},{"backlink":"usecases/linkerd.html#fig6.3.3.1","level":"6.3.3","list_caption":"Figure: source https://linkerd.io","alt":"source https://linkerd.io","nro":247,"url":"../images/diagram-individual-instance.png","index":1,"caption_template":"图片 - _CAPTION_","label":"source https://linkerd.io","attributes":{},"skip":false,"key":"6.3.3.1"},{"backlink":"usecases/linkerd.html#fig6.3.3.2","level":"6.3.3","list_caption":"Figure: Linkerd 部署架构(图片来自https://buoyant.io/2016/10/14/a-service-mesh-for-kubernetes-part-ii-pods-are-great-until-theyre-not/)","alt":"Linkerd 部署架构(图片来自https://buoyant.io/2016/10/14/a-service-mesh-for-kubernetes-part-ii-pods-are-great-until-theyre-not/)","nro":248,"url":"https://buoyant.io/wp-content/uploads/2017/07/buoyant-k8s-daemonset-mesh.png","index":2,"caption_template":"图片 - _CAPTION_","label":"Linkerd 部署架构(图片来自https://buoyant.io/2016/10/14/a-service-mesh-for-kubernetes-part-ii-pods-are-great-until-theyre-not/)","attributes":{},"skip":false,"key":"6.3.3.2"},{"backlink":"usecases/linkerd.html#fig6.3.3.3","level":"6.3.3","list_caption":"Figure: 基于 dtab 的路由规则配置阶段发布","alt":"基于 dtab 的路由规则配置阶段发布","nro":249,"url":"https://buoyant.io/wp-content/uploads/2017/07/buoyant-4_override.png","index":3,"caption_template":"图片 - _CAPTION_","label":"基于 dtab 的路由规则配置阶段发布","attributes":{},"skip":false,"key":"6.3.3.3"},{"backlink":"usecases/linkerd.html#fig6.3.3.4","level":"6.3.3","list_caption":"Figure: Linkerd ingress controller","alt":"Linkerd ingress controller","nro":250,"url":"https://buoyant.io/wp-content/uploads/2017/07/buoyant-k8s-hello-world-ingress-controller-1.png","index":4,"caption_template":"图片 - _CAPTION_","label":"Linkerd ingress controller","attributes":{},"skip":false,"key":"6.3.3.4"},{"backlink":"usecases/linkerd-user-guide.html#fig6.3.3.1.1","level":"6.3.3.1","list_caption":"Figure: Jenkins pipeline","alt":"Jenkins pipeline","nro":251,"url":"../images/linkerd-jenkins-pipeline.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Jenkins pipeline","attributes":{},"skip":false,"key":"6.3.3.1.1"},{"backlink":"usecases/linkerd-user-guide.html#fig6.3.3.1.2","level":"6.3.3.1","list_caption":"Figure: Jenkins config","alt":"Jenkins config","nro":252,"url":"../images/linkerd-jenkins.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"Jenkins config","attributes":{},"skip":false,"key":"6.3.3.1.2"},{"backlink":"usecases/linkerd-user-guide.html#fig6.3.3.1.3","level":"6.3.3.1","list_caption":"Figure: namerd","alt":"namerd","nro":253,"url":"../images/namerd-internal.jpg","index":3,"caption_template":"图片 - _CAPTION_","label":"namerd","attributes":{},"skip":false,"key":"6.3.3.1.3"},{"backlink":"usecases/linkerd-user-guide.html#fig6.3.3.1.4","level":"6.3.3.1","list_caption":"Figure: linkerd监控","alt":"linkerd监控","nro":254,"url":"../images/linkerd-helloworld-outgoing.jpg","index":4,"caption_template":"图片 - _CAPTION_","label":"linkerd监控","attributes":{},"skip":false,"key":"6.3.3.1.4"},{"backlink":"usecases/linkerd-user-guide.html#fig6.3.3.1.5","level":"6.3.3.1","list_caption":"Figure: linkerd监控","alt":"linkerd监控","nro":255,"url":"../images/linkerd-helloworld-incoming.jpg","index":5,"caption_template":"图片 - _CAPTION_","label":"linkerd监控","attributes":{},"skip":false,"key":"6.3.3.1.5"},{"backlink":"usecases/linkerd-user-guide.html#fig6.3.3.1.6","level":"6.3.3.1","list_caption":"Figure: linkerd性能监控","alt":"linkerd性能监控","nro":256,"url":"../images/linkerd-grafana.png","index":6,"caption_template":"图片 - _CAPTION_","label":"linkerd性能监控","attributes":{},"skip":false,"key":"6.3.3.1.6"},{"backlink":"usecases/linkerd-user-guide.html#fig6.3.3.1.7","level":"6.3.3.1","list_caption":"Figure: Linkerd ingress controller","alt":"Linkerd ingress controller","nro":257,"url":"../images/linkerd-ingress-controller.jpg","index":7,"caption_template":"图片 - _CAPTION_","label":"Linkerd ingress controller","attributes":{},"skip":false,"key":"6.3.3.1.7"},{"backlink":"usecases/conduit-installation.html#fig6.3.4.2.1","level":"6.3.4.2","list_caption":"Figure: Conduit dashboard","alt":"Conduit dashboard","nro":258,"url":"../images/conduit-dashboard.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Conduit dashboard","attributes":{},"skip":false,"key":"6.3.4.2.1"},{"backlink":"usecases/envoy.html#fig6.3.5.1","level":"6.3.5","list_caption":"Figure: 负载均衡器的特性以及拓扑类型","alt":"负载均衡器的特性以及拓扑类型","nro":259,"url":"../images/load-balancing-and-proxing.png","index":1,"caption_template":"图片 - _CAPTION_","label":"负载均衡器的特性以及拓扑类型","attributes":{},"skip":false,"key":"6.3.5.1"},{"backlink":"usecases/envoy-terminology.html#fig6.3.5.1.1","level":"6.3.5.1","list_caption":"Figure: Envoy proxy 架构图","alt":"Envoy proxy 架构图","nro":260,"url":"../images/envoy-arch.png","index":1,"caption_template":"图片 - _CAPTION_","label":"Envoy proxy 架构图","attributes":{},"skip":false,"key":"6.3.5.1.1"},{"backlink":"usecases/envoy-front-proxy.html#fig6.3.5.2.1","level":"6.3.5.2","list_caption":"Figure: Front proxy 部署结构图(转自https://www.envoyproxy.io/docs/envoy/latest/start/sandboxes/front_proxy)","alt":"Front proxy 部署结构图(转自https://www.envoyproxy.io/docs/envoy/latest/start/sandboxes/front_proxy)","nro":261,"url":"../images/envoyproxy-docker-compose.png","index":1,"caption_template":"图片 - _CAPTION_","label":"Front proxy 部署结构图(转自https://www.envoyproxy.io/docs/envoy/latest/start/sandboxes/front_proxy)","attributes":{},"skip":false,"key":"6.3.5.2.1"},{"backlink":"usecases/envoy-mesh-in-kubernetes-tutorial.html#fig6.3.5.3.1","level":"6.3.5.3","list_caption":"Figure: Envoy Mesh架构图","alt":"Envoy Mesh架构图","nro":262,"url":"../images/envoy-mesh-in-kubernetes.png","index":1,"caption_template":"图片 - _CAPTION_","label":"Envoy Mesh架构图","attributes":{},"skip":false,"key":"6.3.5.3.1"},{"backlink":"usecases/big-data.html#fig6.4.1","level":"6.4","list_caption":"Figure: Spark on yarn with kubernetes","alt":"Spark on yarn with kubernetes","nro":263,"url":"../images/spark-on-yarn-with-kubernetes.png","index":1,"caption_template":"图片 - _CAPTION_","label":"Spark on yarn with kubernetes","attributes":{},"skip":false,"key":"6.4.1"},{"backlink":"usecases/big-data.html#fig6.4.2","level":"6.4","list_caption":"Figure: 在kubernetes上使用多种调度方式","alt":"在kubernetes上使用多种调度方式","nro":264,"url":"../images/spark-on-kubernetes-with-different-schedulers.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"在kubernetes上使用多种调度方式","attributes":{},"skip":false,"key":"6.4.2"},{"backlink":"usecases/spark-standalone-on-kubernetes.html#fig6.4.1.1","level":"6.4.1","list_caption":"Figure: spark master ui","alt":"spark master ui","nro":265,"url":"../images/spark-ui.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"spark master ui","attributes":{},"skip":false,"key":"6.4.1.1"},{"backlink":"usecases/spark-standalone-on-kubernetes.html#fig6.4.1.2","level":"6.4.1","list_caption":"Figure: zeppelin ui","alt":"zeppelin ui","nro":266,"url":"../images/zeppelin-ui.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"zeppelin ui","attributes":{},"skip":false,"key":"6.4.1.2"},{"backlink":"usecases/serverless.html#fig6.5.1","level":"6.5","list_caption":"Figure: Serverless Landscape","alt":"Serverless Landscape","nro":267,"url":"../images/006tNbRwly1fx0ie2kb90j31kw0ynha3.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Serverless Landscape","attributes":{},"skip":false,"key":"6.5.1"},{"backlink":"usecases/serverless.html#fig6.5.2","level":"6.5","list_caption":"Figure: 从物理机到函数计算","alt":"从物理机到函数计算","nro":268,"url":"../images/from-bare-metal-to-functions.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"从物理机到函数计算","attributes":{},"skip":false,"key":"6.5.2"},{"backlink":"usecases/serverless.html#fig6.5.3","level":"6.5","list_caption":"Figure: FaaS Landscape","alt":"FaaS Landscape","nro":269,"url":"../images/redpoint-faas-landscape.jpg","index":3,"caption_template":"图片 - _CAPTION_","label":"FaaS Landscape","attributes":{},"skip":false,"key":"6.5.3"},{"backlink":"usecases/understanding-serverless.html#fig6.5.1.1","level":"6.5.1","list_caption":"Figure: Serverless 在云原生技术中的地位","alt":"Serverless 在云原生技术中的地位","nro":270,"url":"../images/cloud-landscape-zh.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Serverless 在云原生技术中的地位","attributes":{},"skip":false,"key":"6.5.1.1"},{"backlink":"usecases/understanding-serverless.html#fig6.5.1.2","level":"6.5.1","list_caption":"Figure: 服务端软件的运行环境","alt":"服务端软件的运行环境","nro":271,"url":"../images/serverless-server-side-software.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"服务端软件的运行环境","attributes":{},"skip":false,"key":"6.5.1.2"},{"backlink":"usecases/understanding-serverless.html#fig6.5.1.3","level":"6.5.1","list_caption":"Figure: FaaS应用架构","alt":"FaaS应用架构","nro":272,"url":"../images/serverless-faas-platform.jpg","index":3,"caption_template":"图片 - _CAPTION_","label":"FaaS应用架构","attributes":{},"skip":false,"key":"6.5.1.3"},{"backlink":"usecases/understanding-serverless.html#fig6.5.1.4","level":"6.5.1","list_caption":"Figure: Serverless 中的函数定义","alt":"Serverless 中的函数定义","nro":273,"url":"../images/006y8mN6ly1g7ldey3l7gj31ti0mwta9.jpg","index":4,"caption_template":"图片 - _CAPTION_","label":"Serverless 中的函数定义","attributes":{},"skip":false,"key":"6.5.1.4"},{"backlink":"usecases/understanding-serverless.html#fig6.5.1.5","level":"6.5.1","list_caption":"Figure: FaaS 中的函数","alt":"FaaS 中的函数","nro":274,"url":"../images/006y8mN6ly1g7ldhm7bxyj31040u0q5n.jpg","index":5,"caption_template":"图片 - _CAPTION_","label":"FaaS 中的函数","attributes":{},"skip":false,"key":"6.5.1.5"},{"backlink":"usecases/understanding-serverless.html#fig6.5.1.6","level":"6.5.1","list_caption":"Figure: 传统应用程序架构","alt":"传统应用程序架构","nro":275,"url":"../images/non-serverless-game-arch.jpg","index":6,"caption_template":"图片 - _CAPTION_","label":"传统应用程序架构","attributes":{},"skip":false,"key":"6.5.1.6"},{"backlink":"usecases/understanding-serverless.html#fig6.5.1.7","level":"6.5.1","list_caption":"Figure: Serverless架构","alt":"Serverless架构","nro":276,"url":"../images/serverless-game-arch.jpg","index":7,"caption_template":"图片 - _CAPTION_","label":"Serverless架构","attributes":{},"skip":false,"key":"6.5.1.7"},{"backlink":"usecases/openfaas-quick-start.html#fig6.5.2.1.1","level":"6.5.2.1","list_caption":"Figure: OpenFaaS架构","alt":"OpenFaaS架构","nro":277,"url":"../images/openfaas-arch.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"OpenFaaS架构","attributes":{},"skip":false,"key":"6.5.2.1.1"},{"backlink":"usecases/openfaas-quick-start.html#fig6.5.2.1.2","level":"6.5.2.1","list_caption":"Figure: OpenFaaS Prometheus","alt":"OpenFaaS Prometheus","nro":278,"url":"../images/openfaas-prometheus.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"OpenFaaS Prometheus","attributes":{},"skip":false,"key":"6.5.2.1.2"},{"backlink":"usecases/openfaas-quick-start.html#fig6.5.2.1.3","level":"6.5.2.1","list_caption":"Figure: OpenFaas Grafana监控","alt":"OpenFaas Grafana监控","nro":279,"url":"../images/openfaas-grafana.jpg","index":3,"caption_template":"图片 - _CAPTION_","label":"OpenFaas Grafana监控","attributes":{},"skip":false,"key":"6.5.2.1.3"},{"backlink":"usecases/openfaas-quick-start.html#fig6.5.2.1.4","level":"6.5.2.1","list_caption":"Figure: OpenFaas Dashboard","alt":"OpenFaas Dashboard","nro":280,"url":"../images/openfaas-deploy-a-function.jpg","index":4,"caption_template":"图片 - _CAPTION_","label":"OpenFaas Dashboard","attributes":{},"skip":false,"key":"6.5.2.1.4"},{"backlink":"usecases/openfaas-quick-start.html#fig6.5.2.1.5","level":"6.5.2.1","list_caption":"Figure: NodeInfo执行结果","alt":"NodeInfo执行结果","nro":281,"url":"../images/openfaas-nodeinfo.jpg","index":5,"caption_template":"图片 - _CAPTION_","label":"NodeInfo执行结果","attributes":{},"skip":false,"key":"6.5.2.1.5"},{"backlink":"usecases/knative.html#fig6.5.3.1","level":"6.5.3","list_caption":"Figure: Knative logo","alt":"Knative logo","nro":282,"url":"https://tva1.sinaimg.cn/large/006y8mN6ly1g7pg0iwbzfj30d8080dfp.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Knative logo","attributes":{},"skip":false,"key":"6.5.3.1"},{"backlink":"usecases/knative.html#fig6.5.3.2","level":"6.5.3","list_caption":"Figure: Knative 受众(图片来自 knative.dev)","alt":"Knative 受众(图片来自 knative.dev)","nro":283,"url":"https://tva1.sinaimg.cn/large/006y8mN6ly1g7po5i7cgqj31ap0u075l.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"Knative 受众(图片来自 knative.dev)","attributes":{},"skip":false,"key":"6.5.3.2"},{"backlink":"usecases/oam.html#fig6.6.1.1","level":"6.6.1","list_caption":"Figure: OAM 的原理","alt":"OAM 的原理","nro":284,"url":"../images/oam-principle.png","index":1,"caption_template":"图片 - _CAPTION_","label":"OAM 的原理","attributes":{},"skip":false,"key":"6.6.1.1"},{"backlink":"usecases/edge-computing.html#fig6.7.1","level":"6.7","list_caption":"Figure: KubeEdge logo","alt":"KubeEdge logo","nro":285,"url":"https://tva1.sinaimg.cn/large/006y8mN6ly1g7vfsugr2fj306y06yjra.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"KubeEdge logo","attributes":{},"skip":false,"key":"6.7.1"},{"backlink":"develop/sigs-and-working-group.html#fig7.2.1","level":"7.2","list_caption":"Figure: Kubernetes SIG","alt":"Kubernetes SIG","nro":286,"url":"../images/kubernetes-sigs.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Kubernetes SIG","attributes":{},"skip":false,"key":"7.2.1"},{"backlink":"develop/testing.html#fig7.4.1","level":"7.4","list_caption":"Figure: test-infra架构图(图片来自官方GitHub)","alt":"test-infra架构图(图片来自官方GitHub)","nro":287,"url":"../images/kubernetes-test-architecture.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"test-infra架构图(图片来自官方GitHub)","attributes":{},"skip":false,"key":"7.4.1"},{"backlink":"develop/client-go-sample.html#fig7.5.1","level":"7.5","list_caption":"Figure: 使用kubernetes dashboard进行故障排查","alt":"使用kubernetes dashboard进行故障排查","nro":288,"url":"../images/kubernetes-client-go-sample-update.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"使用kubernetes dashboard进行故障排查","attributes":{},"skip":false,"key":"7.5.1"},{"backlink":"cloud-native/cncf.html#fig8.1.1","level":"8.1","list_caption":"Figure: CNCF landscape","alt":"CNCF landscape","nro":289,"url":"../images/006tNbRwly1fxmx633ymqj31dp0u0kjn.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"CNCF landscape","attributes":{},"skip":false,"key":"8.1.1"},{"backlink":"cloud-native/cncf.html#fig8.1.2","level":"8.1","list_caption":"Figure: CNCF项目成熟度级别","alt":"CNCF项目成熟度级别","nro":290,"url":"../images/cncf-graduation-criteria-v2.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"CNCF项目成熟度级别","attributes":{},"skip":false,"key":"8.1.2"},{"backlink":"cloud-native/cncf-charter.html#fig8.2.1","level":"8.2","list_caption":"Figure: CNCF组织架构图","alt":"CNCF组织架构图","nro":291,"url":"../images/cncf-org-arch.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"CNCF组织架构图","attributes":{},"skip":false,"key":"8.2.1"},{"backlink":"cloud-native/cncf-charter.html#fig8.2.2","level":"8.2","list_caption":"Figure: 云原生的理想分层架构","alt":"云原生的理想分层架构","nro":292,"url":"../images/006tKfTcly1ft3zgjlisxj30n70ffjth.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"云原生的理想分层架构","attributes":{},"skip":false,"key":"8.2.2"},{"backlink":"cloud-native/cncf-sandbox-criteria.html#fig8.4.1","level":"8.4","list_caption":"Figure: sandbox 流程","alt":"sandbox 流程","nro":293,"url":"../images/sandbox-process.png","index":1,"caption_template":"图片 - _CAPTION_","label":"sandbox 流程","attributes":{},"skip":false,"key":"8.4.1"},{"backlink":"cloud-native/cncf-project-governing.html#fig8.5.1","level":"8.5","list_caption":"Figure: CNCF 项目的成熟度分类","alt":"CNCF 项目的成熟度分类","nro":294,"url":"../images/cncf-graduation.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"CNCF 项目的成熟度分类","attributes":{},"skip":false,"key":"8.5.1"},{"backlink":"cloud-native/cncf-project-governing.html#fig8.5.2","level":"8.5","list_caption":"Figure: CNCF中的项目运作","alt":"CNCF中的项目运作","nro":295,"url":"../images/006tNc79ly1g1yz80ag98j31cs0n2gr7.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"CNCF中的项目运作","attributes":{},"skip":false,"key":"8.5.2"},{"backlink":"cloud-native/cncf-project-governing.html#fig8.5.3","level":"8.5","list_caption":"Figure: CNCF项目成熟度级别","alt":"CNCF项目成熟度级别","nro":296,"url":"../images/cncf-graduation-criteria-v2.jpg","index":3,"caption_template":"图片 - _CAPTION_","label":"CNCF项目成熟度级别","attributes":{},"skip":false,"key":"8.5.3"},{"backlink":"appendix/material-share.html#fig9.3.1","level":"9.3","list_caption":"Figure: Kubernetes 资源图标示例","alt":"Kubernetes 资源图标示例","nro":297,"url":"../images/006tNc79ly1fzmnolp5ghj30z90u0gwf.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Kubernetes 资源图标示例","attributes":{},"skip":false,"key":"9.3.1"},{"backlink":"appendix/issues.html#fig9.6.1","level":"9.6","list_caption":"Figure: pvc-storage-limit","alt":"pvc-storage-limit","nro":298,"url":"../images/pvc-storage-limit.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"pvc-storage-limit","attributes":{},"skip":false,"key":"9.6.1"},{"backlink":"appendix/kubernetes-1.14-changelog.html#fig9.7.8.1","level":"9.7.8","list_caption":"Figure: 大鱿鱼:kubectl log","alt":"大鱿鱼:kubectl log","nro":299,"url":"../images/006tKfTcly1g1gbdpsdbgj303c03cwel.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"大鱿鱼:kubectl log","attributes":{},"skip":false,"key":"9.7.8.1"},{"backlink":"appendix/kubernetes-1.14-changelog.html#fig9.7.8.2","level":"9.7.8","list_caption":"Figure: Kubernetes 吉祥物 kubee-cuddle","alt":"Kubernetes 吉祥物 kubee-cuddle","nro":300,"url":"../images/006tKfTcly1g1gbjvx2ugj305k05mmx9.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"Kubernetes 吉祥物 kubee-cuddle","attributes":{},"skip":false,"key":"9.7.8.2"},{"backlink":"appendix/kubernetes-1.15-changelog.html#fig9.7.9.1","level":"9.7.9","list_caption":"Figure: KubeAdmin Logo","alt":"KubeAdmin Logo","nro":301,"url":"https://d33wubrfki0l68.cloudfront.net/285b361256db9bb624c22ff9cd32557b4bc61aba/759c7/images/blog/2019-06-19-kubernetes-1-15-release-announcement/kubeadm-logo.png","index":1,"caption_template":"图片 - _CAPTION_","label":"KubeAdmin Logo","attributes":{},"skip":false,"key":"9.7.9.1"},{"backlink":"appendix/kubernetes-and-cloud-native-summary-in-2018-and-outlook-for-2019.html#fig9.8.2.1","level":"9.8.2","list_caption":"Figure: Kubernetes 搜索趋势(来自 Google trends)","alt":"Kubernetes 搜索趋势(来自 Google trends)","nro":302,"url":"../images/006tNc79ly1fzne6y4f2ej31q60fedho.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Kubernetes 搜索趋势(来自 Google trends)","attributes":{},"skip":false,"key":"9.8.2.1"},{"backlink":"appendix/kubernetes-and-cloud-native-summary-in-2018-and-outlook-for-2019.html#fig9.8.2.2","level":"9.8.2","list_caption":"Figure: Kubernetes 的百度指数","alt":"Kubernetes 的百度指数","nro":303,"url":"../images/006tNc79ly1fznegoocmvj31y00hmgon.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"Kubernetes 的百度指数","attributes":{},"skip":false,"key":"9.8.2.2"},{"backlink":"appendix/kubernetes-and-cloud-native-summary-in-2018-and-outlook-for-2019.html#fig9.8.2.3","level":"9.8.2","list_caption":"Figure: Istio 中的 CRD","alt":"Istio 中的 CRD","nro":304,"url":"../images/006tNc79ly1fzna87wmfij30u00zc4qp.jpg","index":3,"caption_template":"图片 - _CAPTION_","label":"Istio 中的 CRD","attributes":{},"skip":false,"key":"9.8.2.3"},{"backlink":"appendix/kubernetes-and-cloud-native-summary-in-2018-and-outlook-for-2019.html#fig9.8.2.4","level":"9.8.2","list_caption":"Figure: 2019 Q1 软件架构趋势 - 来自 InfoQ","alt":"2019 Q1 软件架构趋势 - 来自 InfoQ","nro":305,"url":"../images/006tNc79ly1fzor2k6f7wj313j0u0dl3.jpg","index":4,"caption_template":"图片 - _CAPTION_","label":"2019 Q1 软件架构趋势 - 来自 InfoQ","attributes":{},"skip":false,"key":"9.8.2.4"},{"backlink":"appendix/kubernetes-and-cloud-native-summary-in-2018-and-outlook-for-2019.html#fig9.8.2.5","level":"9.8.2","list_caption":"Figure: ServiceMesher 社区 Logo","alt":"ServiceMesher 社区 Logo","nro":306,"url":"../images/006tNc79ly1fznadbp63qj31jt0beq9s.jpg","index":5,"caption_template":"图片 - _CAPTION_","label":"ServiceMesher 社区 Logo","attributes":{},"skip":false,"key":"9.8.2.5"},{"backlink":"appendix/kubernetes-and-cloud-native-summary-in-2018-and-outlook-for-2019.html#fig9.8.2.6","level":"9.8.2","list_caption":"Figure: ServiceMesher社区2018年活动一览","alt":"ServiceMesher社区2018年活动一览","nro":307,"url":"../images/006tNc79ly1fzm9vs4o3aj31s00u0x6p.jpg","index":6,"caption_template":"图片 - _CAPTION_","label":"ServiceMesher社区2018年活动一览","attributes":{},"skip":false,"key":"9.8.2.6"},{"backlink":"appendix/kubernetes-and-cloud-native-summary-in-2018-and-outlook-for-2019.html#fig9.8.2.7","level":"9.8.2","list_caption":"Figure: CNCF Landscape 中的 Serverless 单元","alt":"CNCF Landscape 中的 Serverless 单元","nro":308,"url":"../images/006tNc79ly1fznbh3vfbwj310f0jxgxj.jpg","index":7,"caption_template":"图片 - _CAPTION_","label":"CNCF Landscape 中的 Serverless 单元","attributes":{},"skip":false,"key":"9.8.2.7"},{"backlink":"appendix/cncf-annual-report-2018.html#fig9.9.1.1","level":"9.9.1","list_caption":"Figure: CNCF 项目成熟度级别","alt":"CNCF 项目成熟度级别","nro":309,"url":"../images/006tNc79ly1g04s0oznytj31tg0ok7ca.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"CNCF 项目成熟度级别","attributes":{},"skip":false,"key":"9.9.1.1"},{"backlink":"appendix/cncf-annual-report-2018.html#fig9.9.1.2","level":"9.9.1","list_caption":"Figure: KCSP","alt":"KCSP","nro":310,"url":"../images/006tNc79ly1g04tl97vm4j318v0h7dpt.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"KCSP","attributes":{},"skip":false,"key":"9.9.1.2"},{"backlink":"appendix/about-cka-candidate.html#fig9.11.1","level":"9.11","list_caption":"Figure: cka-question","alt":"cka-question","nro":311,"url":"../images/cka-question.png","index":1,"caption_template":"图片 - _CAPTION_","label":"cka-question","attributes":{},"skip":false,"key":"9.11.1"},{"backlink":"appendix/about-cka-candidate.html#fig9.11.2","level":"9.11","list_caption":"Figure: CKA mindmap","alt":"CKA mindmap","nro":312,"url":"../images/cka-mindmap.png","index":2,"caption_template":"图片 - _CAPTION_","label":"CKA mindmap","attributes":{},"skip":false,"key":"9.11.2"}]},"title":"Kubernetes Handbook - Kubernetes中文指南/云原生应用架构实践手册 by Jimmy Song(宋净超)","language":"zh-hans","links":{"sidebar":{"回到主页":"https://jimmysong.io","Awesome Cloud Native":"https://jimmysong.io/awesome-cloud-native","云原生社区":"https://cloudnative.to","中国云原生发展白皮书2020":"https://cloudnativeindustryalliance.github.io/whitepaper2020/","云原生应用白皮书":"https://jimmysong.io/guide-to-cloud-native-app/"}},"gitbook":"*","description":"Kubernetes Handbook - Kubernetes中文指南/云原生应用架构实践手册,本书记录了本人从零开始学习和使用Kubernetes的心路历程,着重于经验分享和总结,同时也会有相关的概念解析,希望能够帮助大家少踩坑,少走弯路,还会指引大家关注Kubernetes生态周边,如微服务构建、DevOps、大数据应用、Service Mesh、Cloud Native等领域。"},"file":{"path":"cloud-native/cloud-native-programming-language-pulumi.md","mtime":"2020-06-19T06:25:56.869Z","type":"markdown"},"gitbook":{"version":"3.2.3","time":"2020-06-19T06:27:05.421Z"},"basePath":"..","book":{"language":""}});
+ gitbook.page.hasChanged({"page":{"title":"云原生编程语言 Pulumi","level":"2.8.2","depth":2,"next":{"title":"云原生的未来","level":"2.9","depth":1,"path":"cloud-native/the-future-of-cloud-native.md","ref":"cloud-native/the-future-of-cloud-native.md","articles":[]},"previous":{"title":"云原生编程语言 Ballerina","level":"2.8.1","depth":2,"path":"cloud-native/cloud-native-programming-language-ballerina.md","ref":"cloud-native/cloud-native-programming-language-ballerina.md","articles":[]},"dir":"ltr"},"config":{"plugins":["github","codesnippet","splitter","page-toc-button","image-captions","editlink","back-to-top-button","-lunr","-search","search-plus","github-buttons@2.1.0","favicon@^0.0.2","tbfed-pagefooter@^0.0.1","3-ba","theme-default","-highlight","prism","prism-themes","sitemap-general","lightbox","ga","copy-code-button","alerts"],"styles":{"ebook":"styles/ebook.css","epub":"styles/epub.css","mobi":"styles/mobi.css","pdf":"styles/pdf.css","print":"styles/print.css","website":"styles/website.css"},"pluginsConfig":{"tbfed-pagefooter":{"copyright":"加入中国最大的有技术、有温度、有情怀的云原生社区 Copyright © 2017-2020 | Distributed under CC BY 4.0 | jimmysong.io ","modify_label":" Updated at ","modify_format":"YYYY-MM-DD HH:mm:ss"},"prism":{"css":["prism-themes/themes/prism-ghcolors.css"]},"github":{"url":"https://github.com/rootsongjc/kubernetes-handbook"},"editlink":{"label":"编辑本页","multilingual":false,"base":"https://github.com/rootsongjc/kubernetes-handbook/blob/master/"},"splitter":{},"codesnippet":{},"sitemap-general":{"prefix":"https://jimmysong.io/kubernetes-handbook/"},"fontsettings":{"theme":"white","family":"sans","size":2},"favicon":{"shortcut":"favicon.ico","bookmark":"favicon.ico"},"lightbox":{"jquery":true,"sameUuid":false},"page-toc-button":{},"back-to-top-button":{},"prism-themes":{},"alerts":{},"github-buttons":{"repo":"rootsongjc/kubernetes-handbook","types":["star"],"size":"small"},"3-ba":{"configuration":"auto","token":"11f7d254cfa4e0ca44b175c66d379ecc"},"copy-code-button":{},"ga":{"configuration":"auto","token":"UA-93485976-1"},"sharing":{"facebook":true,"twitter":true,"google":false,"weibo":false,"instapaper":false,"vk":false,"all":["facebook","google","twitter","weibo","instapaper"]},"theme-default":{"showLevel":true,"styles":{"ebook":"styles/ebook.css","epub":"styles/epub.css","mobi":"styles/mobi.css","pdf":"styles/pdf.css","print":"styles/print.css","website":"styles/website.css"}},"search-plus":{},"image-captions":{"caption":"图片 - _CAPTION_","variable_name":"_pictures"}},"theme":"default","author":"Jimmy Song(宋净超)","pdf":{"pageNumbers":true,"fontSize":12,"fontFamily":"Arial","paperSize":"a4","chapterMark":"pagebreak","pageBreaksBefore":"/","margin":{"right":62,"left":62,"top":56,"bottom":56}},"structure":{"langs":"LANGS.md","readme":"README.md","glossary":"GLOSSARY.md","summary":"SUMMARY.md"},"variables":{"_pictures":[{"backlink":"index.html#fig1.1.1","level":"1.1","list_caption":"Figure: Stargazers over time","alt":"Stargazers over time","nro":1,"url":"https://starcharts.herokuapp.com/rootsongjc/kubernetes-handbook.svg","index":1,"caption_template":"图片 - _CAPTION_","label":"Stargazers over time","attributes":{},"skip":false,"key":"1.1.1"},{"backlink":"cloud-native/play-with-kubernetes.html#fig2.3.1","level":"2.3","list_caption":"Figure: Play with Kubernetes网页截图","alt":"Play with Kubernetes网页截图","nro":2,"url":"../images/play-with-kubernetes.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Play with Kubernetes网页截图","attributes":{},"skip":false,"key":"2.3.1"},{"backlink":"cloud-native/cloud-native-local-quick-start.html#fig2.4.1","level":"2.4","list_caption":"Figure: Kubernetes dashboard","alt":"Kubernetes dashboard","nro":3,"url":"https://github.com/rootsongjc/kubernetes-vagrant-centos-cluster/raw/master/images/dashboard-animation.gif","index":1,"caption_template":"图片 - _CAPTION_","label":"Kubernetes dashboard","attributes":{},"skip":false,"key":"2.4.1"},{"backlink":"cloud-native/cloud-native-local-quick-start.html#fig2.4.2","level":"2.4","list_caption":"Figure: Grafana","alt":"Grafana","nro":4,"url":"https://github.com/rootsongjc/kubernetes-vagrant-centos-cluster/raw/master/images/grafana-animation.gif","index":2,"caption_template":"图片 - _CAPTION_","label":"Grafana","attributes":{},"skip":false,"key":"2.4.2"},{"backlink":"cloud-native/cloud-native-local-quick-start.html#fig2.4.3","level":"2.4","list_caption":"Figure: Traefik dashboard","alt":"Traefik dashboard","nro":5,"url":"https://github.com/rootsongjc/kubernetes-vagrant-centos-cluster/raw/master/images/traefik-ingress.gif","index":3,"caption_template":"图片 - _CAPTION_","label":"Traefik dashboard","attributes":{},"skip":false,"key":"2.4.3"},{"backlink":"cloud-native/cloud-native-local-quick-start.html#fig2.4.4","level":"2.4","list_caption":"Figure: bookinfo示例","alt":"bookinfo示例","nro":6,"url":"https://github.com/rootsongjc/kubernetes-vagrant-centos-cluster/raw/master/images/bookinfo-demo.gif","index":4,"caption_template":"图片 - _CAPTION_","label":"bookinfo示例","attributes":{},"skip":false,"key":"2.4.4"},{"backlink":"cloud-native/cloud-native-local-quick-start.html#fig2.4.5","level":"2.4","list_caption":"Figure: vistio视图动画","alt":"vistio视图动画","nro":7,"url":"https://github.com/rootsongjc/kubernetes-vagrant-centos-cluster/raw/master/images/vistio-animation.gif","index":5,"caption_template":"图片 - _CAPTION_","label":"vistio视图动画","attributes":{},"skip":false,"key":"2.4.5"},{"backlink":"cloud-native/cloud-native-local-quick-start.html#fig2.4.6","level":"2.4","list_caption":"Figure: Kiali页面","alt":"Kiali页面","nro":8,"url":"https://github.com/rootsongjc/kubernetes-vagrant-centos-cluster/raw/master/images/kiali.gif","index":6,"caption_template":"图片 - _CAPTION_","label":"Kiali页面","attributes":{},"skip":false,"key":"2.4.6"},{"backlink":"cloud-native/cloud-native-local-quick-start.html#fig2.4.7","level":"2.4","list_caption":"Figure: Scope页面","alt":"Scope页面","nro":9,"url":"https://github.com/rootsongjc/kubernetes-vagrant-centos-cluster/raw/master/images/weave-scope-animation.gif","index":7,"caption_template":"图片 - _CAPTION_","label":"Scope页面","attributes":{},"skip":false,"key":"2.4.7"},{"backlink":"cloud-native/setup-kubernetes-with-rancher-and-aliyun.html#fig2.5.1","level":"2.5","list_caption":"Figure: Rancher 界面","alt":"Rancher 界面","nro":10,"url":"../images/rancher-web.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Rancher 界面","attributes":{},"skip":false,"key":"2.5.1"},{"backlink":"cloud-native/setup-kubernetes-with-rancher-and-aliyun.html#fig2.5.2","level":"2.5","list_caption":"Figure: 自定义节点信息","alt":"自定义节点信息","nro":11,"url":"../images/rancher-customize-node.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"自定义节点信息","attributes":{},"skip":false,"key":"2.5.2"},{"backlink":"cloud-native/setup-kubernetes-with-rancher-and-aliyun.html#fig2.5.3","level":"2.5","list_caption":"Figure: Rancher 集群监控页面","alt":"Rancher 集群监控页面","nro":12,"url":"../images/rancher-cluster.jpg","index":3,"caption_template":"图片 - _CAPTION_","label":"Rancher 集群监控页面","attributes":{},"skip":false,"key":"2.5.3"},{"backlink":"cloud-native/kubernetes-and-cloud-native-app-overview.html#fig2.6.1","level":"2.6","list_caption":"Figure: 云计算演进历程","alt":"云计算演进历程","nro":13,"url":"../images/cloud-computing-evolution-road.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"云计算演进历程","attributes":{},"skip":false,"key":"2.6.1"},{"backlink":"cloud-native/kubernetes-and-cloud-native-app-overview.html#fig2.6.2","level":"2.6","list_caption":"Figure: 来自Twitter @MarcWilczek","alt":"来自Twitter @MarcWilczek","nro":14,"url":"../images/cloud-native-comes-of-age.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"来自Twitter @MarcWilczek","attributes":{},"skip":false,"key":"2.6.2"},{"backlink":"cloud-native/kubernetes-and-cloud-native-app-overview.html#fig2.6.3","level":"2.6","list_caption":"Figure: Cloud native思维导图","alt":"Cloud native思维导图","nro":15,"url":"../images/cloud-native-architecutre-mindnode.jpg","index":3,"caption_template":"图片 - _CAPTION_","label":"Cloud native思维导图","attributes":{},"skip":false,"key":"2.6.3"},{"backlink":"cloud-native/kubernetes-and-cloud-native-app-overview.html#fig2.6.4","level":"2.6","list_caption":"Figure: 十二因素应用","alt":"十二因素应用","nro":16,"url":"../images/12-factor-app.png","index":4,"caption_template":"图片 - _CAPTION_","label":"十二因素应用","attributes":{},"skip":false,"key":"2.6.4"},{"backlink":"cloud-native/kubernetes-and-cloud-native-app-overview.html#fig2.6.5","level":"2.6","list_caption":"Figure: 容器生态","alt":"容器生态","nro":17,"url":"../images/container-ecosystem.png","index":5,"caption_template":"图片 - _CAPTION_","label":"容器生态","attributes":{},"skip":false,"key":"2.6.5"},{"backlink":"cloud-native/kubernetes-and-cloud-native-app-overview.html#fig2.6.6","level":"2.6","list_caption":"Figure: 使用Jenkins进行持续集成与发布流程图","alt":"使用Jenkins进行持续集成与发布流程图","nro":18,"url":"../images/kubernetes-jenkins-ci-cd.png","index":6,"caption_template":"图片 - _CAPTION_","label":"使用Jenkins进行持续集成与发布流程图","attributes":{},"skip":false,"key":"2.6.6"},{"backlink":"cloud-native/kubernetes-and-cloud-native-app-overview.html#fig2.6.7","level":"2.6","list_caption":"Figure: filebeat日志收集架构图","alt":"filebeat日志收集架构图","nro":19,"url":"../images/filebeat-log-collector-arch.png","index":7,"caption_template":"图片 - _CAPTION_","label":"filebeat日志收集架构图","attributes":{},"skip":false,"key":"2.6.7"},{"backlink":"cloud-native/kubernetes-and-cloud-native-app-overview.html#fig2.6.8","level":"2.6","list_caption":"Figure: API文档","alt":"API文档","nro":20,"url":"../images/k8s-app-monitor-test-api-doc.jpg","index":8,"caption_template":"图片 - _CAPTION_","label":"API文档","attributes":{},"skip":false,"key":"2.6.8"},{"backlink":"cloud-native/kubernetes-and-cloud-native-app-overview.html#fig2.6.9","level":"2.6","list_caption":"Figure: 迁移步骤示意图","alt":"迁移步骤示意图","nro":21,"url":"../images/migrating-hadoop-yarn-to-kubernetes.png","index":9,"caption_template":"图片 - _CAPTION_","label":"迁移步骤示意图","attributes":{},"skip":false,"key":"2.6.9"},{"backlink":"cloud-native/kubernetes-and-cloud-native-app-overview.html#fig2.6.10","level":"2.6","list_caption":"Figure: service mesh架构图","alt":"service mesh架构图","nro":22,"url":"../images/serivce-mesh-control-plane.png","index":10,"caption_template":"图片 - _CAPTION_","label":"service mesh架构图","attributes":{},"skip":false,"key":"2.6.10"},{"backlink":"cloud-native/kubernetes-and-cloud-native-app-overview.html#fig2.6.11","level":"2.6","list_caption":"Figure: kibana界面","alt":"kibana界面","nro":23,"url":"../images/filebeat-docker-test.jpg","index":11,"caption_template":"图片 - _CAPTION_","label":"kibana界面","attributes":{},"skip":false,"key":"2.6.11"},{"backlink":"cloud-native/kubernetes-and-cloud-native-app-overview.html#fig2.6.12","level":"2.6","list_caption":"Figure: Grafana界面示意图1","alt":"Grafana界面示意图1","nro":24,"url":"../images/kubernetes-devops-example-grafana-1.png","index":12,"caption_template":"图片 - _CAPTION_","label":"Grafana界面示意图1","attributes":{},"skip":false,"key":"2.6.12"},{"backlink":"cloud-native/kubernetes-and-cloud-native-app-overview.html#fig2.6.13","level":"2.6","list_caption":"Figure: Grafana界面示意图2","alt":"Grafana界面示意图2","nro":25,"url":"../images/kubernetes-devops-example-grafana-2.png","index":13,"caption_template":"图片 - _CAPTION_","label":"Grafana界面示意图2","attributes":{},"skip":false,"key":"2.6.13"},{"backlink":"cloud-native/kubernetes-and-cloud-native-app-overview.html#fig2.6.14","level":"2.6","list_caption":"Figure: Grafana界面示意图3","alt":"Grafana界面示意图3","nro":26,"url":"../images/kubernetes-devops-example-grafana-3.png","index":14,"caption_template":"图片 - _CAPTION_","label":"Grafana界面示意图3","attributes":{},"skip":false,"key":"2.6.14"},{"backlink":"cloud-native/kubernetes-and-cloud-native-app-overview.html#fig2.6.15","level":"2.6","list_caption":"Figure: dashboard","alt":"dashboard","nro":27,"url":"../images/spark-job-on-kubernetes-example-1.jpg","index":15,"caption_template":"图片 - _CAPTION_","label":"dashboard","attributes":{},"skip":false,"key":"2.6.15"},{"backlink":"cloud-native/kubernetes-and-cloud-native-app-overview.html#fig2.6.16","level":"2.6","list_caption":"Figure: Grafana","alt":"Grafana","nro":28,"url":"../images/spark-job-on-kubernetes-example-2.jpg","index":16,"caption_template":"图片 - _CAPTION_","label":"Grafana","attributes":{},"skip":false,"key":"2.6.16"},{"backlink":"cloud-native/from-kubernetes-to-cloud-native.html#fig2.7.1","level":"2.7","list_caption":"Figure: 容器生态图 Container ecosystem","alt":"容器生态图 Container ecosystem","nro":29,"url":"../images/container-ecosystem.png","index":1,"caption_template":"图片 - _CAPTION_","label":"容器生态图 Container ecosystem","attributes":{},"skip":false,"key":"2.7.1"},{"backlink":"cloud-native/from-kubernetes-to-cloud-native.html#fig2.7.2","level":"2.7","list_caption":"Figure: Kubernetes架构","alt":"Kubernetes架构","nro":30,"url":"../images/kubernetes-high-level-component-archtecture.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"Kubernetes架构","attributes":{},"skip":false,"key":"2.7.2"},{"backlink":"cloud-native/from-kubernetes-to-cloud-native.html#fig2.7.3","level":"2.7","list_caption":"Figure: Cloud Native Core target","alt":"Cloud Native Core target","nro":31,"url":"../images/cloud-native-core-target.jpg","index":3,"caption_template":"图片 - _CAPTION_","label":"Cloud Native Core target","attributes":{},"skip":false,"key":"2.7.3"},{"backlink":"cloud-native/from-kubernetes-to-cloud-native.html#fig2.7.4","level":"2.7","list_caption":"Figure: FaaS Landscape","alt":"FaaS Landscape","nro":32,"url":"../images/redpoint-faas-landscape.jpg","index":4,"caption_template":"图片 - _CAPTION_","label":"FaaS Landscape","attributes":{},"skip":false,"key":"2.7.4"},{"backlink":"cloud-native/from-kubernetes-to-cloud-native.html#fig2.7.5","level":"2.7","list_caption":"Figure: Workloads running on Kubernetes","alt":"Workloads running on Kubernetes","nro":33,"url":"../images/0069RVTdgy1fv5mxr6fxtj31kw11q484.jpg","index":5,"caption_template":"图片 - _CAPTION_","label":"Workloads running on Kubernetes","attributes":{},"skip":false,"key":"2.7.5"},{"backlink":"cloud-native/from-kubernetes-to-cloud-native.html#fig2.7.6","level":"2.7","list_caption":"Figure: Gartner技术爆发趋势图2017","alt":"Gartner技术爆发趋势图2017","nro":34,"url":"../images/0069RVTdgy1fv5my2jtxzj315o0z8dkr.jpg","index":6,"caption_template":"图片 - _CAPTION_","label":"Gartner技术爆发趋势图2017","attributes":{},"skip":false,"key":"2.7.6"},{"backlink":"cloud-native/from-kubernetes-to-cloud-native.html#fig2.7.7","level":"2.7","list_caption":"Figure: Microservices concerns","alt":"Microservices concerns","nro":35,"url":"../images/microservices-concerns.jpg","index":7,"caption_template":"图片 - _CAPTION_","label":"Microservices concerns","attributes":{},"skip":false,"key":"2.7.7"},{"backlink":"cloud-native/from-kubernetes-to-cloud-native.html#fig2.7.8","level":"2.7","list_caption":"Figure: 两种服务发现方式","alt":"两种服务发现方式","nro":36,"url":"../images/service-discovery-in-microservices.png","index":8,"caption_template":"图片 - _CAPTION_","label":"两种服务发现方式","attributes":{},"skip":false,"key":"2.7.8"},{"backlink":"cloud-native/from-kubernetes-to-cloud-native.html#fig2.7.9","level":"2.7","list_caption":"Figure: Cloud Native Features","alt":"Cloud Native Features","nro":37,"url":"https://jimmysong.io/kubernetes-handbook/images/cloud-native-architecutre-mindnode.jpg","index":9,"caption_template":"图片 - _CAPTION_","label":"Cloud Native Features","attributes":{},"skip":false,"key":"2.7.9"},{"backlink":"cloud-native/from-kubernetes-to-cloud-native.html#fig2.7.10","level":"2.7","list_caption":"Figure: Cloud Native Landscape v1.0","alt":"Cloud Native Landscape v1.0","nro":38,"url":"../images/0069RVTdgy1fv5myp6ednj31kw0w0u0x.jpg","index":10,"caption_template":"图片 - _CAPTION_","label":"Cloud Native Landscape v1.0","attributes":{},"skip":false,"key":"2.7.10"},{"backlink":"cloud-native/from-kubernetes-to-cloud-native.html#fig2.7.11","level":"2.7","list_caption":"Figure: Building a Cloud Native Architecture with Kubernetes followed 12 factor app","alt":"Building a Cloud Native Architecture with Kubernetes followed 12 factor app","nro":39,"url":"../images/building-cloud-native-architecture-with-kubernetes.png","index":11,"caption_template":"图片 - _CAPTION_","label":"Building a Cloud Native Architecture with Kubernetes followed 12 factor app","attributes":{},"skip":false,"key":"2.7.11"},{"backlink":"cloud-native/from-kubernetes-to-cloud-native.html#fig2.7.12","level":"2.7","list_caption":"Figure: Creating Kubernetes native app","alt":"Creating Kubernetes native app","nro":40,"url":"../images/creating-kubernetes-native-app.jpg","index":12,"caption_template":"图片 - _CAPTION_","label":"Creating Kubernetes native app","attributes":{},"skip":false,"key":"2.7.12"},{"backlink":"cloud-native/from-kubernetes-to-cloud-native.html#fig2.7.13","level":"2.7","list_caption":"Figure: istio vs linkerd","alt":"istio vs linkerd","nro":41,"url":"../images/istio-vs-linkerd.jpg","index":13,"caption_template":"图片 - _CAPTION_","label":"istio vs linkerd","attributes":{},"skip":false,"key":"2.7.13"},{"backlink":"cloud-native/from-kubernetes-to-cloud-native.html#fig2.7.14","level":"2.7","list_caption":"Figure: Deployment pipeline","alt":"Deployment pipeline","nro":42,"url":"../images/0069RVTdgy1fv5mzj8rj6j318g1ewtfc.jpg","index":14,"caption_template":"图片 - _CAPTION_","label":"Deployment pipeline","attributes":{},"skip":false,"key":"2.7.14"},{"backlink":"cloud-native/from-kubernetes-to-cloud-native.html#fig2.7.15","level":"2.7","list_caption":"Figure: Spark on Kubernetes with different schedulers","alt":"Spark on Kubernetes with different schedulers","nro":43,"url":"../images/spark-on-kubernetes-with-different-schedulers.jpg","index":15,"caption_template":"图片 - _CAPTION_","label":"Spark on Kubernetes with different schedulers","attributes":{},"skip":false,"key":"2.7.15"},{"backlink":"cloud-native/from-kubernetes-to-cloud-native.html#fig2.7.16","level":"2.7","list_caption":"Figure: Kubernetes solutions","alt":"Kubernetes solutions","nro":44,"url":"../images/0069RVTdgy1fv5mzywc83j31fk1i8qg4.jpg","index":16,"caption_template":"图片 - _CAPTION_","label":"Kubernetes solutions","attributes":{},"skip":false,"key":"2.7.16"},{"backlink":"cloud-native/from-kubernetes-to-cloud-native.html#fig2.7.17","level":"2.7","list_caption":"Figure: Kubernetes SIG","alt":"Kubernetes SIG","nro":45,"url":"../images/kubernetes-sigs.jpg","index":17,"caption_template":"图片 - _CAPTION_","label":"Kubernetes SIG","attributes":{},"skip":false,"key":"2.7.17"},{"backlink":"cloud-native/cloud-native-programming-language-ballerina.html#fig2.8.1.1","level":"2.8.1","list_caption":"Figure: 云原生编程语言ballerina","alt":"云原生编程语言ballerina","nro":46,"url":"../images/philosophy-page-diagrams-top.png","index":1,"caption_template":"图片 - _CAPTION_","label":"云原生编程语言ballerina","attributes":{},"skip":false,"key":"2.8.1.1"},{"backlink":"cloud-native/cloud-native-programming-language-ballerina.html#fig2.8.1.2","level":"2.8.1","list_caption":"Figure: 云原生编程语言Ballerina的序列图设计理念","alt":"云原生编程语言Ballerina的序列图设计理念","nro":47,"url":"../images/philosophy-principle-diagrams-01.png","index":2,"caption_template":"图片 - _CAPTION_","label":"云原生编程语言Ballerina的序列图设计理念","attributes":{},"skip":false,"key":"2.8.1.2"},{"backlink":"cloud-native/cloud-native-programming-language-ballerina.html#fig2.8.1.3","level":"2.8.1","list_caption":"Figure: 云原生编程语言Ballerina的并发理念","alt":"云原生编程语言Ballerina的并发理念","nro":48,"url":"../images/philosophy-principle-diagrams-02.png","index":3,"caption_template":"图片 - _CAPTION_","label":"云原生编程语言Ballerina的并发理念","attributes":{},"skip":false,"key":"2.8.1.3"},{"backlink":"cloud-native/cloud-native-programming-language-ballerina.html#fig2.8.1.4","level":"2.8.1","list_caption":"Figure: 云原生编程语言ballerina运行时架构","alt":"云原生编程语言ballerina运行时架构","nro":49,"url":"../images/philosophy-diagrams-for-site-02.png","index":4,"caption_template":"图片 - _CAPTION_","label":"云原生编程语言ballerina运行时架构","attributes":{},"skip":false,"key":"2.8.1.4"},{"backlink":"cloud-native/cloud-native-programming-language-ballerina.html#fig2.8.1.5","level":"2.8.1","list_caption":"Figure: 云原生编程语言ballerina部署架构图","alt":"云原生编程语言ballerina部署架构图","nro":50,"url":"../images/philosophy-diagrams-for-site-03.png","index":5,"caption_template":"图片 - _CAPTION_","label":"云原生编程语言ballerina部署架构图","attributes":{},"skip":false,"key":"2.8.1.5"},{"backlink":"cloud-native/cloud-native-programming-language-ballerina.html#fig2.8.1.6","level":"2.8.1","list_caption":"Figure: 云原生编程语言ballerina生命周期架构图","alt":"云原生编程语言ballerina生命周期架构图","nro":51,"url":"../images/philosophy-diagrams-for-site-04.png","index":6,"caption_template":"图片 - _CAPTION_","label":"云原生编程语言ballerina生命周期架构图","attributes":{},"skip":false,"key":"2.8.1.6"},{"backlink":"cloud-native/cloud-native-programming-language-pulumi.html#fig2.8.2.1","level":"2.8.2","list_caption":"Figure: 云原生编程语言Pulumi","alt":"云原生编程语言Pulumi","nro":52,"url":"../images/00704eQkgy1fsm4v0a6qwj30xc0m8t9d.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"云原生编程语言Pulumi","attributes":{},"skip":false,"key":"2.8.2.1"},{"backlink":"cloud-native/the-future-of-cloud-native.html#fig2.9.1","level":"2.9","list_caption":"Figure: Kubernetes 云原生的操作系统","alt":"Kubernetes 云原生的操作系统","nro":53,"url":"../images/00704eQkgy1frr4z08j6oj31p20w2n6n.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Kubernetes 云原生的操作系统","attributes":{},"skip":false,"key":"2.9.1"},{"backlink":"cloud-native/the-future-of-cloud-native.html#fig2.9.2","level":"2.9","list_caption":"Figure: 操作系统层次","alt":"操作系统层次","nro":54,"url":"../images/00704eQkgy1frr52hl4eaj31qy15en74.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"操作系统层次","attributes":{},"skip":false,"key":"2.9.2"},{"backlink":"cloud-native/the-future-of-cloud-native.html#fig2.9.3","level":"2.9","list_caption":"Figure: 云原生景观图","alt":"云原生景观图","nro":55,"url":"../images/00704eQkgy1frr53j3aiuj32fs1dc7wi.jpg","index":3,"caption_template":"图片 - _CAPTION_","label":"云原生景观图","attributes":{},"skip":false,"key":"2.9.3"},{"backlink":"cloud-native/the-future-of-cloud-native.html#fig2.9.4","level":"2.9","list_caption":"Figure: KubeVirt架构图","alt":"KubeVirt架构图","nro":56,"url":"../images/00704eQkgy1frr54de5oyj31qw14qn2x.jpg","index":4,"caption_template":"图片 - _CAPTION_","label":"KubeVirt架构图","attributes":{},"skip":false,"key":"2.9.4"},{"backlink":"cloud-native/the-future-of-cloud-native.html#fig2.9.5","level":"2.9","list_caption":"Figure: Kubernetes中的资源隔离","alt":"Kubernetes中的资源隔离","nro":57,"url":"../images/00704eQkgy1frr54ztql2j329q0zwwlf.jpg","index":5,"caption_template":"图片 - _CAPTION_","label":"Kubernetes中的资源隔离","attributes":{},"skip":false,"key":"2.9.5"},{"backlink":"cloud-native/the-future-of-cloud-native.html#fig2.9.6","level":"2.9","list_caption":"Figure: OpenEBS 控制平面架构","alt":"OpenEBS 控制平面架构","nro":58,"url":"../images/00704eQkgy1frr56m7z2sj31y010y17y.jpg","index":6,"caption_template":"图片 - _CAPTION_","label":"OpenEBS 控制平面架构","attributes":{},"skip":false,"key":"2.9.6"},{"backlink":"cloud-native/the-future-of-cloud-native.html#fig2.9.7","level":"2.9","list_caption":"Figure: OpenEBS 的存储卷管理","alt":"OpenEBS 的存储卷管理","nro":59,"url":"../images/00704eQkgy1frr57nm2mnj31xk11qqej.jpg","index":7,"caption_template":"图片 - _CAPTION_","label":"OpenEBS 的存储卷管理","attributes":{},"skip":false,"key":"2.9.7"},{"backlink":"cloud-native/the-future-of-cloud-native.html#fig2.9.8","level":"2.9","list_caption":"Figure: Hadoop YARN 迁移到 Kubernetes的示例","alt":"Hadoop YARN 迁移到 Kubernetes的示例","nro":60,"url":"../images/00704eQkgy1frr58ebf2lj323o11219r.jpg","index":8,"caption_template":"图片 - _CAPTION_","label":"Hadoop YARN 迁移到 Kubernetes的示例","attributes":{},"skip":false,"key":"2.9.8"},{"backlink":"cloud-native/the-future-of-cloud-native.html#fig2.9.9","level":"2.9","list_caption":"Figure: Spark on Yarn with Kubernetes","alt":"Spark on Yarn with Kubernetes","nro":61,"url":"../images/00704eQkgy1frr59gzzwsj32gg16k4qp.jpg","index":9,"caption_template":"图片 - _CAPTION_","label":"Spark on Yarn with Kubernetes","attributes":{},"skip":false,"key":"2.9.9"},{"backlink":"cloud-native/the-future-of-cloud-native.html#fig2.9.10","level":"2.9","list_caption":"Figure: 云原生与12因素应用","alt":"云原生与12因素应用","nro":62,"url":"../images/00704eQkgy1frr5arzvetj31no12mdre.jpg","index":10,"caption_template":"图片 - _CAPTION_","label":"云原生与12因素应用","attributes":{},"skip":false,"key":"2.9.10"},{"backlink":"cloud-native/the-future-of-cloud-native.html#fig2.9.11","level":"2.9","list_caption":"Figure: 云原生编程语言","alt":"云原生编程语言","nro":63,"url":"../images/00704eQkgy1frr5c8bwmtj31ou152qc3.jpg","index":11,"caption_template":"图片 - _CAPTION_","label":"云原生编程语言","attributes":{},"skip":false,"key":"2.9.11"},{"backlink":"cloud-native/the-future-of-cloud-native.html#fig2.9.12","level":"2.9","list_caption":"Figure: Gitkube","alt":"Gitkube","nro":64,"url":"../images/00704eQkgy1frr5bulhuhj329m10iwua.jpg","index":12,"caption_template":"图片 - _CAPTION_","label":"Gitkube","attributes":{},"skip":false,"key":"2.9.12"},{"backlink":"cloud-native/the-future-of-cloud-native.html#fig2.9.13","level":"2.9","list_caption":"Figure: Kuberentes中的流量管理","alt":"Kuberentes中的流量管理","nro":65,"url":"../images/00704eQkgy1frr5dsurx6j320i140tpf.jpg","index":13,"caption_template":"图片 - _CAPTION_","label":"Kuberentes中的流量管理","attributes":{},"skip":false,"key":"2.9.13"},{"backlink":"cloud-native/the-future-of-cloud-native.html#fig2.9.14","level":"2.9","list_caption":"Figure: Istio Service Mesh架构图","alt":"Istio Service Mesh架构图","nro":66,"url":"../images/00704eQkgy1frr5exqm7kj320u18mh2t.jpg","index":14,"caption_template":"图片 - _CAPTION_","label":"Istio Service Mesh架构图","attributes":{},"skip":false,"key":"2.9.14"},{"backlink":"cloud-native/the-future-of-cloud-native.html#fig2.9.15","level":"2.9","list_caption":"Figure: Service Mesh架构","alt":"Service Mesh架构","nro":67,"url":"../images/00704eQkgy1frr5fxzoltj32f81akqr2.jpg","index":15,"caption_template":"图片 - _CAPTION_","label":"Service Mesh架构","attributes":{},"skip":false,"key":"2.9.15"},{"backlink":"cloud-native/the-future-of-cloud-native.html#fig2.9.16","level":"2.9","list_caption":"Figure: Envoy proxy架构图","alt":"Envoy proxy架构图","nro":68,"url":"../images/envoy-arch.png","index":16,"caption_template":"图片 - _CAPTION_","label":"Envoy proxy架构图","attributes":{},"skip":false,"key":"2.9.16"},{"backlink":"cloud-native/define-cloud-native-app.html#fig2.10.1","level":"2.10","list_caption":"Figure: 云原生应用模型","alt":"云原生应用模型","nro":69,"url":"../images/cloud-native-app-model.png","index":1,"caption_template":"图片 - _CAPTION_","label":"云原生应用模型","attributes":{},"skip":false,"key":"2.10.1"},{"backlink":"cloud-native/define-cloud-native-app.html#fig2.10.2","level":"2.10","list_caption":"Figure: 云原生应用模型中的目标角色","alt":"云原生应用模型中的目标角色","nro":70,"url":"../images/roles.png","index":2,"caption_template":"图片 - _CAPTION_","label":"云原生应用模型中的目标角色","attributes":{},"skip":false,"key":"2.10.2"},{"backlink":"concepts/index.html#fig3.1.1","level":"3.1","list_caption":"Figure: Borg架构","alt":"Borg架构","nro":71,"url":"../images/borg.png","index":1,"caption_template":"图片 - _CAPTION_","label":"Borg架构","attributes":{},"skip":false,"key":"3.1.1"},{"backlink":"concepts/index.html#fig3.1.2","level":"3.1","list_caption":"Figure: Kubernetes架构","alt":"Kubernetes架构","nro":72,"url":"../images/architecture.png","index":2,"caption_template":"图片 - _CAPTION_","label":"Kubernetes架构","attributes":{},"skip":false,"key":"3.1.2"},{"backlink":"concepts/index.html#fig3.1.3","level":"3.1","list_caption":"Figure: Kuberentes架构(图片来自于网络)","alt":"Kuberentes架构(图片来自于网络)","nro":73,"url":"../images/kubernetes-high-level-component-archtecture.jpg","index":3,"caption_template":"图片 - _CAPTION_","label":"Kuberentes架构(图片来自于网络)","attributes":{},"skip":false,"key":"3.1.3"},{"backlink":"concepts/index.html#fig3.1.4","level":"3.1","list_caption":"Figure: kubernetes整体架构示意图","alt":"kubernetes整体架构示意图","nro":74,"url":"../images/kubernetes-whole-arch.png","index":4,"caption_template":"图片 - _CAPTION_","label":"kubernetes整体架构示意图","attributes":{},"skip":false,"key":"3.1.4"},{"backlink":"concepts/index.html#fig3.1.5","level":"3.1","list_caption":"Figure: Kubernetes master架构示意图","alt":"Kubernetes master架构示意图","nro":75,"url":"../images/kubernetes-master-arch.png","index":5,"caption_template":"图片 - _CAPTION_","label":"Kubernetes master架构示意图","attributes":{},"skip":false,"key":"3.1.5"},{"backlink":"concepts/index.html#fig3.1.6","level":"3.1","list_caption":"Figure: kubernetes node架构示意图","alt":"kubernetes node架构示意图","nro":76,"url":"../images/kubernetes-node-arch.png","index":6,"caption_template":"图片 - _CAPTION_","label":"kubernetes node架构示意图","attributes":{},"skip":false,"key":"3.1.6"},{"backlink":"concepts/index.html#fig3.1.7","level":"3.1","list_caption":"Figure: Kubernetes分层架构示意图","alt":"Kubernetes分层架构示意图","nro":77,"url":"../images/kubernetes-layers-arch.png","index":7,"caption_template":"图片 - _CAPTION_","label":"Kubernetes分层架构示意图","attributes":{},"skip":false,"key":"3.1.7"},{"backlink":"concepts/concepts.html#fig3.1.1.1","level":"3.1.1","list_caption":"Figure: Kubernetes 分层架构示意图","alt":"Kubernetes 分层架构示意图","nro":78,"url":"../images/006tNc79ly1fzniqvmi51j31gq0s0q5u.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Kubernetes 分层架构示意图","attributes":{},"skip":false,"key":"3.1.1.1"},{"backlink":"concepts/open-interfaces.html#fig3.1.3.1","level":"3.1.3","list_caption":"Figure: 开放接口","alt":"开放接口","nro":79,"url":"../images/open-interfaces.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"开放接口","attributes":{},"skip":false,"key":"3.1.3.1"},{"backlink":"concepts/cri.html#fig3.1.3.1.1","level":"3.1.3.1","list_caption":"Figure: CRI架构-图片来自kubernetes blog","alt":"CRI架构-图片来自kubernetes blog","nro":80,"url":"../images/cri-architecture.png","index":1,"caption_template":"图片 - _CAPTION_","label":"CRI架构-图片来自kubernetes blog","attributes":{},"skip":false,"key":"3.1.3.1.1"},{"backlink":"concepts/flannel.html#fig3.2.1.1","level":"3.2.1","list_caption":"Figure: flannel网络架构(图片来自openshift)","alt":"flannel网络架构(图片来自openshift)","nro":81,"url":"../images/flannel-networking.png","index":1,"caption_template":"图片 - _CAPTION_","label":"flannel网络架构(图片来自openshift)","attributes":{},"skip":false,"key":"3.2.1.1"},{"backlink":"concepts/calico.html#fig3.2.2.1","level":"3.2.2","list_caption":"Figure: Calico","alt":"Calico","nro":82,"url":"../images/006tNc79gy1fz65bt7ieej30c90bsgn2.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Calico","attributes":{},"skip":false,"key":"3.2.2.1"},{"backlink":"concepts/calico.html#fig3.2.2.2","level":"3.2.2","list_caption":"Figure: CRI架构-图片来自https://www.jianshu.com/p/f0177b84de66","alt":"CRI架构-图片来自https://www.jianshu.com/p/f0177b84de66","nro":83,"url":"../images/calico.png","index":2,"caption_template":"图片 - _CAPTION_","label":"CRI架构-图片来自https://www.jianshu.com/p/f0177b84de66","attributes":{},"skip":false,"key":"3.2.2.2"},{"backlink":"concepts/cilium.html#fig3.2.3.1","level":"3.2.3","list_caption":"Figure: Cilium","alt":"Cilium","nro":84,"url":"../images/006tNbRwly1fwqi98i51ij30sc0j80zn.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Cilium","attributes":{},"skip":false,"key":"3.2.3.1"},{"backlink":"concepts/cilium-concepts.html#fig3.2.3.1.1","level":"3.2.3.1","list_caption":"Figure: Cilium 组件(来自 Cilium 官网)","alt":"Cilium 组件(来自 Cilium 官网)","nro":85,"url":"../images/006tNbRwly1fwztvhg0gmj318z143tdv.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Cilium 组件(来自 Cilium 官网)","attributes":{},"skip":false,"key":"3.2.3.1.1"},{"backlink":"concepts/cilium-concepts.html#fig3.2.3.1.2","level":"3.2.3.1","list_caption":"Figure: Cilium 网络配置策略","alt":"Cilium 网络配置策略","nro":86,"url":"../images/006tNbRwly1fwzreaalj6j30dz0dy3z3.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"Cilium 网络配置策略","attributes":{},"skip":false,"key":"3.2.3.1.2"},{"backlink":"concepts/pod-overview.html#fig3.4.1.1","level":"3.4.1","list_caption":"Figure: pod diagram","alt":"pod diagram","nro":87,"url":"../images/pod-overview.png","index":1,"caption_template":"图片 - _CAPTION_","label":"pod diagram","attributes":{},"skip":false,"key":"3.4.1.1"},{"backlink":"concepts/pod.html#fig3.4.2.1","level":"3.4.2","list_caption":"Figure: Pod示意图","alt":"Pod示意图","nro":88,"url":"../images/pod-overview.png","index":1,"caption_template":"图片 - _CAPTION_","label":"Pod示意图","attributes":{},"skip":false,"key":"3.4.2.1"},{"backlink":"concepts/pod.html#fig3.4.2.2","level":"3.4.2","list_caption":"Figure: Pod Cheatsheet","alt":"Pod Cheatsheet","nro":89,"url":"../images/kubernetes-pod-cheatsheet.png","index":2,"caption_template":"图片 - _CAPTION_","label":"Pod Cheatsheet","attributes":{},"skip":false,"key":"3.4.2.2"},{"backlink":"concepts/pause-container.html#fig3.4.4.1","level":"3.4.4","list_caption":"Figure: Pause容器","alt":"Pause容器","nro":90,"url":"../images/pause-container.png","index":1,"caption_template":"图片 - _CAPTION_","label":"Pause容器","attributes":{},"skip":false,"key":"3.4.4.1"},{"backlink":"concepts/pod-lifecycle.html#fig3.4.6.1","level":"3.4.6","list_caption":"Figure: Pod的生命周期示意图(图片来自网络)","alt":"Pod的生命周期示意图(图片来自网络)","nro":91,"url":"../images/kubernetes-pod-life-cycle.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Pod的生命周期示意图(图片来自网络)","attributes":{},"skip":false,"key":"3.4.6.1"},{"backlink":"concepts/label.html#fig3.5.3.1","level":"3.5.3","list_caption":"Figure: label示意图","alt":"label示意图","nro":92,"url":"../images/labels.png","index":1,"caption_template":"图片 - _CAPTION_","label":"label示意图","attributes":{},"skip":false,"key":"3.5.3.1"},{"backlink":"concepts/horizontal-pod-autoscaling.html#fig3.6.7.1","level":"3.6.7","list_caption":"Figure: horizontal-pod-autoscaler","alt":"horizontal-pod-autoscaler","nro":93,"url":"../images/horizontal-pod-autoscaler.png","index":1,"caption_template":"图片 - _CAPTION_","label":"horizontal-pod-autoscaler","attributes":{},"skip":false,"key":"3.6.7.1"},{"backlink":"concepts/service.html#fig3.7.1.1","level":"3.7.1","list_caption":"Figure: userspace代理模式下Service概览图","alt":"userspace代理模式下Service概览图","nro":94,"url":"../images/services-userspace-overview.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"userspace代理模式下Service概览图","attributes":{},"skip":false,"key":"3.7.1.1"},{"backlink":"concepts/service.html#fig3.7.1.2","level":"3.7.1","list_caption":"Figure: iptables代理模式下Service概览图","alt":"iptables代理模式下Service概览图","nro":95,"url":"../images/services-iptables-overview.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"iptables代理模式下Service概览图","attributes":{},"skip":false,"key":"3.7.1.2"},{"backlink":"concepts/service.html#fig3.7.1.3","level":"3.7.1","list_caption":"Figure: ipvs代理模式下Service概览图","alt":"ipvs代理模式下Service概览图","nro":96,"url":"../images/service-ipvs-overview.png","index":3,"caption_template":"图片 - _CAPTION_","label":"ipvs代理模式下Service概览图","attributes":{},"skip":false,"key":"3.7.1.3"},{"backlink":"concepts/service-catalog.html#fig3.10.5.1","level":"3.10.5","list_caption":"Figure: Service Catalog Architecture","alt":"Service Catalog Architecture","nro":97,"url":"../images/service-catalog-architecture.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Service Catalog Architecture","attributes":{},"skip":false,"key":"3.10.5.1"},{"backlink":"concepts/service-catalog.html#fig3.10.5.2","level":"3.10.5","list_caption":"Figure: List Services","alt":"List Services","nro":98,"url":"../images/service-catalog-list.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"List Services","attributes":{},"skip":false,"key":"3.10.5.2"},{"backlink":"concepts/service-catalog.html#fig3.10.5.3","level":"3.10.5","list_caption":"Figure: Provision a Service","alt":"Provision a Service","nro":99,"url":"../images/service-catalog-provision.jpg","index":3,"caption_template":"图片 - _CAPTION_","label":"Provision a Service","attributes":{},"skip":false,"key":"3.10.5.3"},{"backlink":"concepts/service-catalog.html#fig3.10.5.4","level":"3.10.5","list_caption":"Figure: Bind to a managed service","alt":"Bind to a managed service","nro":100,"url":"../images/service-catalog-bind.jpg","index":4,"caption_template":"图片 - _CAPTION_","label":"Bind to a managed service","attributes":{},"skip":false,"key":"3.10.5.4"},{"backlink":"concepts/service-catalog.html#fig3.10.5.5","level":"3.10.5","list_caption":"Figure: Map connection credentials","alt":"Map connection credentials","nro":101,"url":"../images/service-catalog-map.jpg","index":5,"caption_template":"图片 - _CAPTION_","label":"Map connection credentials","attributes":{},"skip":false,"key":"3.10.5.5"},{"backlink":"guide/using-kubectl.html#fig4.3.2.1","level":"4.3.2","list_caption":"Figure: kubectl cheatsheet","alt":"kubectl cheatsheet","nro":102,"url":"../images/kubernetes-kubectl-cheatsheet.png","index":1,"caption_template":"图片 - _CAPTION_","label":"kubectl cheatsheet","attributes":{},"skip":false,"key":"4.3.2.1"},{"backlink":"guide/using-kubectl.html#fig4.3.2.2","level":"4.3.2","list_caption":"Figure: 增加kubeclt命令的工具(图片来自网络)","alt":"增加kubeclt命令的工具(图片来自网络)","nro":103,"url":"../images/tools-to-supercharge-kubectl.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"增加kubeclt命令的工具(图片来自网络)","attributes":{},"skip":false,"key":"4.3.2.2"},{"backlink":"guide/using-kubectl.html#fig4.3.2.3","level":"4.3.2","list_caption":"Figure: 增强的kubectl命令","alt":"增强的kubectl命令","nro":104,"url":"../images/supercharged-kubectl.jpg","index":3,"caption_template":"图片 - _CAPTION_","label":"增强的kubectl命令","attributes":{},"skip":false,"key":"4.3.2.3"},{"backlink":"guide/using-kubectl.html#fig4.3.2.4","level":"4.3.2","list_caption":"Figure: kube-shell页面","alt":"kube-shell页面","nro":105,"url":"../images/kube-shell.jpg","index":4,"caption_template":"图片 - _CAPTION_","label":"kube-shell页面","attributes":{},"skip":false,"key":"4.3.2.4"},{"backlink":"guide/ip-masq-agent.html#fig4.4.5.1","level":"4.4.5","list_caption":"Figure: IP伪装代理示意图","alt":"IP伪装代理示意图","nro":106,"url":"../images/ip-masq.png","index":1,"caption_template":"图片 - _CAPTION_","label":"IP伪装代理示意图","attributes":{},"skip":false,"key":"4.4.5.1"},{"backlink":"guide/auth-with-kubeconfig-or-token.html#fig4.4.6.1","level":"4.4.6","list_caption":"Figure: kubeconfig文件","alt":"kubeconfig文件","nro":107,"url":"../images/brand-kubeconfig-yaml.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"kubeconfig文件","attributes":{},"skip":false,"key":"4.4.6.1"},{"backlink":"guide/authentication.html#fig4.4.7.1","level":"4.4.7","list_caption":"Figure: Kubernetes OpenID Connect Flow","alt":"Kubernetes OpenID Connect Flow","nro":108,"url":"../images/kubernetes-oidc-login.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Kubernetes OpenID Connect Flow","attributes":{},"skip":false,"key":"4.4.7.1"},{"backlink":"guide/cabin-mobile-dashboard-for-kubernetes.html#fig4.5.6.1","level":"4.5.6","list_caption":"Figure: App Store","alt":"App Store","nro":109,"url":"../images/cabin-kubernetes-mobile-dashboard-1.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"App Store","attributes":{},"skip":false,"key":"4.5.6.1"},{"backlink":"guide/cabin-mobile-dashboard-for-kubernetes.html#fig4.5.6.2","level":"4.5.6","list_caption":"Figure: 在手机上操作Kubernetes集群","alt":"在手机上操作Kubernetes集群","nro":110,"url":"../images/cabin-kubernetes-mobile-dashboard-4.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"在手机上操作Kubernetes集群","attributes":{},"skip":false,"key":"4.5.6.2"},{"backlink":"guide/kubernetes-desktop-client.html#fig4.5.7.1","level":"4.5.7","list_caption":"Figure: Kubernetic客户端","alt":"Kubernetic客户端","nro":111,"url":"../images/kubernetic-desktop-ui.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Kubernetic客户端","attributes":{},"skip":false,"key":"4.5.7.1"},{"backlink":"guide/kubernator-kubernetes-ui.html#fig4.5.8.1","level":"4.5.8","list_caption":"Figure: Kubernator catalog页面","alt":"Kubernator catalog页面","nro":112,"url":"../images/kubernator-catalog.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Kubernator catalog页面","attributes":{},"skip":false,"key":"4.5.8.1"},{"backlink":"guide/kubernator-kubernetes-ui.html#fig4.5.8.2","level":"4.5.8","list_caption":"Figure: Kubernator rbac页面","alt":"Kubernator rbac页面","nro":113,"url":"../images/kubernator-rbac.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"Kubernator rbac页面","attributes":{},"skip":false,"key":"4.5.8.2"},{"backlink":"guide/deploy-applications-in-kubernetes.html#fig4.6.1.1","level":"4.6.1","list_caption":"Figure: 流程图","alt":"流程图","nro":114,"url":"../images/how-to-use-kubernetes-with-istio.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"流程图","attributes":{},"skip":false,"key":"4.6.1.1"},{"backlink":"guide/deploy-applications-in-kubernetes.html#fig4.6.1.2","level":"4.6.1","list_caption":"Figure: API","alt":"API","nro":115,"url":"../images/k8s-app-monitor-test-api-doc.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"API","attributes":{},"skip":false,"key":"4.6.1.2"},{"backlink":"guide/deploy-applications-in-kubernetes.html#fig4.6.1.3","level":"4.6.1","list_caption":"Figure: wercker构建页面","alt":"wercker构建页面","nro":116,"url":"../images/k8s-app-monitor-agent-wercker.jpg","index":3,"caption_template":"图片 - _CAPTION_","label":"wercker构建页面","attributes":{},"skip":false,"key":"4.6.1.3"},{"backlink":"guide/deploy-applications-in-kubernetes.html#fig4.6.1.4","level":"4.6.1","list_caption":"Figure: 图表","alt":"图表","nro":117,"url":"../images/k8s-app-monitor-agent.jpg","index":4,"caption_template":"图片 - _CAPTION_","label":"图表","attributes":{},"skip":false,"key":"4.6.1.4"},{"backlink":"guide/deploy-applications-in-kubernetes.html#fig4.6.1.5","level":"4.6.1","list_caption":"Figure: Grafana页面","alt":"Grafana页面","nro":118,"url":"../images/k8s-app-monitor-istio-grafana.png","index":5,"caption_template":"图片 - _CAPTION_","label":"Grafana页面","attributes":{},"skip":false,"key":"4.6.1.5"},{"backlink":"guide/deploy-applications-in-kubernetes.html#fig4.6.1.6","level":"4.6.1","list_caption":"Figure: servicegraph页面","alt":"servicegraph页面","nro":119,"url":"../images/k8s-app-monitor-istio-servicegraph-dotviz.png","index":6,"caption_template":"图片 - _CAPTION_","label":"servicegraph页面","attributes":{},"skip":false,"key":"4.6.1.6"},{"backlink":"guide/deploy-applications-in-kubernetes.html#fig4.6.1.7","level":"4.6.1","list_caption":"Figure: Zipkin页面","alt":"Zipkin页面","nro":120,"url":"../images/k8s-app-monitor-istio-zipkin.png","index":7,"caption_template":"图片 - _CAPTION_","label":"Zipkin页面","attributes":{},"skip":false,"key":"4.6.1.7"},{"backlink":"guide/migrating-hadoop-yarn-to-kubernetes.html#fig4.6.2.1","level":"4.6.2","list_caption":"Figure: 将单体应用迁移到云原生(图片来自DevOpsDay Toronto)","alt":"将单体应用迁移到云原生(图片来自DevOpsDay Toronto)","nro":121,"url":"../images/migrating-monolith-to-kubernetes.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"将单体应用迁移到云原生(图片来自DevOpsDay Toronto)","attributes":{},"skip":false,"key":"4.6.2.1"},{"backlink":"guide/migrating-hadoop-yarn-to-kubernetes.html#fig4.6.2.2","level":"4.6.2","list_caption":"Figure: spark on yarn with kubernetes","alt":"spark on yarn with kubernetes","nro":122,"url":"../images/spark-on-yarn-with-kubernetes.png","index":2,"caption_template":"图片 - _CAPTION_","label":"spark on yarn with kubernetes","attributes":{},"skip":false,"key":"4.6.2.2"},{"backlink":"guide/migrating-hadoop-yarn-to-kubernetes.html#fig4.6.2.3","level":"4.6.2","list_caption":"Figure: Terms","alt":"Terms","nro":123,"url":"../images/terms-in-kubernetes-app-deployment.png","index":3,"caption_template":"图片 - _CAPTION_","label":"Terms","attributes":{},"skip":false,"key":"4.6.2.3"},{"backlink":"guide/migrating-hadoop-yarn-to-kubernetes.html#fig4.6.2.4","level":"4.6.2","list_caption":"Figure: 分解步骤解析","alt":"分解步骤解析","nro":124,"url":"../images/migrating-hadoop-yarn-to-kubernetes.png","index":4,"caption_template":"图片 - _CAPTION_","label":"分解步骤解析","attributes":{},"skip":false,"key":"4.6.2.4"},{"backlink":"practice/node-installation.html#fig5.2.7.1","level":"5.2.7","list_caption":"Figure: nginx欢迎页面","alt":"nginx欢迎页面","nro":125,"url":"../images/kubernetes-installation-test-nginx.png","index":1,"caption_template":"图片 - _CAPTION_","label":"nginx欢迎页面","attributes":{},"skip":false,"key":"5.2.7.1"},{"backlink":"practice/dashboard-addon-installation.html#fig5.2.9.1","level":"5.2.9","list_caption":"Figure: kubernetes dashboard","alt":"kubernetes dashboard","nro":126,"url":"../images/kubernetes-dashboard-raw.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"kubernetes dashboard","attributes":{},"skip":false,"key":"5.2.9.1"},{"backlink":"practice/dashboard-addon-installation.html#fig5.2.9.2","level":"5.2.9","list_caption":"Figure: V1.6.3版本的dashboard界面","alt":"V1.6.3版本的dashboard界面","nro":127,"url":"../images/dashboard-v163.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"V1.6.3版本的dashboard界面","attributes":{},"skip":false,"key":"5.2.9.2"},{"backlink":"practice/dashboard-addon-installation.html#fig5.2.9.3","level":"5.2.9","list_caption":"Figure: pod无法正常启动","alt":"pod无法正常启动","nro":128,"url":"../images/dashboard-addon-installation001.png","index":3,"caption_template":"图片 - _CAPTION_","label":"pod无法正常启动","attributes":{},"skip":false,"key":"5.2.9.3"},{"backlink":"practice/heapster-addon-installation.html#fig5.2.10.1","level":"5.2.10","list_caption":"Figure: dashboard-heapster","alt":"dashboard-heapster","nro":129,"url":"../images/kubernetes-dashboard-with-heapster.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"dashboard-heapster","attributes":{},"skip":false,"key":"5.2.10.1"},{"backlink":"practice/heapster-addon-installation.html#fig5.2.10.2","level":"5.2.10","list_caption":"Figure: grafana","alt":"grafana","nro":130,"url":"../images/kubernetes-heapster-grafana.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"grafana","attributes":{},"skip":false,"key":"5.2.10.2"},{"backlink":"practice/heapster-addon-installation.html#fig5.2.10.3","level":"5.2.10","list_caption":"Figure: kubernetes-influxdb-heapster","alt":"kubernetes-influxdb-heapster","nro":131,"url":"../images/kubernetes-influxdb-heapster.jpg","index":3,"caption_template":"图片 - _CAPTION_","label":"kubernetes-influxdb-heapster","attributes":{},"skip":false,"key":"5.2.10.3"},{"backlink":"practice/heapster-addon-installation.html#fig5.2.10.4","level":"5.2.10","list_caption":"Figure: 修改grafana模板","alt":"修改grafana模板","nro":132,"url":"../images/grafana-dashboard-setting.jpg","index":4,"caption_template":"图片 - _CAPTION_","label":"修改grafana模板","attributes":{},"skip":false,"key":"5.2.10.4"},{"backlink":"practice/efk-addon-installation.html#fig5.2.11.1","level":"5.2.11","list_caption":"Figure: es-setting","alt":"es-setting","nro":133,"url":"../images/es-setting.png","index":1,"caption_template":"图片 - _CAPTION_","label":"es-setting","attributes":{},"skip":false,"key":"5.2.11.1"},{"backlink":"practice/efk-addon-installation.html#fig5.2.11.2","level":"5.2.11","list_caption":"Figure: es-home","alt":"es-home","nro":134,"url":"../images/kubernetes-efk-kibana.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"es-home","attributes":{},"skip":false,"key":"5.2.11.2"},{"backlink":"practice/traefik-ingress-installation.html#fig5.4.1.1","level":"5.4.1","list_caption":"Figure: kubernetes-dashboard","alt":"kubernetes-dashboard","nro":135,"url":"../images/traefik-dashboard.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"kubernetes-dashboard","attributes":{},"skip":false,"key":"5.4.1.1"},{"backlink":"practice/traefik-ingress-installation.html#fig5.4.1.2","level":"5.4.1","list_caption":"Figure: traefik-nginx","alt":"traefik-nginx","nro":136,"url":"../images/traefik-nginx.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"traefik-nginx","attributes":{},"skip":false,"key":"5.4.1.2"},{"backlink":"practice/traefik-ingress-installation.html#fig5.4.1.3","level":"5.4.1","list_caption":"Figure: traefik-guestbook","alt":"traefik-guestbook","nro":137,"url":"../images/traefik-guestbook.jpg","index":3,"caption_template":"图片 - _CAPTION_","label":"traefik-guestbook","attributes":{},"skip":false,"key":"5.4.1.3"},{"backlink":"practice/distributed-load-test.html#fig5.4.2.1","level":"5.4.2","list_caption":"Figure: 使用dashboard来扩容","alt":"使用dashboard来扩容","nro":138,"url":"../images/dashbaord-scale.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"使用dashboard来扩容","attributes":{},"skip":false,"key":"5.4.2.1"},{"backlink":"practice/distributed-load-test.html#fig5.4.2.2","level":"5.4.2","list_caption":"Figure: Traefik的UI","alt":"Traefik的UI","nro":139,"url":"../images/traefik-dashboard-locust.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"Traefik的UI","attributes":{},"skip":false,"key":"5.4.2.2"},{"backlink":"practice/distributed-load-test.html#fig5.4.2.3","level":"5.4.2","list_caption":"Figure: Locust启动界面","alt":"Locust启动界面","nro":140,"url":"../images/locust-start-swarming.jpg","index":3,"caption_template":"图片 - _CAPTION_","label":"Locust启动界面","attributes":{},"skip":false,"key":"5.4.2.3"},{"backlink":"practice/distributed-load-test.html#fig5.4.2.4","level":"5.4.2","list_caption":"Figure: Dashboard查看页面","alt":"Dashboard查看页面","nro":141,"url":"../images/sample-webapp-rc.jpg","index":4,"caption_template":"图片 - _CAPTION_","label":"Dashboard查看页面","attributes":{},"skip":false,"key":"5.4.2.4"},{"backlink":"practice/distributed-load-test.html#fig5.4.2.5","level":"5.4.2","list_caption":"Figure: Locust测试结果页面","alt":"Locust测试结果页面","nro":142,"url":"../images/locust-dashboard.jpg","index":5,"caption_template":"图片 - _CAPTION_","label":"Locust测试结果页面","attributes":{},"skip":false,"key":"5.4.2.5"},{"backlink":"practice/network-and-cluster-perfermance-test.html#fig5.4.3.1","level":"5.4.3","list_caption":"Figure: kubernetes-dashboard","alt":"kubernetes-dashboard","nro":143,"url":"../images/kubenetes-e2e-test.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"kubernetes-dashboard","attributes":{},"skip":false,"key":"5.4.3.1"},{"backlink":"practice/network-and-cluster-perfermance-test.html#fig5.4.3.2","level":"5.4.3","list_caption":"Figure: locust测试页面","alt":"locust测试页面","nro":144,"url":"../images/kubernetes-locust-test.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"locust测试页面","attributes":{},"skip":false,"key":"5.4.3.2"},{"backlink":"practice/edge-node-configuration.html#fig5.4.4.1","level":"5.4.4","list_caption":"Figure: 边缘节点架构","alt":"边缘节点架构","nro":145,"url":"../images/kubernetes-edge-node-architecture.png","index":1,"caption_template":"图片 - _CAPTION_","label":"边缘节点架构","attributes":{},"skip":false,"key":"5.4.4.1"},{"backlink":"practice/edge-node-configuration.html#fig5.4.4.2","level":"5.4.4","list_caption":"Figure: 使用域名来访问Kubernetes中的服务","alt":"使用域名来访问Kubernetes中的服务","nro":146,"url":"../images/accessing-kubernetes-services-with-dns-name.png","index":2,"caption_template":"图片 - _CAPTION_","label":"使用域名来访问Kubernetes中的服务","attributes":{},"skip":false,"key":"5.4.4.2"},{"backlink":"practice/configuring-dns.html#fig5.4.6.1.1","level":"5.4.6.1","list_caption":"Figure: DNS lookup flow","alt":"DNS lookup flow","nro":147,"url":"https://d33wubrfki0l68.cloudfront.net/340889cb80e81dcd19a16bc34697a7907e2b229a/24ad0/docs/tasks/administer-cluster/dns-custom-nameservers/dns.png","index":1,"caption_template":"图片 - _CAPTION_","label":"DNS lookup flow","attributes":{},"skip":false,"key":"5.4.6.1.1"},{"backlink":"practice/master-ha.html#fig5.5.1.1","level":"5.5.1","list_caption":"Figure: Master HA架构图","alt":"Master HA架构图","nro":148,"url":"../images/master-ha.JPG","index":1,"caption_template":"图片 - _CAPTION_","label":"Master HA架构图","attributes":{},"skip":false,"key":"5.5.1.1"},{"backlink":"practice/app-log-collection.html#fig5.5.3.1","level":"5.5.3","list_caption":"Figure: filebeat日志收集架构图","alt":"filebeat日志收集架构图","nro":149,"url":"../images/filebeat-log-collector.png","index":1,"caption_template":"图片 - _CAPTION_","label":"filebeat日志收集架构图","attributes":{},"skip":false,"key":"5.5.3.1"},{"backlink":"practice/app-log-collection.html#fig5.5.3.2","level":"5.5.3","list_caption":"Figure: Kibana页面","alt":"Kibana页面","nro":150,"url":"../images/filebeat-docker-test.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"Kibana页面","attributes":{},"skip":false,"key":"5.5.3.2"},{"backlink":"practice/app-log-collection.html#fig5.5.3.3","level":"5.5.3","list_caption":"Figure: filebeat收集的日志详细信息","alt":"filebeat收集的日志详细信息","nro":151,"url":"../images/kubernetes-filebeat-detail.png","index":3,"caption_template":"图片 - _CAPTION_","label":"filebeat收集的日志详细信息","attributes":{},"skip":false,"key":"5.5.3.3"},{"backlink":"practice/monitor.html#fig5.5.5.1","level":"5.5.5","list_caption":"Figure: Kubernetes集群中的监控","alt":"Kubernetes集群中的监控","nro":152,"url":"../images/monitoring-in-kubernetes.png","index":1,"caption_template":"图片 - _CAPTION_","label":"Kubernetes集群中的监控","attributes":{},"skip":false,"key":"5.5.5.1"},{"backlink":"practice/monitor.html#fig5.5.5.2","level":"5.5.5","list_caption":"Figure: kubernetes的容器命名规则示意图","alt":"kubernetes的容器命名规则示意图","nro":153,"url":"../images/kubernetes-container-naming-rule.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"kubernetes的容器命名规则示意图","attributes":{},"skip":false,"key":"5.5.5.2"},{"backlink":"practice/monitor.html#fig5.5.5.3","level":"5.5.5","list_caption":"Figure: Heapster架构图(改进版)","alt":"Heapster架构图(改进版)","nro":154,"url":"../images/kubernetes-heapster-monitoring.png","index":3,"caption_template":"图片 - _CAPTION_","label":"Heapster架构图(改进版)","attributes":{},"skip":false,"key":"5.5.5.3"},{"backlink":"practice/monitor.html#fig5.5.5.4","level":"5.5.5","list_caption":"Figure: 应用监控架构图","alt":"应用监控架构图","nro":155,"url":"../images/kubernetes-app-monitoring.png","index":4,"caption_template":"图片 - _CAPTION_","label":"应用监控架构图","attributes":{},"skip":false,"key":"5.5.5.4"},{"backlink":"practice/monitor.html#fig5.5.5.5","level":"5.5.5","list_caption":"Figure: 应用拓扑图","alt":"应用拓扑图","nro":156,"url":"../images/weave-scope-service-topology.jpg","index":5,"caption_template":"图片 - _CAPTION_","label":"应用拓扑图","attributes":{},"skip":false,"key":"5.5.5.5"},{"backlink":"practice/data-persistence-problem.html#fig5.5.6.1","level":"5.5.6","list_caption":"Figure: 日志持久化收集解决方案示意图","alt":"日志持久化收集解决方案示意图","nro":157,"url":"../images/log-persistence-logstash.png","index":1,"caption_template":"图片 - _CAPTION_","label":"日志持久化收集解决方案示意图","attributes":{},"skip":false,"key":"5.5.6.1"},{"backlink":"practice/storage-for-containers-using-glusterfs-with-openshift.html#fig5.6.1.3.1","level":"5.6.1.3","list_caption":"Figure: 创建存储","alt":"创建存储","nro":158,"url":"../images/create-gluster-storage.png","index":1,"caption_template":"图片 - _CAPTION_","label":"创建存储","attributes":{},"skip":false,"key":"5.6.1.3.1"},{"backlink":"practice/storage-for-containers-using-glusterfs-with-openshift.html#fig5.6.1.3.2","level":"5.6.1.3","list_caption":"Figure: Screen Shot 2017-03-24 at 11.09.34.png","alt":"Screen Shot 2017-03-24 at 11.09.34.png","nro":159,"url":"https://keithtenzer.files.wordpress.com/2017/03/screen-shot-2017-03-24-at-11-09-341.png?w=440","index":2,"caption_template":"图片 - _CAPTION_","label":"Screen Shot 2017-03-24 at 11.09.34.png","attributes":{},"skip":false,"key":"5.6.1.3.2"},{"backlink":"practice/openebs.html#fig5.6.4.1","level":"5.6.4","list_caption":"Figure: OpenEBS集群数据平面(图片来自https://github.com/openebs/openebs/blob/master/contribute/design/README.md)","alt":"OpenEBS集群数据平面(图片来自https://github.com/openebs/openebs/blob/master/contribute/design/README.md)","nro":160,"url":"../images/OpenEBS-Data-Plane.png","index":1,"caption_template":"图片 - _CAPTION_","label":"OpenEBS集群数据平面(图片来自https://github.com/openebs/openebs/blob/master/contribute/design/README.md)","attributes":{},"skip":false,"key":"5.6.4.1"},{"backlink":"practice/openebs.html#fig5.6.4.2","level":"5.6.4","list_caption":"Figure: OpenEBS集群的控制平面(图片来自https://github.com/openebs/openebs/blob/master/contribute/design/README.md)","alt":"OpenEBS集群的控制平面(图片来自https://github.com/openebs/openebs/blob/master/contribute/design/README.md)","nro":161,"url":"../images/OpenEBS-Control-Plane.png","index":2,"caption_template":"图片 - _CAPTION_","label":"OpenEBS集群的控制平面(图片来自https://github.com/openebs/openebs/blob/master/contribute/design/README.md)","attributes":{},"skip":false,"key":"5.6.4.2"},{"backlink":"practice/using-openebs-for-persistent-storage.html#fig5.6.4.1.1","level":"5.6.4.1","list_caption":"Figure: Kubernetes iSCSI架构","alt":"Kubernetes iSCSI架构","nro":162,"url":"../images/iscsi-on-kubernetes.png","index":1,"caption_template":"图片 - _CAPTION_","label":"Kubernetes iSCSI架构","attributes":{},"skip":false,"key":"5.6.4.1.1"},{"backlink":"practice/using-heapster-to-get-object-metrics.html#fig5.7.1.1.1","level":"5.7.1.1","list_caption":"Figure: Heapster架构图","alt":"Heapster架构图","nro":163,"url":"../images/heapster-architecture.png","index":1,"caption_template":"图片 - _CAPTION_","label":"Heapster架构图","attributes":{},"skip":false,"key":"5.7.1.1.1"},{"backlink":"practice/prometheus.html#fig5.7.2.1","level":"5.7.2","list_caption":"Figure: Prometheus 架构图","alt":"Prometheus 架构图","nro":164,"url":"../images/006tNbRwly1fwcgsn11fej311j0mjadw.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Prometheus 架构图","attributes":{},"skip":false,"key":"5.7.2.1"},{"backlink":"practice/using-prometheus-to-monitor-kuberentes-cluster.html#fig5.7.2.1.1","level":"5.7.2.1","list_caption":"Figure: Grafana页面","alt":"Grafana页面","nro":165,"url":"../images/kubernetes-prometheus-monitoring.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Grafana页面","attributes":{},"skip":false,"key":"5.7.2.1.1"},{"backlink":"practice/promql.html#fig5.7.2.2.1","level":"5.7.2.2","list_caption":"Figure: Prometheus 的查询页面","alt":"Prometheus 的查询页面","nro":166,"url":"../images/006tNbRwly1fwcl7v28rhj30xl0onadv.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Prometheus 的查询页面","attributes":{},"skip":false,"key":"5.7.2.2.1"},{"backlink":"practice/vistio-visualize-your-istio-mesh.html#fig5.7.3.1","level":"5.7.3","list_caption":"Figure: Vistio的集群级别可视化","alt":"Vistio的集群级别可视化","nro":167,"url":"../images/00704eQkgy1fshft5oxlwj318g0pe0wp.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Vistio的集群级别可视化","attributes":{},"skip":false,"key":"5.7.3.1"},{"backlink":"practice/vistio-visualize-your-istio-mesh.html#fig5.7.3.2","level":"5.7.3","list_caption":"Figure: Prometheus查询","alt":"Prometheus查询","nro":168,"url":"../images/00704eQkgy1fshg0vw25ij318g0jzqjq.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"Prometheus查询","attributes":{},"skip":false,"key":"5.7.3.2"},{"backlink":"practice/vistio-visualize-your-istio-mesh.html#fig5.7.3.3","level":"5.7.3","list_caption":"Figure: vistio-api的期望输出","alt":"vistio-api的期望输出","nro":169,"url":"../images/00704eQkgy1fshi61t04oj310q17c0y1.jpg","index":3,"caption_template":"图片 - _CAPTION_","label":"vistio-api的期望输出","attributes":{},"skip":false,"key":"5.7.3.3"},{"backlink":"practice/vistio-visualize-your-istio-mesh.html#fig5.7.3.4","level":"5.7.3","list_caption":"Figure: Vistio主页面","alt":"Vistio主页面","nro":170,"url":"../images/00704eQkgy1fshi98duzgj318g0l2406.jpg","index":4,"caption_template":"图片 - _CAPTION_","label":"Vistio主页面","attributes":{},"skip":false,"key":"5.7.3.4"},{"backlink":"practice/vistio-visualize-your-istio-mesh.html#fig5.7.3.5","level":"5.7.3","list_caption":"Figure: istio mesh的网络流量","alt":"istio mesh的网络流量","nro":171,"url":"../images/00704eQkgy1fshibdwcj3j318g0p8th1.jpg","index":5,"caption_template":"图片 - _CAPTION_","label":"istio mesh的网络流量","attributes":{},"skip":false,"key":"5.7.3.5"},{"backlink":"practice/vistio-visualize-your-istio-mesh.html#fig5.7.3.6","level":"5.7.3","list_caption":"Figure: 查明网络问题","alt":"查明网络问题","nro":172,"url":"../images/00704eQkgy1fshicc7or1j318g0p8ahr.jpg","index":6,"caption_template":"图片 - _CAPTION_","label":"查明网络问题","attributes":{},"skip":false,"key":"5.7.3.6"},{"backlink":"practice/vistio-visualize-your-istio-mesh.html#fig5.7.3.7","level":"5.7.3","list_caption":"Figure: vistio api的不正确输出","alt":"vistio api的不正确输出","nro":173,"url":"../images/00704eQkgy1fshie7wxkyj30ks0f4myd.jpg","index":7,"caption_template":"图片 - _CAPTION_","label":"vistio api的不正确输出","attributes":{},"skip":false,"key":"5.7.3.7"},{"backlink":"practice/opentracing.html#fig5.8.1.1","level":"5.8.1","list_caption":"Figure: Jaeger UI","alt":"Jaeger UI","nro":174,"url":"../images/006tNbRwly1fwjg48fh7xj31kw0wedrg.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Jaeger UI","attributes":{},"skip":false,"key":"5.8.1.1"},{"backlink":"practice/opentracing.html#fig5.8.1.2","level":"5.8.1","list_caption":"Figure: Chrome Inspector","alt":"Chrome Inspector","nro":175,"url":"../images/006tNbRwly1fwjkfbvfluj30y70hf0y9.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"Chrome Inspector","attributes":{},"skip":false,"key":"5.8.1.2"},{"backlink":"practice/helm.html#fig5.9.1.1","level":"5.9.1","list_caption":"Figure: Helm 架构图(来自 IBM Developer Blog)","alt":"Helm 架构图(来自 IBM Developer Blog)","nro":176,"url":"../images/helm-chart.png","index":1,"caption_template":"图片 - _CAPTION_","label":"Helm 架构图(来自 IBM Developer Blog)","attributes":{},"skip":false,"key":"5.9.1.1"},{"backlink":"practice/create-private-charts-repo.html#fig5.9.2.1","level":"5.9.2","list_caption":"Figure: Helm monocular界面","alt":"Helm monocular界面","nro":177,"url":"../images/helm-monocular-jimmysong.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Helm monocular界面","attributes":{},"skip":false,"key":"5.9.2.1"},{"backlink":"practice/ci-cd.html#fig5.10.1","level":"5.10","list_caption":"Figure: CI/CD with Kubernetes","alt":"CI/CD with Kubernetes","nro":178,"url":"../images/00704eQkgy1fsaxszh01vj30da0j2jvn.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"CI/CD with Kubernetes","attributes":{},"skip":false,"key":"5.10.1"},{"backlink":"practice/ci-cd.html#fig5.10.2","level":"5.10","list_caption":"Figure: Kubernetes改变了应用的基础架构","alt":"Kubernetes改变了应用的基础架构","nro":179,"url":"../images/00704eQkgy1fsayashxz3j31c00w6aed.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"Kubernetes改变了应用的基础架构","attributes":{},"skip":false,"key":"5.10.2"},{"backlink":"practice/ci-cd.html#fig5.10.3","level":"5.10","list_caption":"Figure: Kubernetes中的CI/CD","alt":"Kubernetes中的CI/CD","nro":180,"url":"../images/00704eQkgy1fsayfzk3ezj31bu0tkdky.jpg","index":3,"caption_template":"图片 - _CAPTION_","label":"Kubernetes中的CI/CD","attributes":{},"skip":false,"key":"5.10.3"},{"backlink":"practice/ci-cd.html#fig5.10.4","level":"5.10","list_caption":"Figure: 云原生工作负载","alt":"云原生工作负载","nro":181,"url":"../images/00704eQkgy1fsayrk6vppj31bu0w0gsd.jpg","index":4,"caption_template":"图片 - _CAPTION_","label":"云原生工作负载","attributes":{},"skip":false,"key":"5.10.4"},{"backlink":"practice/ci-cd.html#fig5.10.5","level":"5.10","list_caption":"Figure: 云原生工作负载映射到Kuberentes原语","alt":"云原生工作负载映射到Kuberentes原语","nro":182,"url":"../images/00704eQkgy1fsaytbabxgj31c00w2n4r.jpg","index":5,"caption_template":"图片 - _CAPTION_","label":"云原生工作负载映射到Kuberentes原语","attributes":{},"skip":false,"key":"5.10.5"},{"backlink":"practice/ci-cd.html#fig5.10.6","level":"5.10","list_caption":"Figure: spinnaker中的组件及角色交互关系","alt":"spinnaker中的组件及角色交互关系","nro":183,"url":"../images/00704eQkgy1fsaz2wirz9j31bs0vygsb.jpg","index":6,"caption_template":"图片 - _CAPTION_","label":"spinnaker中的组件及角色交互关系","attributes":{},"skip":false,"key":"5.10.6"},{"backlink":"practice/ci-cd.html#fig5.10.7","level":"5.10","list_caption":"Figure: Spinnaker部署流水线","alt":"Spinnaker部署流水线","nro":184,"url":"../images/00704eQkgy1fsaz3yo227j31c60mgdim.jpg","index":7,"caption_template":"图片 - _CAPTION_","label":"Spinnaker部署流水线","attributes":{},"skip":false,"key":"5.10.7"},{"backlink":"practice/ci-cd.html#fig5.10.8","level":"5.10","list_caption":"Figure: Spinnaker的预发布流水线","alt":"Spinnaker的预发布流水线","nro":185,"url":"../images/00704eQkgy1fsaz50k2atj31bs0mitbn.jpg","index":8,"caption_template":"图片 - _CAPTION_","label":"Spinnaker的预发布流水线","attributes":{},"skip":false,"key":"5.10.8"},{"backlink":"practice/ci-cd.html#fig5.10.9","level":"5.10","list_caption":"Figure: Spinnaker的生产流水线","alt":"Spinnaker的生产流水线","nro":186,"url":"../images/00704eQkgy1fsaz5n5qs9j31by0motbm.jpg","index":9,"caption_template":"图片 - _CAPTION_","label":"Spinnaker的生产流水线","attributes":{},"skip":false,"key":"5.10.9"},{"backlink":"practice/ci-cd.html#fig5.10.10","level":"5.10","list_caption":"Figure: 可观察性","alt":"可观察性","nro":187,"url":"../images/00704eQkgy1fsazabn0b9j31by0w6791.jpg","index":10,"caption_template":"图片 - _CAPTION_","label":"可观察性","attributes":{},"skip":false,"key":"5.10.10"},{"backlink":"practice/ci-cd.html#fig5.10.11","level":"5.10","list_caption":"Figure: Prometheus生态系统中的组件","alt":"Prometheus生态系统中的组件","nro":188,"url":"../images/00704eQkgy1fsazcclee6j31c20w6n5y.jpg","index":11,"caption_template":"图片 - _CAPTION_","label":"Prometheus生态系统中的组件","attributes":{},"skip":false,"key":"5.10.11"},{"backlink":"practice/jenkins-ci-cd.html#fig5.10.1.1","level":"5.10.1","list_caption":"Figure: 基于Jenkins的持续集成与发布","alt":"基于Jenkins的持续集成与发布","nro":189,"url":"../images/kubernetes-jenkins-ci-cd.png","index":1,"caption_template":"图片 - _CAPTION_","label":"基于Jenkins的持续集成与发布","attributes":{},"skip":false,"key":"5.10.1.1"},{"backlink":"practice/drone-ci-cd.html#fig5.10.2.1","level":"5.10.2","list_caption":"Figure: OAuth注册","alt":"OAuth注册","nro":190,"url":"../images/github-oauth-register.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"OAuth注册","attributes":{},"skip":false,"key":"5.10.2.1"},{"backlink":"practice/drone-ci-cd.html#fig5.10.2.2","level":"5.10.2","list_caption":"Figure: OAuth key","alt":"OAuth key","nro":191,"url":"../images/github-oauth-drone-key.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"OAuth key","attributes":{},"skip":false,"key":"5.10.2.2"},{"backlink":"practice/drone-ci-cd.html#fig5.10.2.3","level":"5.10.2","list_caption":"Figure: Drone登陆界面","alt":"Drone登陆界面","nro":192,"url":"../images/drone-login-github.jpg","index":3,"caption_template":"图片 - _CAPTION_","label":"Drone登陆界面","attributes":{},"skip":false,"key":"5.10.2.3"},{"backlink":"practice/drone-ci-cd.html#fig5.10.2.4","level":"5.10.2","list_caption":"Figure: Github启用repo设置","alt":"Github启用repo设置","nro":193,"url":"../images/drone-github-active.jpg","index":4,"caption_template":"图片 - _CAPTION_","label":"Github启用repo设置","attributes":{},"skip":false,"key":"5.10.2.4"},{"backlink":"practice/drone-ci-cd.html#fig5.10.2.5","level":"5.10.2","list_caption":"Figure: Github单个repo设置","alt":"Github单个repo设置","nro":194,"url":"../images/drone-github-repo-setting.jpg","index":5,"caption_template":"图片 - _CAPTION_","label":"Github单个repo设置","attributes":{},"skip":false,"key":"5.10.2.5"},{"backlink":"practice/manually-upgrade.html#fig5.11.1.1","level":"5.11.1","list_caption":"Figure: Kubernetes零宕机时间升级建议","alt":"Kubernetes零宕机时间升级建议","nro":195,"url":"../images/zero-downtime-kubernetes-upgrade-tips.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Kubernetes零宕机时间升级建议","attributes":{},"skip":false,"key":"5.11.1.1"},{"backlink":"practice/manually-upgrade.html#fig5.11.1.2","level":"5.11.1","list_caption":"Figure: Kuberentes API对象的版本演进","alt":"Kuberentes API对象的版本演进","nro":196,"url":"../images/kubernetes-apversions-changes.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"Kuberentes API对象的版本演进","attributes":{},"skip":false,"key":"5.11.1.2"},{"backlink":"practice/dashboard-upgrade.html#fig5.11.2.1","level":"5.11.2","list_caption":"Figure: 登陆界面","alt":"登陆界面","nro":197,"url":"../images/kubernetes-dashboard-1.7.1-login.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"登陆界面","attributes":{},"skip":false,"key":"5.11.2.1"},{"backlink":"practice/dashboard-upgrade.html#fig5.11.2.2","level":"5.11.2","list_caption":"Figure: Dashboard首页","alt":"Dashboard首页","nro":198,"url":"../images/kubernetes-dashboard-1.7.1-default-page.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"Dashboard首页","attributes":{},"skip":false,"key":"5.11.2.2"},{"backlink":"practice/dashboard-upgrade.html#fig5.11.2.3","level":"5.11.2","list_caption":"Figure: Dashboard用户空间页面","alt":"Dashboard用户空间页面","nro":199,"url":"../images/kubernetes-dashboard-1.7.1-brand.jpg","index":3,"caption_template":"图片 - _CAPTION_","label":"Dashboard用户空间页面","attributes":{},"skip":false,"key":"5.11.2.3"},{"backlink":"practice/dashboard-upgrade.html#fig5.11.2.4","level":"5.11.2","list_caption":"Figure: kubeconfig文件","alt":"kubeconfig文件","nro":200,"url":"../images/brand-kubeconfig-yaml.jpg","index":4,"caption_template":"图片 - _CAPTION_","label":"kubeconfig文件","attributes":{},"skip":false,"key":"5.11.2.4"},{"backlink":"usecases/microservices.html#fig6.2.1","level":"6.2","list_caption":"Figure: 微服务关注的部分","alt":"微服务关注的部分","nro":201,"url":"../images/microservices-concerns.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"微服务关注的部分","attributes":{},"skip":false,"key":"6.2.1"},{"backlink":"usecases/service-discovery-in-microservices.html#fig6.2.1.1","level":"6.2.1","list_caption":"Figure: 微服务中的服务发现","alt":"微服务中的服务发现","nro":202,"url":"../images/service-discovery-in-microservices.png","index":1,"caption_template":"图片 - _CAPTION_","label":"微服务中的服务发现","attributes":{},"skip":false,"key":"6.2.1.1"},{"backlink":"usecases/microservices-for-java-developers.html#fig6.2.2.1","level":"6.2.2","list_caption":"Figure: Spring技术栈","alt":"Spring技术栈","nro":203,"url":"../images/spring-stack.png","index":1,"caption_template":"图片 - _CAPTION_","label":"Spring技术栈","attributes":{},"skip":false,"key":"6.2.2.1"},{"backlink":"usecases/microservices-for-java-developers.html#fig6.2.2.2","level":"6.2.2","list_caption":"Figure: Spring Boot的知识点","alt":"Spring Boot的知识点","nro":204,"url":"../images/spring-boot-note-spots.png","index":2,"caption_template":"图片 - _CAPTION_","label":"Spring Boot的知识点","attributes":{},"skip":false,"key":"6.2.2.2"},{"backlink":"usecases/service-mesh.html#fig6.3.1","level":"6.3","list_caption":"Figure: 下一代异构微服务架构","alt":"下一代异构微服务架构","nro":205,"url":"../images/polyglot-microservices-serivce-mesh.png","index":1,"caption_template":"图片 - _CAPTION_","label":"下一代异构微服务架构","attributes":{},"skip":false,"key":"6.3.1"},{"backlink":"usecases/service-mesh.html#fig6.3.2","level":"6.3","list_caption":"Figure: Service Mesh 架构图","alt":"Service Mesh 架构图","nro":206,"url":"../images/serivce-mesh-control-plane.png","index":2,"caption_template":"图片 - _CAPTION_","label":"Service Mesh 架构图","attributes":{},"skip":false,"key":"6.3.2"},{"backlink":"usecases/service-mesh.html#fig6.3.3","level":"6.3","list_caption":"Figure: Istio vs linkerd","alt":"Istio vs linkerd","nro":207,"url":"../images/istio-vs-linkerd.jpg","index":3,"caption_template":"图片 - _CAPTION_","label":"Istio vs linkerd","attributes":{},"skip":false,"key":"6.3.3"},{"backlink":"usecases/service-mesh-fundamental.html#fig6.3.1.1.1","level":"6.3.1.1","list_caption":"Figure: Service Mesh模型对比","alt":"Service Mesh模型对比","nro":208,"url":"../images/0069RVTdly1fuafvbnuc7j310a0oqdm9.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Service Mesh模型对比","attributes":{},"skip":false,"key":"6.3.1.1.1"},{"backlink":"usecases/service-mesh-fundamental.html#fig6.3.1.1.2","level":"6.3.1.1","list_caption":"Figure: 网状网络拓扑","alt":"网状网络拓扑","nro":209,"url":"../images/0069RVTdly1fuaie8jan8j310a0kitem.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"网状网络拓扑","attributes":{},"skip":false,"key":"6.3.1.1.2"},{"backlink":"usecases/service-mesh-fundamental.html#fig6.3.1.1.3","level":"6.3.1.1","list_caption":"Figure: Service Mesh架构图","alt":"Service Mesh架构图","nro":210,"url":"../images/0069RVTdly1fuail4d24jj31080rkgr7.jpg","index":3,"caption_template":"图片 - _CAPTION_","label":"Service Mesh架构图","attributes":{},"skip":false,"key":"6.3.1.1.3"},{"backlink":"usecases/service-mesh-fundamental.html#fig6.3.1.1.4","level":"6.3.1.1","list_caption":"Figure: Istio Mixer","alt":"Istio Mixer","nro":211,"url":"../images/0069RVTdly1fuam4ln45jj30yu0o6wkc.jpg","index":4,"caption_template":"图片 - _CAPTION_","label":"Istio Mixer","attributes":{},"skip":false,"key":"6.3.1.1.4"},{"backlink":"usecases/service-mesh-fundamental.html#fig6.3.1.1.5","level":"6.3.1.1","list_caption":"Figure: Istio架构图","alt":"Istio架构图","nro":212,"url":"../images/0069RVTdly1fuamvq97cuj30yu0wg7cr.jpg","index":5,"caption_template":"图片 - _CAPTION_","label":"Istio架构图","attributes":{},"skip":false,"key":"6.3.1.1.5"},{"backlink":"usecases/service-mesh-fundamental.html#fig6.3.1.1.6","level":"6.3.1.1","list_caption":"Figure: OSI模型","alt":"OSI模型","nro":213,"url":"../images/0069RVTdly1fuanez4qbtj30v4183n7p.jpg","index":6,"caption_template":"图片 - _CAPTION_","label":"OSI模型","attributes":{},"skip":false,"key":"6.3.1.1.6"},{"backlink":"usecases/service-mesh-fundamental.html#fig6.3.1.1.7","level":"6.3.1.1","list_caption":"Figure: 在L5解耦","alt":"在L5解耦","nro":214,"url":"../images/006tNbRwly1fubfiiryirj30w20ayjui.jpg","index":7,"caption_template":"图片 - _CAPTION_","label":"在L5解耦","attributes":{},"skip":false,"key":"6.3.1.1.7"},{"backlink":"usecases/comparing-service-mesh-technologies.html#fig6.3.1.2.1","level":"6.3.1.2","list_caption":"Figure: 客户端库","alt":"客户端库","nro":215,"url":"../images/006tNbRwly1fubnx0q9bpj30vq0pq465.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"客户端库","attributes":{},"skip":false,"key":"6.3.1.2.1"},{"backlink":"usecases/service-mesh-adoption-and-evolution.html#fig6.3.1.3.1","level":"6.3.1.3","list_caption":"Figure: Service Mesh架构图","alt":"Service Mesh架构图","nro":216,"url":"../images/006tNbRwly1fubs6ts3sgj30vo0osdnj.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Service Mesh架构图","attributes":{},"skip":false,"key":"6.3.1.3.1"},{"backlink":"usecases/service-mesh-adoption-and-evolution.html#fig6.3.1.3.2","level":"6.3.1.3","list_caption":"Figure: Ingress或边缘代理架构图","alt":"Ingress或边缘代理架构图","nro":217,"url":"../images/006tNbRwly1fubsk4v16hj30vo0bq75z.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"Ingress或边缘代理架构图","attributes":{},"skip":false,"key":"6.3.1.3.2"},{"backlink":"usecases/service-mesh-adoption-and-evolution.html#fig6.3.1.3.3","level":"6.3.1.3","list_caption":"Figure: 路由器网格架构图","alt":"路由器网格架构图","nro":218,"url":"../images/006tNbRwly1fubsxrph3dj30vq0duq53.jpg","index":3,"caption_template":"图片 - _CAPTION_","label":"路由器网格架构图","attributes":{},"skip":false,"key":"6.3.1.3.3"},{"backlink":"usecases/service-mesh-adoption-and-evolution.html#fig6.3.1.3.4","level":"6.3.1.3","list_caption":"Figure: Proxy per Node架构图","alt":"Proxy per Node架构图","nro":219,"url":"../images/006tNbRwly1fubt5a97h7j30vq0bcq5p.jpg","index":4,"caption_template":"图片 - _CAPTION_","label":"Proxy per Node架构图","attributes":{},"skip":false,"key":"6.3.1.3.4"},{"backlink":"usecases/service-mesh-adoption-and-evolution.html#fig6.3.1.3.5","level":"6.3.1.3","list_caption":"Figure: Sidecar代理/Fabric模型架构图","alt":"Sidecar代理/Fabric模型架构图","nro":220,"url":"../images/006tNbRwly1fubvi0dnhlj30vo0ekwhx.jpg","index":5,"caption_template":"图片 - _CAPTION_","label":"Sidecar代理/Fabric模型架构图","attributes":{},"skip":false,"key":"6.3.1.3.5"},{"backlink":"usecases/service-mesh-adoption-and-evolution.html#fig6.3.1.3.6","level":"6.3.1.3","list_caption":"Figure: Sidecar代理/控制平面架构图","alt":"Sidecar代理/控制平面架构图","nro":221,"url":"../images/006tNbRwly1fubvr83wvgj30vq0mmdip.jpg","index":6,"caption_template":"图片 - _CAPTION_","label":"Sidecar代理/控制平面架构图","attributes":{},"skip":false,"key":"6.3.1.3.6"},{"backlink":"usecases/service-mesh-customization-and-integration.html#fig6.3.1.4.1","level":"6.3.1.4","list_caption":"Figure: nginMesh架构图","alt":"nginMesh架构图","nro":222,"url":"../images/006tNbRwly1fucp8yralaj30vu0sijx8.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"nginMesh架构图","attributes":{},"skip":false,"key":"6.3.1.4.1"},{"backlink":"usecases/service-mesh-customization-and-integration.html#fig6.3.1.4.2","level":"6.3.1.4","list_caption":"Figure: Mixer adapter","alt":"Mixer adapter","nro":223,"url":"../images/006tNbRwly1fucplat3l9j30vo0lw43l.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"Mixer adapter","attributes":{},"skip":false,"key":"6.3.1.4.2"},{"backlink":"usecases/service-mesh-customization-and-integration.html#fig6.3.1.4.3","level":"6.3.1.4","list_caption":"Figure: SOFAMesh","alt":"SOFAMesh","nro":224,"url":"../images/mosn-with-service-mesh.png","index":3,"caption_template":"图片 - _CAPTION_","label":"SOFAMesh","attributes":{},"skip":false,"key":"6.3.1.4.3"},{"backlink":"usecases/service-mesh-customization-and-integration.html#fig6.3.1.4.4","level":"6.3.1.4","list_caption":"Figure: SOFAMosn模块架构图","alt":"SOFAMosn模块架构图","nro":225,"url":"../images/006tNbRwly1fucpc5fn8wj31kw0sfdnu.jpg","index":4,"caption_template":"图片 - _CAPTION_","label":"SOFAMosn模块架构图","attributes":{},"skip":false,"key":"6.3.1.4.4"},{"backlink":"usecases/istio.html#fig6.3.2.1","level":"6.3.2","list_caption":"Figure: Istio的mindmap","alt":"Istio的mindmap","nro":226,"url":"../images/istio-mindmap.png","index":1,"caption_template":"图片 - _CAPTION_","label":"Istio的mindmap","attributes":{},"skip":false,"key":"6.3.2.1"},{"backlink":"usecases/istio.html#fig6.3.2.2","level":"6.3.2","list_caption":"Figure: Istio架构图","alt":"Istio架构图","nro":227,"url":"../images/istio-arch.png","index":2,"caption_template":"图片 - _CAPTION_","label":"Istio架构图","attributes":{},"skip":false,"key":"6.3.2.2"},{"backlink":"usecases/istio-installation.html#fig6.3.2.1.1","level":"6.3.2.1","list_caption":"Figure: Istio 在 Kubernetes 中的部署架构图","alt":"Istio 在 Kubernetes 中的部署架构图","nro":228,"url":"../images/istio-deployment-architecture-diagram.png","index":1,"caption_template":"图片 - _CAPTION_","label":"Istio 在 Kubernetes 中的部署架构图","attributes":{},"skip":false,"key":"6.3.2.1.1"},{"backlink":"usecases/istio-installation.html#fig6.3.2.1.2","level":"6.3.2.1","list_caption":"Figure: BookInfo Sample应用架构图","alt":"BookInfo Sample应用架构图","nro":229,"url":"../images/bookinfo-sample-arch.png","index":2,"caption_template":"图片 - _CAPTION_","label":"BookInfo Sample应用架构图","attributes":{},"skip":false,"key":"6.3.2.1.2"},{"backlink":"usecases/istio-installation.html#fig6.3.2.1.3","level":"6.3.2.1","list_caption":"Figure: BookInfo Sample页面","alt":"BookInfo Sample页面","nro":230,"url":"../images/bookinfo-sample.jpg","index":3,"caption_template":"图片 - _CAPTION_","label":"BookInfo Sample页面","attributes":{},"skip":false,"key":"6.3.2.1.3"},{"backlink":"usecases/istio-installation.html#fig6.3.2.1.4","level":"6.3.2.1","list_caption":"Figure: Istio Grafana界面","alt":"Istio Grafana界面","nro":231,"url":"../images/istio-grafana.jpg","index":4,"caption_template":"图片 - _CAPTION_","label":"Istio Grafana界面","attributes":{},"skip":false,"key":"6.3.2.1.4"},{"backlink":"usecases/istio-installation.html#fig6.3.2.1.5","level":"6.3.2.1","list_caption":"Figure: Prometheus页面","alt":"Prometheus页面","nro":232,"url":"../images/istio-prometheus.jpg","index":5,"caption_template":"图片 - _CAPTION_","label":"Prometheus页面","attributes":{},"skip":false,"key":"6.3.2.1.5"},{"backlink":"usecases/istio-installation.html#fig6.3.2.1.6","level":"6.3.2.1","list_caption":"Figure: Zipkin页面","alt":"Zipkin页面","nro":233,"url":"../images/istio-zipkin.jpg","index":6,"caption_template":"图片 - _CAPTION_","label":"Zipkin页面","attributes":{},"skip":false,"key":"6.3.2.1.6"},{"backlink":"usecases/istio-installation.html#fig6.3.2.1.7","level":"6.3.2.1","list_caption":"Figure: ServiceGraph页面","alt":"ServiceGraph页面","nro":234,"url":"../images/istio-servicegraph.jpg","index":7,"caption_template":"图片 - _CAPTION_","label":"ServiceGraph页面","attributes":{},"skip":false,"key":"6.3.2.1.7"},{"backlink":"usecases/istio-tutorials-collection.html#fig6.3.2.4.1","level":"6.3.2.4","list_caption":"Figure: katacoda","alt":"katacoda","nro":235,"url":"../images/006tNc79gy1ftwe77v4u5j31kw0ziwtw.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"katacoda","attributes":{},"skip":false,"key":"6.3.2.4.1"},{"backlink":"usecases/istio-tutorials-collection.html#fig6.3.2.4.2","level":"6.3.2.4","list_caption":"Figure: weavescope","alt":"weavescope","nro":236,"url":"../images/006tNc79gy1ftwhtmzhfej31kw0ziww1.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"weavescope","attributes":{},"skip":false,"key":"6.3.2.4.2"},{"backlink":"usecases/istio-tutorials-collection.html#fig6.3.2.4.3","level":"6.3.2.4","list_caption":"Figure: weavescope","alt":"weavescope","nro":237,"url":"../images/006tNc79gy1ftwhvtu1vxj31kw0zitvc.jpg","index":3,"caption_template":"图片 - _CAPTION_","label":"weavescope","attributes":{},"skip":false,"key":"6.3.2.4.3"},{"backlink":"usecases/istio-tutorials-collection.html#fig6.3.2.4.4","level":"6.3.2.4","list_caption":"Figure: Red Hat","alt":"Red Hat","nro":238,"url":"../images/006tNc79gy1ftwiolw1tyj31kw0zib29.jpg","index":4,"caption_template":"图片 - _CAPTION_","label":"Red Hat","attributes":{},"skip":false,"key":"6.3.2.4.4"},{"backlink":"usecases/istio-tutorials-collection.html#fig6.3.2.4.5","level":"6.3.2.4","list_caption":"Figure: Red Hat developers","alt":"Red Hat developers","nro":239,"url":"../images/006tNc79gy1ftwjyxiw1pj31kw0zi4qp.jpg","index":5,"caption_template":"图片 - _CAPTION_","label":"Red Hat developers","attributes":{},"skip":false,"key":"6.3.2.4.5"},{"backlink":"usecases/istio-tutorials-collection.html#fig6.3.2.4.6","level":"6.3.2.4","list_caption":"Figure: IBM developerWorks","alt":"IBM developerWorks","nro":240,"url":"../images/006tNc79gy1ftweryj0zrj31kw0zix6q.jpg","index":6,"caption_template":"图片 - _CAPTION_","label":"IBM developerWorks","attributes":{},"skip":false,"key":"6.3.2.4.6"},{"backlink":"usecases/istio-tutorials-collection.html#fig6.3.2.4.7","level":"6.3.2.4","list_caption":"Figure: IBM developers","alt":"IBM developers","nro":241,"url":"../images/006tNc79gy1ftwesjg1e2j31kw0s8woq.jpg","index":7,"caption_template":"图片 - _CAPTION_","label":"IBM developers","attributes":{},"skip":false,"key":"6.3.2.4.7"},{"backlink":"usecases/understand-sidecar-injection-and-traffic-hijack-in-istio-service-mesh.html#fig6.3.2.5.1","level":"6.3.2.5","list_caption":"Figure: Sidecar 模式示意图","alt":"Sidecar 模式示意图","nro":242,"url":"../images/sidecar-pattern.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Sidecar 模式示意图","attributes":{},"skip":false,"key":"6.3.2.5.1"},{"backlink":"usecases/understand-sidecar-injection-and-traffic-hijack-in-istio-service-mesh.html#fig6.3.2.5.2","level":"6.3.2.5","list_caption":"Figure: Sidecar 流量劫持示意图","alt":"Sidecar 流量劫持示意图","nro":243,"url":"../images/envoy-sidecar-traffic-interception-jimmysong-blog.png","index":2,"caption_template":"图片 - _CAPTION_","label":"Sidecar 流量劫持示意图","attributes":{},"skip":false,"key":"6.3.2.5.2"},{"backlink":"usecases/understand-sidecar-injection-and-traffic-hijack-in-istio-service-mesh.html#fig6.3.2.5.3","level":"6.3.2.5","list_caption":"Figure: iptables 调用链","alt":"iptables 调用链","nro":244,"url":"../images/iptables.jpg","index":3,"caption_template":"图片 - _CAPTION_","label":"iptables 调用链","attributes":{},"skip":false,"key":"6.3.2.5.3"},{"backlink":"usecases/understand-sidecar-injection-and-traffic-hijack-in-istio-service-mesh.html#fig6.3.2.5.4","level":"6.3.2.5","list_caption":"Figure: hook-connect 原理示意图","alt":"hook-connect 原理示意图","nro":245,"url":"../images/hook-connect.jpg","index":4,"caption_template":"图片 - _CAPTION_","label":"hook-connect 原理示意图","attributes":{},"skip":false,"key":"6.3.2.5.4"},{"backlink":"usecases/envoy-sidecar-routing-of-istio-service-mesh-deep-dive.html#fig6.3.2.6.1","level":"6.3.2.6","list_caption":"Figure: Bookinfo 示例","alt":"Bookinfo 示例","nro":246,"url":"../images/006tNbRwgy1fvlwjd3302j31bo0ro0x5.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Bookinfo 示例","attributes":{},"skip":false,"key":"6.3.2.6.1"},{"backlink":"usecases/linkerd.html#fig6.3.3.1","level":"6.3.3","list_caption":"Figure: source https://linkerd.io","alt":"source https://linkerd.io","nro":247,"url":"../images/diagram-individual-instance.png","index":1,"caption_template":"图片 - _CAPTION_","label":"source https://linkerd.io","attributes":{},"skip":false,"key":"6.3.3.1"},{"backlink":"usecases/linkerd.html#fig6.3.3.2","level":"6.3.3","list_caption":"Figure: Linkerd 部署架构(图片来自https://buoyant.io/2016/10/14/a-service-mesh-for-kubernetes-part-ii-pods-are-great-until-theyre-not/)","alt":"Linkerd 部署架构(图片来自https://buoyant.io/2016/10/14/a-service-mesh-for-kubernetes-part-ii-pods-are-great-until-theyre-not/)","nro":248,"url":"https://buoyant.io/wp-content/uploads/2017/07/buoyant-k8s-daemonset-mesh.png","index":2,"caption_template":"图片 - _CAPTION_","label":"Linkerd 部署架构(图片来自https://buoyant.io/2016/10/14/a-service-mesh-for-kubernetes-part-ii-pods-are-great-until-theyre-not/)","attributes":{},"skip":false,"key":"6.3.3.2"},{"backlink":"usecases/linkerd.html#fig6.3.3.3","level":"6.3.3","list_caption":"Figure: 基于 dtab 的路由规则配置阶段发布","alt":"基于 dtab 的路由规则配置阶段发布","nro":249,"url":"https://buoyant.io/wp-content/uploads/2017/07/buoyant-4_override.png","index":3,"caption_template":"图片 - _CAPTION_","label":"基于 dtab 的路由规则配置阶段发布","attributes":{},"skip":false,"key":"6.3.3.3"},{"backlink":"usecases/linkerd.html#fig6.3.3.4","level":"6.3.3","list_caption":"Figure: Linkerd ingress controller","alt":"Linkerd ingress controller","nro":250,"url":"https://buoyant.io/wp-content/uploads/2017/07/buoyant-k8s-hello-world-ingress-controller-1.png","index":4,"caption_template":"图片 - _CAPTION_","label":"Linkerd ingress controller","attributes":{},"skip":false,"key":"6.3.3.4"},{"backlink":"usecases/linkerd-user-guide.html#fig6.3.3.1.1","level":"6.3.3.1","list_caption":"Figure: Jenkins pipeline","alt":"Jenkins pipeline","nro":251,"url":"../images/linkerd-jenkins-pipeline.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Jenkins pipeline","attributes":{},"skip":false,"key":"6.3.3.1.1"},{"backlink":"usecases/linkerd-user-guide.html#fig6.3.3.1.2","level":"6.3.3.1","list_caption":"Figure: Jenkins config","alt":"Jenkins config","nro":252,"url":"../images/linkerd-jenkins.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"Jenkins config","attributes":{},"skip":false,"key":"6.3.3.1.2"},{"backlink":"usecases/linkerd-user-guide.html#fig6.3.3.1.3","level":"6.3.3.1","list_caption":"Figure: namerd","alt":"namerd","nro":253,"url":"../images/namerd-internal.jpg","index":3,"caption_template":"图片 - _CAPTION_","label":"namerd","attributes":{},"skip":false,"key":"6.3.3.1.3"},{"backlink":"usecases/linkerd-user-guide.html#fig6.3.3.1.4","level":"6.3.3.1","list_caption":"Figure: linkerd监控","alt":"linkerd监控","nro":254,"url":"../images/linkerd-helloworld-outgoing.jpg","index":4,"caption_template":"图片 - _CAPTION_","label":"linkerd监控","attributes":{},"skip":false,"key":"6.3.3.1.4"},{"backlink":"usecases/linkerd-user-guide.html#fig6.3.3.1.5","level":"6.3.3.1","list_caption":"Figure: linkerd监控","alt":"linkerd监控","nro":255,"url":"../images/linkerd-helloworld-incoming.jpg","index":5,"caption_template":"图片 - _CAPTION_","label":"linkerd监控","attributes":{},"skip":false,"key":"6.3.3.1.5"},{"backlink":"usecases/linkerd-user-guide.html#fig6.3.3.1.6","level":"6.3.3.1","list_caption":"Figure: linkerd性能监控","alt":"linkerd性能监控","nro":256,"url":"../images/linkerd-grafana.png","index":6,"caption_template":"图片 - _CAPTION_","label":"linkerd性能监控","attributes":{},"skip":false,"key":"6.3.3.1.6"},{"backlink":"usecases/linkerd-user-guide.html#fig6.3.3.1.7","level":"6.3.3.1","list_caption":"Figure: Linkerd ingress controller","alt":"Linkerd ingress controller","nro":257,"url":"../images/linkerd-ingress-controller.jpg","index":7,"caption_template":"图片 - _CAPTION_","label":"Linkerd ingress controller","attributes":{},"skip":false,"key":"6.3.3.1.7"},{"backlink":"usecases/conduit-installation.html#fig6.3.4.2.1","level":"6.3.4.2","list_caption":"Figure: Conduit dashboard","alt":"Conduit dashboard","nro":258,"url":"../images/conduit-dashboard.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Conduit dashboard","attributes":{},"skip":false,"key":"6.3.4.2.1"},{"backlink":"usecases/envoy.html#fig6.3.5.1","level":"6.3.5","list_caption":"Figure: 负载均衡器的特性以及拓扑类型","alt":"负载均衡器的特性以及拓扑类型","nro":259,"url":"../images/load-balancing-and-proxing.png","index":1,"caption_template":"图片 - _CAPTION_","label":"负载均衡器的特性以及拓扑类型","attributes":{},"skip":false,"key":"6.3.5.1"},{"backlink":"usecases/envoy-terminology.html#fig6.3.5.1.1","level":"6.3.5.1","list_caption":"Figure: Envoy proxy 架构图","alt":"Envoy proxy 架构图","nro":260,"url":"../images/envoy-arch.png","index":1,"caption_template":"图片 - _CAPTION_","label":"Envoy proxy 架构图","attributes":{},"skip":false,"key":"6.3.5.1.1"},{"backlink":"usecases/envoy-front-proxy.html#fig6.3.5.2.1","level":"6.3.5.2","list_caption":"Figure: Front proxy 部署结构图(转自https://www.envoyproxy.io/docs/envoy/latest/start/sandboxes/front_proxy)","alt":"Front proxy 部署结构图(转自https://www.envoyproxy.io/docs/envoy/latest/start/sandboxes/front_proxy)","nro":261,"url":"../images/envoyproxy-docker-compose.png","index":1,"caption_template":"图片 - _CAPTION_","label":"Front proxy 部署结构图(转自https://www.envoyproxy.io/docs/envoy/latest/start/sandboxes/front_proxy)","attributes":{},"skip":false,"key":"6.3.5.2.1"},{"backlink":"usecases/envoy-mesh-in-kubernetes-tutorial.html#fig6.3.5.3.1","level":"6.3.5.3","list_caption":"Figure: Envoy Mesh架构图","alt":"Envoy Mesh架构图","nro":262,"url":"../images/envoy-mesh-in-kubernetes.png","index":1,"caption_template":"图片 - _CAPTION_","label":"Envoy Mesh架构图","attributes":{},"skip":false,"key":"6.3.5.3.1"},{"backlink":"usecases/big-data.html#fig6.4.1","level":"6.4","list_caption":"Figure: Spark on yarn with kubernetes","alt":"Spark on yarn with kubernetes","nro":263,"url":"../images/spark-on-yarn-with-kubernetes.png","index":1,"caption_template":"图片 - _CAPTION_","label":"Spark on yarn with kubernetes","attributes":{},"skip":false,"key":"6.4.1"},{"backlink":"usecases/big-data.html#fig6.4.2","level":"6.4","list_caption":"Figure: 在kubernetes上使用多种调度方式","alt":"在kubernetes上使用多种调度方式","nro":264,"url":"../images/spark-on-kubernetes-with-different-schedulers.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"在kubernetes上使用多种调度方式","attributes":{},"skip":false,"key":"6.4.2"},{"backlink":"usecases/spark-standalone-on-kubernetes.html#fig6.4.1.1","level":"6.4.1","list_caption":"Figure: spark master ui","alt":"spark master ui","nro":265,"url":"../images/spark-ui.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"spark master ui","attributes":{},"skip":false,"key":"6.4.1.1"},{"backlink":"usecases/spark-standalone-on-kubernetes.html#fig6.4.1.2","level":"6.4.1","list_caption":"Figure: zeppelin ui","alt":"zeppelin ui","nro":266,"url":"../images/zeppelin-ui.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"zeppelin ui","attributes":{},"skip":false,"key":"6.4.1.2"},{"backlink":"usecases/serverless.html#fig6.5.1","level":"6.5","list_caption":"Figure: Serverless Landscape","alt":"Serverless Landscape","nro":267,"url":"../images/006tNbRwly1fx0ie2kb90j31kw0ynha3.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Serverless Landscape","attributes":{},"skip":false,"key":"6.5.1"},{"backlink":"usecases/serverless.html#fig6.5.2","level":"6.5","list_caption":"Figure: 从物理机到函数计算","alt":"从物理机到函数计算","nro":268,"url":"../images/from-bare-metal-to-functions.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"从物理机到函数计算","attributes":{},"skip":false,"key":"6.5.2"},{"backlink":"usecases/serverless.html#fig6.5.3","level":"6.5","list_caption":"Figure: FaaS Landscape","alt":"FaaS Landscape","nro":269,"url":"../images/redpoint-faas-landscape.jpg","index":3,"caption_template":"图片 - _CAPTION_","label":"FaaS Landscape","attributes":{},"skip":false,"key":"6.5.3"},{"backlink":"usecases/understanding-serverless.html#fig6.5.1.1","level":"6.5.1","list_caption":"Figure: Serverless 在云原生技术中的地位","alt":"Serverless 在云原生技术中的地位","nro":270,"url":"../images/cloud-landscape-zh.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Serverless 在云原生技术中的地位","attributes":{},"skip":false,"key":"6.5.1.1"},{"backlink":"usecases/understanding-serverless.html#fig6.5.1.2","level":"6.5.1","list_caption":"Figure: 服务端软件的运行环境","alt":"服务端软件的运行环境","nro":271,"url":"../images/serverless-server-side-software.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"服务端软件的运行环境","attributes":{},"skip":false,"key":"6.5.1.2"},{"backlink":"usecases/understanding-serverless.html#fig6.5.1.3","level":"6.5.1","list_caption":"Figure: FaaS应用架构","alt":"FaaS应用架构","nro":272,"url":"../images/serverless-faas-platform.jpg","index":3,"caption_template":"图片 - _CAPTION_","label":"FaaS应用架构","attributes":{},"skip":false,"key":"6.5.1.3"},{"backlink":"usecases/understanding-serverless.html#fig6.5.1.4","level":"6.5.1","list_caption":"Figure: Serverless 中的函数定义","alt":"Serverless 中的函数定义","nro":273,"url":"../images/006y8mN6ly1g7ldey3l7gj31ti0mwta9.jpg","index":4,"caption_template":"图片 - _CAPTION_","label":"Serverless 中的函数定义","attributes":{},"skip":false,"key":"6.5.1.4"},{"backlink":"usecases/understanding-serverless.html#fig6.5.1.5","level":"6.5.1","list_caption":"Figure: FaaS 中的函数","alt":"FaaS 中的函数","nro":274,"url":"../images/006y8mN6ly1g7ldhm7bxyj31040u0q5n.jpg","index":5,"caption_template":"图片 - _CAPTION_","label":"FaaS 中的函数","attributes":{},"skip":false,"key":"6.5.1.5"},{"backlink":"usecases/understanding-serverless.html#fig6.5.1.6","level":"6.5.1","list_caption":"Figure: 传统应用程序架构","alt":"传统应用程序架构","nro":275,"url":"../images/non-serverless-game-arch.jpg","index":6,"caption_template":"图片 - _CAPTION_","label":"传统应用程序架构","attributes":{},"skip":false,"key":"6.5.1.6"},{"backlink":"usecases/understanding-serverless.html#fig6.5.1.7","level":"6.5.1","list_caption":"Figure: Serverless架构","alt":"Serverless架构","nro":276,"url":"../images/serverless-game-arch.jpg","index":7,"caption_template":"图片 - _CAPTION_","label":"Serverless架构","attributes":{},"skip":false,"key":"6.5.1.7"},{"backlink":"usecases/openfaas-quick-start.html#fig6.5.2.1.1","level":"6.5.2.1","list_caption":"Figure: OpenFaaS架构","alt":"OpenFaaS架构","nro":277,"url":"../images/openfaas-arch.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"OpenFaaS架构","attributes":{},"skip":false,"key":"6.5.2.1.1"},{"backlink":"usecases/openfaas-quick-start.html#fig6.5.2.1.2","level":"6.5.2.1","list_caption":"Figure: OpenFaaS Prometheus","alt":"OpenFaaS Prometheus","nro":278,"url":"../images/openfaas-prometheus.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"OpenFaaS Prometheus","attributes":{},"skip":false,"key":"6.5.2.1.2"},{"backlink":"usecases/openfaas-quick-start.html#fig6.5.2.1.3","level":"6.5.2.1","list_caption":"Figure: OpenFaas Grafana监控","alt":"OpenFaas Grafana监控","nro":279,"url":"../images/openfaas-grafana.jpg","index":3,"caption_template":"图片 - _CAPTION_","label":"OpenFaas Grafana监控","attributes":{},"skip":false,"key":"6.5.2.1.3"},{"backlink":"usecases/openfaas-quick-start.html#fig6.5.2.1.4","level":"6.5.2.1","list_caption":"Figure: OpenFaas Dashboard","alt":"OpenFaas Dashboard","nro":280,"url":"../images/openfaas-deploy-a-function.jpg","index":4,"caption_template":"图片 - _CAPTION_","label":"OpenFaas Dashboard","attributes":{},"skip":false,"key":"6.5.2.1.4"},{"backlink":"usecases/openfaas-quick-start.html#fig6.5.2.1.5","level":"6.5.2.1","list_caption":"Figure: NodeInfo执行结果","alt":"NodeInfo执行结果","nro":281,"url":"../images/openfaas-nodeinfo.jpg","index":5,"caption_template":"图片 - _CAPTION_","label":"NodeInfo执行结果","attributes":{},"skip":false,"key":"6.5.2.1.5"},{"backlink":"usecases/knative.html#fig6.5.3.1","level":"6.5.3","list_caption":"Figure: Knative logo","alt":"Knative logo","nro":282,"url":"https://tva1.sinaimg.cn/large/006y8mN6ly1g7pg0iwbzfj30d8080dfp.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Knative logo","attributes":{},"skip":false,"key":"6.5.3.1"},{"backlink":"usecases/knative.html#fig6.5.3.2","level":"6.5.3","list_caption":"Figure: Knative 受众(图片来自 knative.dev)","alt":"Knative 受众(图片来自 knative.dev)","nro":283,"url":"https://tva1.sinaimg.cn/large/006y8mN6ly1g7po5i7cgqj31ap0u075l.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"Knative 受众(图片来自 knative.dev)","attributes":{},"skip":false,"key":"6.5.3.2"},{"backlink":"usecases/oam.html#fig6.6.1.1","level":"6.6.1","list_caption":"Figure: OAM 的原理","alt":"OAM 的原理","nro":284,"url":"../images/oam-principle.png","index":1,"caption_template":"图片 - _CAPTION_","label":"OAM 的原理","attributes":{},"skip":false,"key":"6.6.1.1"},{"backlink":"usecases/edge-computing.html#fig6.7.1","level":"6.7","list_caption":"Figure: KubeEdge logo","alt":"KubeEdge logo","nro":285,"url":"https://tva1.sinaimg.cn/large/006y8mN6ly1g7vfsugr2fj306y06yjra.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"KubeEdge logo","attributes":{},"skip":false,"key":"6.7.1"},{"backlink":"develop/sigs-and-working-group.html#fig7.2.1","level":"7.2","list_caption":"Figure: Kubernetes SIG","alt":"Kubernetes SIG","nro":286,"url":"../images/kubernetes-sigs.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Kubernetes SIG","attributes":{},"skip":false,"key":"7.2.1"},{"backlink":"develop/testing.html#fig7.4.1","level":"7.4","list_caption":"Figure: test-infra架构图(图片来自官方GitHub)","alt":"test-infra架构图(图片来自官方GitHub)","nro":287,"url":"../images/kubernetes-test-architecture.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"test-infra架构图(图片来自官方GitHub)","attributes":{},"skip":false,"key":"7.4.1"},{"backlink":"develop/client-go-sample.html#fig7.5.1","level":"7.5","list_caption":"Figure: 使用kubernetes dashboard进行故障排查","alt":"使用kubernetes dashboard进行故障排查","nro":288,"url":"../images/kubernetes-client-go-sample-update.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"使用kubernetes dashboard进行故障排查","attributes":{},"skip":false,"key":"7.5.1"},{"backlink":"cloud-native/cncf.html#fig8.1.1","level":"8.1","list_caption":"Figure: CNCF landscape","alt":"CNCF landscape","nro":289,"url":"../images/006tNbRwly1fxmx633ymqj31dp0u0kjn.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"CNCF landscape","attributes":{},"skip":false,"key":"8.1.1"},{"backlink":"cloud-native/cncf.html#fig8.1.2","level":"8.1","list_caption":"Figure: CNCF项目成熟度级别","alt":"CNCF项目成熟度级别","nro":290,"url":"../images/cncf-graduation-criteria-v2.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"CNCF项目成熟度级别","attributes":{},"skip":false,"key":"8.1.2"},{"backlink":"cloud-native/cncf-charter.html#fig8.2.1","level":"8.2","list_caption":"Figure: CNCF组织架构图","alt":"CNCF组织架构图","nro":291,"url":"../images/cncf-org-arch.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"CNCF组织架构图","attributes":{},"skip":false,"key":"8.2.1"},{"backlink":"cloud-native/cncf-charter.html#fig8.2.2","level":"8.2","list_caption":"Figure: 云原生的理想分层架构","alt":"云原生的理想分层架构","nro":292,"url":"../images/006tKfTcly1ft3zgjlisxj30n70ffjth.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"云原生的理想分层架构","attributes":{},"skip":false,"key":"8.2.2"},{"backlink":"cloud-native/cncf-sandbox-criteria.html#fig8.4.1","level":"8.4","list_caption":"Figure: sandbox 流程","alt":"sandbox 流程","nro":293,"url":"../images/sandbox-process.png","index":1,"caption_template":"图片 - _CAPTION_","label":"sandbox 流程","attributes":{},"skip":false,"key":"8.4.1"},{"backlink":"cloud-native/cncf-project-governing.html#fig8.5.1","level":"8.5","list_caption":"Figure: CNCF 项目的成熟度分类","alt":"CNCF 项目的成熟度分类","nro":294,"url":"../images/cncf-graduation.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"CNCF 项目的成熟度分类","attributes":{},"skip":false,"key":"8.5.1"},{"backlink":"cloud-native/cncf-project-governing.html#fig8.5.2","level":"8.5","list_caption":"Figure: CNCF中的项目运作","alt":"CNCF中的项目运作","nro":295,"url":"../images/006tNc79ly1g1yz80ag98j31cs0n2gr7.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"CNCF中的项目运作","attributes":{},"skip":false,"key":"8.5.2"},{"backlink":"cloud-native/cncf-project-governing.html#fig8.5.3","level":"8.5","list_caption":"Figure: CNCF项目成熟度级别","alt":"CNCF项目成熟度级别","nro":296,"url":"../images/cncf-graduation-criteria-v2.jpg","index":3,"caption_template":"图片 - _CAPTION_","label":"CNCF项目成熟度级别","attributes":{},"skip":false,"key":"8.5.3"},{"backlink":"appendix/material-share.html#fig9.3.1","level":"9.3","list_caption":"Figure: Kubernetes 资源图标示例","alt":"Kubernetes 资源图标示例","nro":297,"url":"../images/006tNc79ly1fzmnolp5ghj30z90u0gwf.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Kubernetes 资源图标示例","attributes":{},"skip":false,"key":"9.3.1"},{"backlink":"appendix/issues.html#fig9.6.1","level":"9.6","list_caption":"Figure: pvc-storage-limit","alt":"pvc-storage-limit","nro":298,"url":"../images/pvc-storage-limit.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"pvc-storage-limit","attributes":{},"skip":false,"key":"9.6.1"},{"backlink":"appendix/kubernetes-1.14-changelog.html#fig9.7.8.1","level":"9.7.8","list_caption":"Figure: 大鱿鱼:kubectl log","alt":"大鱿鱼:kubectl log","nro":299,"url":"../images/006tKfTcly1g1gbdpsdbgj303c03cwel.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"大鱿鱼:kubectl log","attributes":{},"skip":false,"key":"9.7.8.1"},{"backlink":"appendix/kubernetes-1.14-changelog.html#fig9.7.8.2","level":"9.7.8","list_caption":"Figure: Kubernetes 吉祥物 kubee-cuddle","alt":"Kubernetes 吉祥物 kubee-cuddle","nro":300,"url":"../images/006tKfTcly1g1gbjvx2ugj305k05mmx9.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"Kubernetes 吉祥物 kubee-cuddle","attributes":{},"skip":false,"key":"9.7.8.2"},{"backlink":"appendix/kubernetes-1.15-changelog.html#fig9.7.9.1","level":"9.7.9","list_caption":"Figure: KubeAdmin Logo","alt":"KubeAdmin Logo","nro":301,"url":"https://d33wubrfki0l68.cloudfront.net/285b361256db9bb624c22ff9cd32557b4bc61aba/759c7/images/blog/2019-06-19-kubernetes-1-15-release-announcement/kubeadm-logo.png","index":1,"caption_template":"图片 - _CAPTION_","label":"KubeAdmin Logo","attributes":{},"skip":false,"key":"9.7.9.1"},{"backlink":"appendix/kubernetes-and-cloud-native-summary-in-2018-and-outlook-for-2019.html#fig9.8.2.1","level":"9.8.2","list_caption":"Figure: Kubernetes 搜索趋势(来自 Google trends)","alt":"Kubernetes 搜索趋势(来自 Google trends)","nro":302,"url":"../images/006tNc79ly1fzne6y4f2ej31q60fedho.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"Kubernetes 搜索趋势(来自 Google trends)","attributes":{},"skip":false,"key":"9.8.2.1"},{"backlink":"appendix/kubernetes-and-cloud-native-summary-in-2018-and-outlook-for-2019.html#fig9.8.2.2","level":"9.8.2","list_caption":"Figure: Kubernetes 的百度指数","alt":"Kubernetes 的百度指数","nro":303,"url":"../images/006tNc79ly1fznegoocmvj31y00hmgon.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"Kubernetes 的百度指数","attributes":{},"skip":false,"key":"9.8.2.2"},{"backlink":"appendix/kubernetes-and-cloud-native-summary-in-2018-and-outlook-for-2019.html#fig9.8.2.3","level":"9.8.2","list_caption":"Figure: Istio 中的 CRD","alt":"Istio 中的 CRD","nro":304,"url":"../images/006tNc79ly1fzna87wmfij30u00zc4qp.jpg","index":3,"caption_template":"图片 - _CAPTION_","label":"Istio 中的 CRD","attributes":{},"skip":false,"key":"9.8.2.3"},{"backlink":"appendix/kubernetes-and-cloud-native-summary-in-2018-and-outlook-for-2019.html#fig9.8.2.4","level":"9.8.2","list_caption":"Figure: 2019 Q1 软件架构趋势 - 来自 InfoQ","alt":"2019 Q1 软件架构趋势 - 来自 InfoQ","nro":305,"url":"../images/006tNc79ly1fzor2k6f7wj313j0u0dl3.jpg","index":4,"caption_template":"图片 - _CAPTION_","label":"2019 Q1 软件架构趋势 - 来自 InfoQ","attributes":{},"skip":false,"key":"9.8.2.4"},{"backlink":"appendix/kubernetes-and-cloud-native-summary-in-2018-and-outlook-for-2019.html#fig9.8.2.5","level":"9.8.2","list_caption":"Figure: ServiceMesher 社区 Logo","alt":"ServiceMesher 社区 Logo","nro":306,"url":"../images/006tNc79ly1fznadbp63qj31jt0beq9s.jpg","index":5,"caption_template":"图片 - _CAPTION_","label":"ServiceMesher 社区 Logo","attributes":{},"skip":false,"key":"9.8.2.5"},{"backlink":"appendix/kubernetes-and-cloud-native-summary-in-2018-and-outlook-for-2019.html#fig9.8.2.6","level":"9.8.2","list_caption":"Figure: ServiceMesher社区2018年活动一览","alt":"ServiceMesher社区2018年活动一览","nro":307,"url":"../images/006tNc79ly1fzm9vs4o3aj31s00u0x6p.jpg","index":6,"caption_template":"图片 - _CAPTION_","label":"ServiceMesher社区2018年活动一览","attributes":{},"skip":false,"key":"9.8.2.6"},{"backlink":"appendix/kubernetes-and-cloud-native-summary-in-2018-and-outlook-for-2019.html#fig9.8.2.7","level":"9.8.2","list_caption":"Figure: CNCF Landscape 中的 Serverless 单元","alt":"CNCF Landscape 中的 Serverless 单元","nro":308,"url":"../images/006tNc79ly1fznbh3vfbwj310f0jxgxj.jpg","index":7,"caption_template":"图片 - _CAPTION_","label":"CNCF Landscape 中的 Serverless 单元","attributes":{},"skip":false,"key":"9.8.2.7"},{"backlink":"appendix/cncf-annual-report-2018.html#fig9.9.1.1","level":"9.9.1","list_caption":"Figure: CNCF 项目成熟度级别","alt":"CNCF 项目成熟度级别","nro":309,"url":"../images/006tNc79ly1g04s0oznytj31tg0ok7ca.jpg","index":1,"caption_template":"图片 - _CAPTION_","label":"CNCF 项目成熟度级别","attributes":{},"skip":false,"key":"9.9.1.1"},{"backlink":"appendix/cncf-annual-report-2018.html#fig9.9.1.2","level":"9.9.1","list_caption":"Figure: KCSP","alt":"KCSP","nro":310,"url":"../images/006tNc79ly1g04tl97vm4j318v0h7dpt.jpg","index":2,"caption_template":"图片 - _CAPTION_","label":"KCSP","attributes":{},"skip":false,"key":"9.9.1.2"},{"backlink":"appendix/about-cka-candidate.html#fig9.11.1","level":"9.11","list_caption":"Figure: cka-question","alt":"cka-question","nro":311,"url":"../images/cka-question.png","index":1,"caption_template":"图片 - _CAPTION_","label":"cka-question","attributes":{},"skip":false,"key":"9.11.1"},{"backlink":"appendix/about-cka-candidate.html#fig9.11.2","level":"9.11","list_caption":"Figure: CKA mindmap","alt":"CKA mindmap","nro":312,"url":"../images/cka-mindmap.png","index":2,"caption_template":"图片 - _CAPTION_","label":"CKA mindmap","attributes":{},"skip":false,"key":"9.11.2"}]},"title":"Kubernetes Handbook - Kubernetes中文指南/云原生应用架构实践手册 by Jimmy Song(宋净超)","language":"zh-hans","links":{"sidebar":{"回到主页":"https://jimmysong.io","Awesome Cloud Native":"https://jimmysong.io/awesome-cloud-native","云原生社区":"https://cloudnative.to","中国云原生发展白皮书2020":"https://cloudnativeindustryalliance.github.io/whitepaper2020/","云原生应用白皮书":"https://jimmysong.io/guide-to-cloud-native-app/"}},"gitbook":"*","description":"Kubernetes Handbook - Kubernetes中文指南/云原生应用架构实践手册,本书记录了本人从零开始学习和使用Kubernetes的心路历程,着重于经验分享和总结,同时也会有相关的概念解析,希望能够帮助大家少踩坑,少走弯路,还会指引大家关注Kubernetes生态周边,如微服务构建、DevOps、大数据应用、Service Mesh、Cloud Native等领域。"},"file":{"path":"cloud-native/cloud-native-programming-language-pulumi.md","mtime":"2020-06-19T06:31:45.061Z","type":"markdown"},"gitbook":{"version":"3.2.3","time":"2020-06-19T06:32:57.939Z"},"basePath":"..","book":{"language":""}});
});
diff --git a/cloud-native/cloud-native-programming-languages.html b/cloud-native/cloud-native-programming-languages.html
index a0f11bb7f..c92b8f51d 100644
--- a/cloud-native/cloud-native-programming-languages.html
+++ b/cloud-native/cloud-native-programming-languages.html
@@ -4590,7 +4590,7 @@
使用这种相同类型的配置表示基于容器的微服务、serverless和细粒度托管服务之间的关系导致了异常的复杂性。将应用程序转变为分布式系统应该是事后的想法。事实证明,云覆盖了您的架构和设计。表达架构和设计的最好的方式是使用代码,使用真正的编程语言编写抽象,重用和优秀的工具。
早些时候,Eric和我采访了几十个客户。我们发现,开发人员和DevOps工程师都普遍感到幻灭。我们发现了极端的专业化,即使在同一个团队中,工程师也不会使用同一种语言。最近几周我已经听到了这个消息,我期待有一天会出现NoYAML运动。
@@ -4634,7 +4634,7 @@
diff --git a/cloud-native/component.html b/cloud-native/component.html
index 1c68769e6..d343aad24 100644
--- a/cloud-native/component.html
+++ b/cloud-native/component.html
@@ -4611,7 +4611,7 @@
The Open Application Model specification - github.com
@@ -4655,7 +4655,7 @@
diff --git a/cloud-native/define-cloud-native-app.html b/cloud-native/define-cloud-native-app.html
index a4c3bb37b..2e04f338b 100644
--- a/cloud-native/define-cloud-native-app.html
+++ b/cloud-native/define-cloud-native-app.html
@@ -4578,7 +4578,7 @@
云原生应用是一个相互关联但又不独立的组件(service、task、worker)的集合,这些组件与配置结合在一起并在适当的运行时实例化后,共同完成统一的功能目的。
云原生应用模型
下图是 OAM 定义的云原生应用模型示意图,为了便于理解,图中相同颜色的部分为同一类别的对象定义。
-图片 - 云原生应用模型
+图片 - 云原生应用模型
OAM 的规范中定义了以下对象,它们既是 OAM 规范中的基本术语也是云原生应用的基本组成。
Workload (工作负载) :应用程序的工作负载类型,由平台提供。
@@ -4590,7 +4590,7 @@
OAM 规范中提供了一个使用以上对象定义云原生应用的工作流示例 。
关注点分离
下图是不同角色对于该模型的关注点示意图。
-图片 - 云原生应用模型中的目标角色
+图片 - 云原生应用模型中的目标角色
我们可以看到对于一个云原生应用来说,不同的对象是由不同的角色来负责的:
@@ -4648,7 +4648,7 @@
diff --git a/cloud-native/from-kubernetes-to-cloud-native.html b/cloud-native/from-kubernetes-to-cloud-native.html
index 11842ffc4..6919ec18e 100644
--- a/cloud-native/from-kubernetes-to-cloud-native.html
+++ b/cloud-native/from-kubernetes-to-cloud-native.html
@@ -4583,7 +4583,7 @@
容器最初是通过开发者工具而流行,可以使用它来做隔离的开发测试环境和持续集成环境,这些都是因为容器轻量级,易于配置和使用带来的优势,docker和docker-compose这样的工具极大的方便的了应用开发环境的搭建,开发者就像是化学家一样在其中小心翼翼的进行各种调试和开发。
随着容器的在开发者中的普及,已经大家对CI流程的熟悉,容器周边的各种工具蓬勃发展,俨然形成了一个小生态,在2016年达到顶峰,下面这张是我画的容器生态图:
-图片 - 容器生态图 Container ecosystem
+图片 - 容器生态图 Container ecosystem
该生态涵盖了容器应用中从镜像仓库、服务编排、安全管理、持续集成与发布、存储和网络管理等各个方面,随着在单主机中运行容器的成熟,集群管理和容器编排成为容器技术亟待解决的问题。譬如化学家在实验室中研究出来的新产品,如何推向市场,进行大规模生产,成了新的议题。
为什么使用Kubernetes
@@ -4592,28 +4592,28 @@
Kubernetes是容器编排系统的事实标准
在单机上运行容器,无法发挥它的最大效能,只有形成集群,才能最大程度发挥容器的良好隔离、资源分配与编排管理的优势,而对于容器的编排管理,Swarm、Mesos和Kubernetes的大战已经基本宣告结束,Kubernetes成为了无可争议的赢家。
下面这张图是Kubernetes的架构图(图片来自网络),其中显示了组件之间交互的接口CNI、CRI、OCI等,这些将Kubernetes与某款具体产品解耦,给用户最大的定制程度,使得Kubernetes有机会成为跨云的真正的云原生应用的操作系统。
-图片 - Kubernetes架构
+图片 - Kubernetes架构
随着Kubernetes的日趋成熟,“Kubernetes is becoming boring”,基于该“操作系统”之上构建的适用于不同场景的应用将成为新的发展方向,就像我们将石油开采出来后,提炼出汽油、柴油、沥青等等,所有的材料都将找到自己的用途,Kubernetes也是,毕竟我们谁也不是为了部署和管理容器而用Kubernetes,承载其上的应用才是价值之所在。
云原生的核心目标
-图片 - Cloud Native Core target
+图片 - Cloud Native Core target
云已经可以为我们提供稳定可以唾手可得的基础设施,但是业务上云成了一个难题,Kubernetes的出现与其说是从最初的容器编排解决方案,倒不如说是为了解决应用上云(即云原生应用)这个难题。
包括微服务和FaaS/Serverless架构,都可以作为云原生应用的架构。
-图片 - FaaS Landscape
+图片 - FaaS Landscape
但就2017年为止,Kubernetes的主要使用场景也主要作为应用开发测试环境、CI/CD和运行Web应用这几个领域,如下图TheNewStack 的Kubernetes生态状况调查报告所示。
-图片 - Workloads running on Kubernetes
+图片 - Workloads running on Kubernetes
另外基于Kubernetes的构建PaaS平台和Serverless也处于爆发的准备的阶段,如下图中Gartner的报告中所示:
-图片 - Gartner技术爆发趋势图2017
+图片 - Gartner技术爆发趋势图2017
当前各大公有云如Google GKE、微软Azure ACS、亚马逊EKS(2018年上线)、VMWare、Pivotal、腾讯云、阿里云等都提供了Kubernetes服务。
微服务
微服务——Cloud Native的应用架构。
下图是Bilgin Ibryam 给出的微服务中应该关心的主题,图片来自RedHat Developers 。
-图片 - Microservices concerns
+图片 - Microservices concerns
微服务带给我们很多开发和部署上的灵活性和技术多样性,但是也增加了服务调用的开销、分布式系统管理、调试与服务治理方面的难题。
当前最成熟最完整的微服务框架可以说非Spring 莫属,而Spring又仅限于Java语言开发,其架构本身又跟Kubernetes存在很多重合的部分,如何探索将Kubernetes作为微服务架构平台就成为一个热点话题。
就拿微服务中最基础的服务注册发现 功能来说,其方式分为客户端服务发现 和服务端服务发现 两种,Java应用中常用的方式是使用Eureka和Ribbon做服务注册发现和负载均衡,这属于客户端服务发现,而在Kubernetes中则可以使用DNS、Service和Ingress来实现,不需要修改应用代码,直接从网络层面来实现。
-图片 - 两种服务发现方式
+图片 - 两种服务发现方式
Cloud Native
DevOps——通向云原生的云梯
@@ -4625,9 +4625,9 @@
微服务化 :明确服务间的依赖,互相解耦。
下图是我整理的关于云原生所需要的能力和特征。
-图片 - Cloud Native Features
+图片 - Cloud Native Features
CNCF 所托管的应用(目前已达12个),即朝着这个目标发展,其公布的Cloud Native Landscape ,给出了云原生生态的参考体系。
-图片 - Cloud Native Landscape v1.0
+图片 - Cloud Native Landscape v1.0
使用Kubernetes构建云原生应用
我们都是知道Heroku推出了适用于PaaS的12 factor app 的规范,包括如下要素:
@@ -4651,9 +4651,9 @@
监控与告警
如果落实的具体的工具,请看下图,使用Kubernetes构建云原生架构:
-图片 - Building a Cloud Native Architecture with Kubernetes followed 12 factor app
+图片 - Building a Cloud Native Architecture with Kubernetes followed 12 factor app
结合这12因素对开发或者改造后的应用适合部署到Kubernetes之上,基本流程如下图所示:
-图片 - Creating Kubernetes native app
+图片 - Creating Kubernetes native app
迁移到云架构
迁移到云端架构,相对单体架构来说会带来很多挑战。比如自动的持续集成与发布、服务监控的变革、服务暴露、权限的管控等。这些具体细节请参考Kubernetes-handbook 中的说明:https://jimmysong.io/kubernetes-handbook ,在此就不细节展开,另外推荐一本我翻译的由Pivotal出品的电子书——Migrating to Cloud Native Application Architectures ,地址:https://jimmysong.io/migrating-to-cloud-native-application-architectures/ 。
Service Mesh
@@ -4723,7 +4723,7 @@
关于两者的架构可以参考各自的官方文档,我只从其在Kubernetes上的部署结构来说明其区别。
-图片 - istio vs linkerd
+图片 - istio vs linkerd
Istio的组件复杂,可以分别部署在Kubernetes集群中,但是作为核心路由组件Envoy 是以Sidecar 形式与应用运行在同一个Pod中的,所有进入该Pod中的流量都需要先经过Envoy。
Linker的部署十分简单,本身就是一个镜像,使用Kubernetes的DaemonSet 方式在每个node节点上运行。
更多信息请参考kubernetes-handbook 。
@@ -4733,7 +4733,7 @@
GitOps
给开发者带来最大的配置和上线的灵活性,践行DevOps流程,改善研发效率,下图这样的情况将更少发生。
-图片 - Deployment pipeline
+图片 - Deployment pipeline
我们知道Kubernetes中的所有应用的部署都是基于YAML文件的,这实际上就是一种Infrastructure as code ,完全可以通过Git来管控基础设施和部署环境的变更。
Big Data
Spark现在已经非官方支持了基于Kubernetes的原生调度,其具有以下特点:
@@ -4780,7 +4780,7 @@
下图是在Kubernetes上运行三种调度方式的spark的单个节点的应用部分对比:
-图片 - Spark on Kubernetes with different schedulers
+图片 - Spark on Kubernetes with different schedulers
从上图中可以看到在Kubernetes上使用YARN调度、standalone调度和Kubernetes原生调度的方式,每个node节点上的Pod内的Spark Executor分布,毫无疑问,使用Kubernetes原生调度的Spark任务才是最节省资源的。
提交任务的语句看起来会像是这样的:
./spark-submit \
@@ -4815,9 +4815,9 @@
Contributing is Not only about code, it is about helping a community.
下图是我们刚调研准备使用Kubernetes时候的调研方案选择。
-图片 - Kubernetes solutions
+图片 - Kubernetes solutions
对于一个初次接触Kubernetes的人来说,看到这样一个庞大的架构选型时会望而生畏,但是Kubernetes的开源社区帮助了我们很多。
-图片 - Kubernetes SIG
+图片 - Kubernetes SIG
我组建了K8S&Cloud Native实战 、ServiceMesher 微信群,参与了k8smeetup、KEUC2017、kubernetes-docs-cn Kubernetes官方中文文档项目。
有用的资料和链接
@@ -4832,7 +4832,7 @@
KubeCon + CloudNativeCon 2018年11月14-15日 上海
@@ -4876,7 +4876,7 @@
diff --git a/cloud-native/kubernetes-and-cloud-native-app-overview.html b/cloud-native/kubernetes-and-cloud-native-app-overview.html
index d8c4f6baa..f8ee277c8 100644
--- a/cloud-native/kubernetes-and-cloud-native-app-overview.html
+++ b/cloud-native/kubernetes-and-cloud-native-app-overview.html
@@ -4578,9 +4578,9 @@
作为全书的开头,首先从历史、生态和应用角度介绍一下Kubernetes与云原生应用,深入浅出,高屋建瓴,没有深入到具体细节,主要是为了给初次接触Kubernetes的小白扫盲,具体细节请参考链接。
从云计算到微服务再到云原生计算
下面将从云计算的发展历程引入云原生计算,请先看下图:
-图片 - 云计算演进历程
+图片 - 云计算演进历程
云原生应用到2020年将比目前至少翻一番,下图是Marc Wilczek的调查报告。
-图片 - 来自Twitter @MarcWilczek
+图片 - 来自Twitter @MarcWilczek
云计算介绍
云计算包含的内容十分繁杂,也有很多技术和公司牵强附会说自己是云计算公司,说自己是做云的,实际上可能风马牛不相及。说白了,云计算就是一种配置资源的方式,根据资源配置方式的不同我们可以把云计算从宏观上分为以下三种类型:
@@ -4594,7 +4594,7 @@
下文中会谈到Kubernetes与微服务的关系,其中Kubernetes的service天生就适合于微服务。
云原生概念介绍
下面是Cloud Native概念思维导图
-图片 - Cloud native思维导图
+图片 - Cloud native思维导图
云原生准确来说是一种文化,更是一种潮流,它是云计算的一个必然导向。它的意义在于让云成为云化战略成功的基石,而不是阻碍,如果业务应用上云之后开发和运维人员比原先还痛苦,成本还高的话,这样的云我们宁愿不上。
自从云的概念开始普及,许多公司都部署了实施云化的策略,纷纷搭建起云平台,希望完成传统应用到云端的迁移。但是这个过程中会遇到一些技术难题,上云以后,效率并没有变得更高,故障也没有迅速定位。
为了解决传统应用升级缓慢、架构臃肿、不能快速迭代、故障不能快速定位、问题无法快速解决等问题,云原生这一概念横空出世。云原生可以改进应用开发的效率,改变企业的组织结构,甚至会在文化层面上直接影响一个公司的决策。
@@ -4619,7 +4619,7 @@
12因素应用
12因素应用提出已经有几年的时间了,每个人对其可能都有自己的理解,切不可生搬硬套,也不一定所有云原生应用都必须符合这12条法则,其中有几条法则可能还有点争议,有人对其的解释和看法不同。
大家不要孤立的来看这每一个因素,将其与自己软件开发流程联系起来,这12个因素大致就是按照软件从开发到交付的流程顺序来写的。
-图片 - 十二因素应用
+图片 - 十二因素应用
1.基准代码
每个代码仓库(repo)都生成docker image保存到镜像仓库中,并使用唯一的ID管理,在Jenkins中使用编译时的ID。
2.依赖
@@ -4671,7 +4671,7 @@
Kubernetes中的资源管理与容器设计模式
Kubernetes通过声明式配置,真正让开发人员能够理解应用的状态,并通过同一份配置可以立马启动一个一模一样的环境,大大提高了应用开发和部署的效率,其中Kubernetes设计的多种资源类型可以帮助我们定义应用的运行状态,并使用资源配置来细粒度的明确限制应用的资源使用。
而容器生态的成熟是 Kubernetes 诞生的前提,在谈到容器的设计模式之前我们先来了解下容器生态,请看下图:
-图片 - 容器生态
+图片 - 容器生态
关于 Docker 容器的更多内容请参考 Docker最佳实践 。
容器的设计模式
Kubernetes提供了多种资源对象,用户可以根据自己应用的特性加以选择。这些对象有:
@@ -4757,7 +4757,7 @@
详见Kubernetes Handbook - 服务发现与负载均衡 。
持续集成与发布
-图片 - 使用Jenkins进行持续集成与发布流程图
+图片 - 使用Jenkins进行持续集成与发布流程图
应用构建和发布流程说明:
用户向Gitlab提交代码,代码中必须包含Dockerfile
@@ -4772,7 +4772,7 @@
日志收集与监控
基于现有的ELK日志收集方案,稍作改造,选用filebeat 来收集日志,可以作为sidecar的形式跟应用运行在同一个Pod中,比较轻量级消耗资源比较少。
-图片 - filebeat日志收集架构图
+图片 - filebeat日志收集架构图
详见Kubernetes Handbook - 应用日志收集 。
安全性与权限管理
Kubernetes是一个多租户的云平台,因此必须对用户的权限加以限制,对用户空间进行隔离。Kubernetes中的隔离主要包括这几种:
@@ -4798,7 +4798,7 @@
定义API生成API文档
使用API blueprint
格式,定义API文档,格式类似于markdown,再使用aglio 生成HTML文档。
-图片 - API文档
+图片 - API文档
详见:如何开发部署Kubernetes Native应用 。
如何迁移到云原生应用架构
Pivotal 是云原生应用的提出者,并推出了 Pivotal Cloud Foundry 云原生应用平台和 Spring 开源 Java 开发框架,成为云原生应用架构中先驱者和探路者。
@@ -4816,7 +4816,7 @@
详见:迁移到云原生应用架构
迁移案例解析
迁移步骤示意图如下:
-图片 - 迁移步骤示意图
+图片 - 迁移步骤示意图
步骤说明:
将原有应用拆解为服务
@@ -4839,7 +4839,7 @@
此外还有很多其它的Service Mesh鱼贯而出,请参考awesome-cloud-native 。
什么是Service Mesh
如果用一句话来解释什么是 Service Mesh,可以将它比作是应用程序或者说微服务间的 TCP/IP,负责服务之间的网络调用、限流、熔断和监控。对于编写应用程序来说一般无须关心 TCP/IP 这一层(比如通过 HTTP 协议的 RESTful 应用),同样使用 Service Mesh 也就无须关心服务之间的那些原来是通过应用程序或者其他框架实现的事情,比如 Spring Cloud、OSS,现在只要交给 Service Mesh 就可以了。
-图片 - service mesh架构图
+图片 - service mesh架构图
详见什么是 Service Mesh - jimmysong.io 。
Service Mesh使用指南
两款Service Mesh各有千秋,我分别写了他们的使用案例指南:
@@ -4867,17 +4867,17 @@
使用Kibana查看日志
日志字段中包括了应用的标签、容器名称、主机名称、宿主机名称、IP地址、时间。
-图片 - kibana界面
+图片 - kibana界面
使用Grafana查看应用状态
注 :感谢【K8S🤘Cloud Native实战群】尊贵的黄金会员小刚同学提供下面的Grafana监控图🙏
监控分类示意图:
-图片 - Grafana界面示意图1
+图片 - Grafana界面示意图1
Kubernetes集群全局监控图1
该监控图可以看到集群硬件使用情况。
-图片 - Grafana界面示意图2
+图片 - Grafana界面示意图2
Kubernetes全局监控图2
该监控可以看到单个用户的namespace下的所有资源的使用情况。
-图片 - Grafana界面示意图3
+图片 - Grafana界面示意图3
Spark on Kubernetes
TL;DR https://jimmysong.io/spark-on-k8s
Spark原生支持standalone、mesos和YARN资源调度,现已支持Kubernetes原生调度,详见运行支持Kubernetes原生调度的spark程序-Spark on Kubernetes 。
@@ -4921,9 +4921,9 @@
监控
下图是从Kubernetes dashboard上看到的spark-cluster这个namespace上运行的应用情况。
-图片 - dashboard
+图片 - dashboard
下图是从Grafana监控页面上查看到的某个executor资源占用情况。
-图片 - Grafana
+图片 - Grafana
参考
@@ -4976,7 +4976,7 @@
diff --git a/cloud-native/play-with-kubernetes.html b/cloud-native/play-with-kubernetes.html
index a2fb1de8f..1f2b98884 100644
--- a/cloud-native/play-with-kubernetes.html
+++ b/cloud-native/play-with-kubernetes.html
@@ -4603,10 +4603,10 @@
注意:192.168.0.13
是master节点的IP,请替换您的master节点的实际IP。
再添加几个实例,重复执行第四步,即可向Kubernetes集群中增加节点。
此时在master节点上执行kubectl get nodes
查看节点所有节点状态,并创建nginx deployment,如下图所示:
-图片 - Play with Kubernetes网页截图
+图片 - Play with Kubernetes网页截图
Play with Kuberentes (PWK) is a project hacked by Marcos Lilljedahl and Jonathan Leibiusky and sponsored by Docker Inc.
@@ -4650,7 +4650,7 @@
diff --git a/cloud-native/setup-kubernetes-with-rancher-and-aliyun.html b/cloud-native/setup-kubernetes-with-rancher-and-aliyun.html
index 75b7046c7..07b2d44c5 100644
--- a/cloud-native/setup-kubernetes-with-rancher-and-aliyun.html
+++ b/cloud-native/setup-kubernetes-with-rancher-and-aliyun.html
@@ -4595,18 +4595,18 @@
步骤
假设现在我们有两个节点 master 和 node,请参考 Rancher Quick Start Guide 安装 Rancher。
-图片 - Rancher 界面
+图片 - Rancher 界面
Master
先在 Master 节点安装 Rancher server、control、etcd 和 worker。
选择网络组件为 Flannel,同时在自定义主机运行命令中选择主机角色、填写主机的内网和外网 IP。
-图片 - 自定义节点信息
+图片 - 自定义节点信息
docker run -d --restart= unless-stopped -p 80 :80 -p 443 :443 rancher/rancher
Rancher 将自动创建 Kubernetes 集群,并默认在 80 端口运行 web server。
Node
添加 Node 节点时只需要在 Rancher 的 web 界面上找到您刚安装的集群并选择【编辑集群】并选择节点角色为 Worker 即可增加一台 Kubenretes 集群节点。
集群交互
-图片 - Rancher 集群监控页面
+图片 - Rancher 集群监控页面
如果您习惯使用命令行与集群交互可以 Rancher 的 web 上找到集群首页上的 Kubeconfig File
下载按钮,将该文件中的内容保存到您自己电脑的 ~/.kube/config
文件中。然后现在对应 Kubernetes 版本的 kubectl
命令并放到 PATH
路径下即可。
如果您没有在本地安装 kubectl
工具,也可以通过 Rancher 的集群页面上的 Launch kubectl
命令通过 web 来操作集群。
参考
@@ -4615,7 +4615,7 @@
阿里云容器服务 ACK - aliyun.com
@@ -4659,7 +4659,7 @@
diff --git a/cloud-native/the-future-of-cloud-native.html b/cloud-native/the-future-of-cloud-native.html
index 04a4086c1..844e843ac 100644
--- a/cloud-native/the-future-of-cloud-native.html
+++ b/cloud-native/the-future-of-cloud-native.html
@@ -4589,10 +4589,10 @@
一句话解释什么是云原生应用:云原生应用就是为了在云上运行而开发的应用。
Kubernetes:云原生操作系统
-图片 - Kubernetes 云原生的操作系统
+图片 - Kubernetes 云原生的操作系统
要运行这样的应用必须有一个操作系统,就像我们运行PC或手机应用一样,而Kubernetes就是一个这样的操作系统。
我们再来看下操作系统包括哪些层次。
-图片 - 操作系统层次
+图片 - 操作系统层次
硬件管理:可以管理CPU、内存、网络和存储
设备接口、虚拟化工具、实用工具
@@ -4600,7 +4600,7 @@
各种终端工具,如awk、sort、grep、vim等
下面是CNCF给出的云原生景观图。
-图片 - 云原生景观图
+图片 - 云原生景观图
该图中包括云原生的各种层次的提供者和应用,通过该图可以组合出一些列的云原生平台。
IaaS云提供商(公有云、私有云)
@@ -4615,13 +4615,13 @@
Kubernetes发展已经有3年多的时间了,它已经基本成为了容器编排调度框架的标准。它的各种抽象与资源定义已经被大家广为接受。其中最基础的调度单元Pod。
创建一个自定义资源类型需要满足的条件。
这是KubeVirt的架构图。
-图片 - KubeVirt架构图
+图片 - KubeVirt架构图
我们看到图中有两个是Kubernetes原生的组件,API server和kubelet,我们创建了virt-controller就是为了创建CRD的controller,它扩展了kube-controller的功能,用于管理虚拟机的生命周期,同时在每个节点上都用DaemonSet的方式运行一个virt-handler,这个handler是用于创建虚拟机的处理器,每个节点上即可用运行虚拟机也可以运行容器,只要这个节点上有virt-handler就可以运行和调度虚拟机。
Kubernetes做了什么?
Kubernetes优秀的分布式架构设计,给我们提供了众多了可扩展接口,可以让我们很方便的扩展自己的运行时、网络和存储插件,同时还可以通过CRD管理我们自己的分布式应用。它的声明式配置方式可以让我们利用Kubernetes的原语快速的编排出一个云原生应用。
Kubernetes的资源隔离也能保证对集群资源的最大化和最优利用率。
下图中展示了Kubernetes中的资源隔离层次。
-图片 - Kubernetes中的资源隔离
+图片 - Kubernetes中的资源隔离
容器
Pod:命名空间的隔离,共享网络,每个Pod都有独立IP,使用Service Account为Pod赋予账户
@@ -4636,17 +4636,17 @@
存储:PV、PVC、ConfigMap、Secret
在最近一届的KubeCon & CloudNativeCon上Operator已经变得越来越流行。下面是OpenEBS的一个使用Operator的例子。
-图片 - OpenEBS 控制平面架构
+图片 - OpenEBS 控制平面架构
OpenEBS是一款容器化存储,它基于Ceph构建,容器化存储最大的好处就是复用Kubernetes的资源类型,简化存储应用的部署,将单体的存储拆分为“微服务化”的存储,即每个应用在声明PV的时候才会创建存储,并与PV的生命周期一样都是独立于应用的。
OpenEBS的存储也是分控制平面和数据平面的,下图是OpenEBS的架构图。
-图片 - OpenEBS 的存储卷管理
+图片 - OpenEBS 的存储卷管理
黄色部分是OpenEBS的组件(除了kube-dashboard),它是使用Kubernetes的各种原语和CRD来创建的,架构跟Kubernetes本身也很类似。
用户在使用OpenEBS的StorageClass创建PV的时候,OpenEBS会为每个PV创建一个用户管理该PV的Deployment,这个Deployment再来创建存储副本,每个PV的存储副本都可以不同,这取决的用户如何定义的StorageClass。这样就可以将原来的单体存储拆分为微服务化的存储。
上面说到了Operator的一个应用,下面再来看一个我们之前在Kubernetes中部署Hadoop YARN和Spark的例子。
-图片 - Hadoop YARN 迁移到 Kubernetes的示例
-图片 - Spark on Yarn with Kubernetes
+图片 - Hadoop YARN 迁移到 Kubernetes的示例
+图片 - Spark on Yarn with Kubernetes
Kubernetes始于12因素应用的PaaS平台,它是微服务的绝佳部署管理平台,基于它可以应用多种设计模式。它的未来将变成什么样呢?
-图片 - 云原生与12因素应用
+图片 - 云原生与12因素应用
Service Mesh:解决微服务治理问题
Auto Pilot:自动驾驭能力,服务自动扩展,智能运维
@@ -4656,7 +4656,7 @@
为了实现上述的各种能力,急需解决的就是基于Kubernetes的持续集成和发布问题。
当前出现了一系列的基于Kubernetes的CI/CD工具,如Jenkins-x、Gitkube,它提供了从代码提交、自动编译、打包镜像、配置注入、发布部署到Kubernetes平台的一系列自动化流程。
甚至出现了像ballerina这样的云原生编程语言,它的出现就是为了解决应用开发到服务集成之间的鸿沟的。它有以下几个特点。
-图片 - 云原生编程语言
+图片 - 云原生编程语言
使用云原生语义的DSL
注解式配置
@@ -4664,30 +4664,30 @@
支持微服务的治理
要完成云的集成CI/CD,或者用一个词代替来说就是GitOps的需求越来越强烈。
-图片 - Gitkube
+图片 - Gitkube
Kubernetes没有做什么
看下这张图中的两个服务,它们使用的是kube-proxy里基于iptables的原生的负载均衡,并且服务间的流量也没有任何控制。
-图片 - Kuberentes中的流量管理
+图片 - Kuberentes中的流量管理
Kubernetes缺少的最重要的一个功能就是微服务的治理,微服务比起单体服务来说使得部署和运维起来更加复杂,对于微服务的可观测性也有更高的要求,同时CI/CD流程Kubernetes本身也没有提供。
Service Mesh
Service Mesh是一个专用的基础设施层,它能够将微服务的治理层应用层下沉到基础设施层,将原来开发人员很多活给分担出去,让开发人员更注重业务逻辑和应用的性能本身,将服务治理的能力交给平台来解决。使用Service Mesh能够提供安全的服务间通讯、在服务间通讯应用各种策略实现灰度发布、流量切分等功能,它还能适配多语言,让微服务应用无感知的迁移到云原生。
这是Istio在Kubenetes中创建的各种CRD,这些CRD有些是作为路由策略、有些是做监控指标和权限控制的。
这是Istio Service Mesh的架构图。
-图片 - Istio Service Mesh架构图
+图片 - Istio Service Mesh架构图
Pilot:提供用户接口,用户可以通过该接口配置各种路由规则,Pilot还可以通过适配器获取平台上各种服务之间的管理,Evnoy这个使用Sidecar方式部署到每个应用pod中的进程会通过Pilot中的Envoy API获得平台上各个服务之间的管理,同时也会应用用户配置的路由规则。
Mixer:获取各种平台属性,服务间通讯时会先访问Mixer兼容各平台的属性信息,如quota、访问控制和策略评估,将服务间的访问信息记录后上报到mixer形成遥测报告。
每个Pod上还有SA和SPIFFE做权限管控。
Service Mesh实际上为了解决社会分工问题,它本身是为了解决微服务的治理。
-图片 - Service Mesh架构
+图片 - Service Mesh架构
Pilot和控制平面是为了运维人员准备的。
数据平面是为开发人员准备的。
Isito在每个上下游服务之间部署一个Envoy,Envoy中有几个基本的服务发现服务,监听器即Envoy要转发的流量端口,Endpoint是要转发的目的地,Cluster是一系列Endpoint用来做负载均衡,Route是定义各种路由规则,每个Envoy进程里可以设置多个Listener。
-图片 - Envoy proxy架构图
+图片 - Envoy proxy架构图
本文根据 Jimmy Song 于2018年5月20日在第四届南京全球技术周 上【互联网技术专场】上的题为【云原生应用的下一站】的演讲的部分内容的文字整理而成。
@@ -4731,7 +4731,7 @@
diff --git a/cloud-native/trait.html b/cloud-native/trait.html
index e27e22ca5..eff789b05 100644
--- a/cloud-native/trait.html
+++ b/cloud-native/trait.html
@@ -4610,7 +4610,7 @@
The Open Application Model specification - github.com
@@ -4654,7 +4654,7 @@
diff --git a/cloud-native/workload.html b/cloud-native/workload.html
index 0bf9706a0..1ebb8d20a 100644
--- a/cloud-native/workload.html
+++ b/cloud-native/workload.html
@@ -4596,7 +4596,7 @@
The Open Application Model specification - github.com
@@ -4640,7 +4640,7 @@
diff --git a/images/cloud-native-app-model.png b/images/cloud-native-app-model.png
index a7a09484a2aa6935f413789f729859c0df90bc12..9f3919a630404041dbea9ec1a014bc8269243ddb 100644
GIT binary patch
literal 57262
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