Huabing Blog

码农漫游记:硅谷探秘

硅谷,计算机从业者的圣殿,全球高科技创新的摇篮。硅谷神秘面纱下的工作和生活到底是怎样的? 本文将以我自己 — 一个普通“码农”的视角来记录在硅谷日常生活的一些点点滴滴。 前言:硅谷我以前来过多次,但多是一周左右的短途差旅。一般这种商务旅行除了工作之外只有一个周末的自由活动时间,因此之的硅谷之行都只是走马观花,浮光掠影的匆匆过客之旅。 这次公司让我到硅谷来工作一段时间,和美国的同事进行交流,并支持我目前手头上一个项目的美国客户。我会在硅谷待两三个月左右。由于这次待的时间较长,一个人除了工作之外也没有其他太多的事情可干,我打算趁这个机会体验一下硅谷的生活,并在这篇文章中记录下来(本文内容将在硅谷期间陆续完成)。 目录(随时更新中…) 何以为家?硅谷的住宿与房产 我租住的 Airbnb Milpitas 市的房产 Airbnb 室友的故事 我的 Tesla 室友被裁员了! 硅谷的周末无聊吗?自行车骑行和徒步旅行(待补充) 硅谷的印度人比中国人更成功?聊聊我认识的印度人(待补充) 何以为家?硅谷的住宿与房产 我租住的 Airbnb 这次来硅谷准备待的时间长,长期居住肯定涉及到做饭,洗衣等生活上的问题。如果住酒店,这么长的时间成本也比较高。考虑到生活上的便利性和成本,我在 Airbnb 上找了一个房子。这个房子位于硅谷的 Milpitas 市,离我公司在硅谷的办公室 3 英里左右,附近走路10分钟距离内有餐馆和超市,交通也比较方便。房东是一对华人母女,我看了 Airbnb 上的评价,感觉还不错,于是就预定了这个房子。 房子是一个三层的独栋小楼,一楼有一间卧室,杂物间和车库,二楼是厨房和起居室,三楼有三间卧室。我租住的房间在三楼,里面比较小,大概十来平米,但好在二楼的起居室很宽敞,除了睡觉的时间以外,我可以在那里工作和休息。 我租住的 Airbnb House (房子的地址和房间内的图片在 Airbnb 上也查得到,因此不涉及隐私问题) 这个房子离 Tesla 的办公室不远,除了我之外还有另外两个 Tesla 的租客。 二楼的厨房,配备了燃气灶,烤箱,微波炉,冰箱,洗碗机等完善的厨房设备,还有刀具,锅碗瓢盆等厨房用具。硅谷的生活成本很高,吃饭在外面很贵,所以我一般会在附近的超市买食材回来自己做饭。 厨房旁边是起居室,有沙发,茶几,电视,还有一个小阳 …

Which One is the Right Choice for the Ingress Gateway of Your Service Mesh?

By default, in a Kubernetes cluster with the Istio service mesh enabled, services can only be accessed inside the cluster. However, some of the services may need to be exposed to external networks as well. Kubernetes and Istio provide a variety of means to get external traffic into your cluster including NodePort, LoadBalancer, Kubernetes Ingress and Istio Gateway. With all these options, which one should be the right choice for your service mesh running in production? I will compare all the available options, dig into the technical details, and provide a workable solution at the end of this article. Hopefully, it could be useful for your service mesh production. Note: To better understand this article, you may need to know some Kubernetes and Istio background knowledge in advance, such as Pod, Service, NodePort, LoadBalancer, Ingress, Gateway and VirtuanlService. In case that you’re not familar with these concepts, you can still continue reading and refer to the links at the end …

一文带你彻底厘清 Isito 中的证书工作机制

在上一篇文章一文带你彻底厘清 Kubernetes 中的证书工作机制中,我们介绍了 Kubernetes 中证书的工作机制。在这篇文章中,我们继续探讨 Istio 是如何使用证书来实现网格中服务的身份认证和安全通信的。 本文是对 Istio 认证工作机制的深度分析,假设读者已经了解 Service Mesh 以及 Istio 的相关基础概念,因此在本文对此类基础概念不再解释。对于 Istio 不熟悉的读者,建议先阅读 Istio 官方网站上的的这篇基础介绍 What is Istio?。 Istio 安全架构 Istio 为微服务提供了无侵入,可插拔的安全框架。应用不需要修改代码,就可以利用 Istio 提供的双向 TLS 认证实现服务身份认证,并基于服务身份信息提供细粒度的访问控制。Istio 安全的高层架构如下图所示: 图1. Istio Security Architecture,图片来源istio.io 图中展示了 Istio 中的服务认证和授权两部分内容。让我们暂时忽略掉授权部分,先关注认证部分。服务认证是通过控制面和数据面一起实现的: 控制面:Istiod 中实现了一个 CA (Certificate Authority,证书机构) 服务器。该 CA 服务器负责为网格中的各个服务签发证书,并将证书分发给数据面的各个服务的边车代理。 数据面:在网格中的服务相互之间发起 plain HTTP/TCP 通信时,和服务同一个 pod 中的边车代理会拦截服务请求,采用证书和对端服务的边车代理进行双向 TLS 认证并建立一个 TLS 连接,使用该 TLS 连接来在网络中传输数据。 控制面证书签发流程 图1是对 Istio 安全架构的一个高度概括的描述,让我们把图1中控制面的交互展开,看一下其中的细节。 图2. Istio 证书分发流程 我们先暂时忽略图中右边蓝色虚线的部分(稍后会在 控制面身份认证 部分讲到),图中左半部分描述了 Istio 控制面向 Envoy 签发证书的流程: Envoy 向 pilot-agent 发起一个 SDS (Secret Discovery Service) 请求,要求获取自己的证书和私钥。 Pilot-agent 生成私钥和 CSR (Certificates Signing Request,证书签名请求),向 Istiod 发送证 …

Envoy Gateway Policies: Unlocking the Full Power of Envoy Proxy for API Gateways

This presentation will delve into Envoy Gateway’s API extensions: ClientTrafficPolicy, BackendTrafficPolicy, SecurityPolicy, and EnvoyExtensionPolicy. We’ll explore their practical applications in managing and securing edge traffic, showcasing advanced features like JWT authorization, rate limiting, OIDC integration, external processing, and WASM plugins. Videos YouTube Slides

Programming Assignment: Scrooge Coin

This series of articles are my notes of “Bitcoin and Cryptocurrency Technologies” online course. Finally, I got to the most exciting part of week 1 lectures-the programming assignment! I’m supposed to submit the assignment earlier because it was due a few weeks ago, however, I’d like to keep my pace relatively slow. I can’t invest my full time to this course because I have a job to do, so I only take this course in my spare time. I also would like to digest all the information in one lesson before moving on to the next. Some fundamental technologies such as hash function, hash pointer, blockchain, Merkel tree and digital signature have been well-explained in week 1 lectures. In order to better understand these technologies, I also did some searches and programming practices, which can be found in my previous posts. It turns out that writing posts on my blog is a better way to learn, I have to fully understand the lessons before I can explain them in my …

Istio实战系列-Envoy Proxy构建分析

Istio由控制面和数据面组成。其中Envoy是Istio在数据面缺省使用的转发代理,Istio利用Envoy的四层和七层代理功能对网格中微服务之间的调用流量进行转发。今天我们来分析一下Istio 使用到的Envoy构建流程。 https://github.com/istio/proxy 这个库中包含了Istio对Envoy的扩展,包括用于对接Mixer的Filter和安全认证的Filter。但这个库中并不包含Envoy自身的源代码,因此这个库在构建时会从Github上下载Envoy源码进行联合编译。 编译工具 Envoy采用了Bazel进行构建。 Bazel是一种高层构建语言,类似Make,Maven和Gradle。其特点是可读性较好,支持跨语言,跨平台编译;并且可以定义代码库之间的依赖关系,支持跨代码库的联合构建。Bazel定义构建的依赖关系和规则,并管理构建生成的临时文件及二进制文件,具体的编译工作是调用各个语言的编译工具如GCC, JAVAC等完成的。 为了理解Envoy的编译过程,我们需要先了解Bazel的几个基础概念 workspace: 文件系统中的一个目录,该目录中包含了用于编译软件所需的所有源文件。每个工作空间中有一个WORKSPACE文件,该文件用于描述该工作空间的外部依赖,例如依赖的Github上的第三方代码。 Package: 是一组用于相关文件的集合,该目录中包含一个BUILD文件,此文件中描述了该程序包的构建方式。 target: 生成的目标,一般是一个lib或者二进制文件。 target是一个构建规则(build rule)的实例,一般包含构建所需的源文件,构建目标的名称。rule还可以嵌套,一个rule的输出文件可以作为另一个rule的输入文件。例如一个二进制文件编译的target可以依赖另一个target生成的lib。另外target还可以依赖外部Repository中的另一个target,这个外部Repository可以是文件系统上另一个文件夹下的项目,github的项目或者http下载的代码。外部Repository在WORKSPACE文件中进行定义。 编译Envoy 首先参考Bazel的官方文档安装Bazel,并且需要安装gcc等相关工具。 设置gcc及g++环境变量 export CC=/usr/bin/gcc-5; …

Hugo Theme: CleanWhite

Clean White Theme for Hugo CleanWhite is a clean, elegant, but fully functional blog theme for Hugo. Here is a live demo site using this theme. It is based on huxblog Jekyll Theme and Clean Blog Jekyll Theme. These two upstream projects have done awesome jobs to create a blog theme, what I’m doing here is porting it to Hugo, of which I like the simplicity and the much faster compiling speed. Some other features which I think could be useful, such as site search with algolia and proxy for Disqus access in China, have also been built in the CleanWhite theme. Other fancy features of upstream projects are not supported by this Hugo theme, I’d like to make it as simple as possible and only focus on blog purpose, at least for now. While I created this theme, I followed the Hugo theme best practice and tried to make every part of the template as a replaceable partial html, so it could be much easier for you to make your customization based on it. Screenshots Home Post Search …

Istio 运维实战系列(3):让人头大的『无头服务』-下

本系列文章将介绍用户从 Spring Cloud,Dubbo 等传统微服务框架迁移到 Istio 服务网格时的一些经验,以及在使用 Istio 过程中可能遇到的一些常见问题的解决方法。 失败的 Eureka 心跳通知 在上一篇文章中,我们介绍了 Headless Service 和普通 Service 的区别。由于 Headless Service 的特殊性,在 Istio 下发给 Envoy Sidecar 的配置中,此类服务的配置参数和其他服务的参数有所有不同。除了我们上次遇到的 mTLS 故障之外,这些差异可能还会导致应用出现一些其他意想不到的情况。 这次遇到的问题现象是:在 Spring Cloud 应用迁移到 Istio 中后,服务提供者向 Eureka Server 发送心跳失败。 备注:Eureka Server 采用心跳机制来判定服务的健康状态。服务提供者在启动后,周期性(默认30秒)向Eureka Server发送心跳,以证明当前服务是可用状态。Eureka Server在一定的时间(默认90秒)未收到客户端的心跳,则认为服务宕机,注销该实例。 查看应用程序日志,可以看到 Eureka 客户端发送心跳失败的相关日志信息。 2020-09-24 13:32:46.533 ERROR 1 --- [tbeatExecutor-0] com.netflix.discovery.DiscoveryClient : DiscoveryClient_EUREKA-TEST-CLIENT/eureka-client-544b94f967-gcx2f:eureka-test-client - was unable to send heartbeat! com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server at com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient.execute(RetryableEurekaHttpClient.java:112) ~[eureka-client-1.9.13.jar!/:1.9.13] …

深入理解 Istio Metrics

Istio 为 Service Mesh 中的微服务提供了非常丰富的统计指标(Metrics),这些指标可以让运维人员随时监控应用程序中服务的健康状况,在系统出现线上故障之前就发现潜在问题并进行处理。本文将介绍 Istio Metrics 的实现机制,以帮助读者深入了解其原理。 备注:本文中 Stats 和 Metrics 均指统计指标;Tag 和 Label 均指统计指标中数据所带的标签,这些是 Envoy 和 Istio 对同一概念的不同称呼。 Envoy Stats Istio Metrics 是基于 Envoy Stats 机制进行扩展而实现的。要理解 Istio Metrics 的实现机制,我们需要先了解 Envoy Stats。Envoy Stats (Statistics 的缩写,即统计数据) 是 Envoy 中的一个公共模块,为 Envoy 中的各种 filter(如 HCM,TCP Proxy 等)和 Cluter 输出详尽的统计数据。 Envoy Stats 类型 Envoy 提供了三种类型的 stats: Counter:Counter 是一个只增不减的计数器,可以用于记录某些事情的发生次数,例如请求的总次数。只要不重置该计数器,请求总数的数量只会向上增长,越来越大。 例如下面的 envoy_cluster_upstream_rq_total 指标记录了 echo-service 这个 cluster 的处理的 HTTP 请求总数。 # TYPE counter envoy_cluster_upstream_rq_total{envoy_cluster_name="echo-service"} 2742 Gauges:Gauges 是一个数值可以变大或者变小的指标,用于反应系统的当前状态,例如当前的活动连接数。 例如下面的 envoy_cluster_upstream_cx_active 指标记录了 echo-service 这个 cluster 当前的活动链接数。当前活动链接数随着接入客户端和并发请求数量的变化而变化,可能增大,也可能变小。 # TYPE envoy_cluster_upstream_cx_active gauge …

Nginx开源Service Mesh组件Nginmesh安装指南

前言 Nginmesh是NGINX的Service Mesh开源项目,用于Istio服务网格平台中的数据面代理。它旨在提供七层负载均衡和服务路由功能,与Istio集成作为sidecar部署,并将以“标准,可靠和安全的方式”使得服务间通信更容易。Nginmesh在今年底已经连续发布了0.2和0.3版本,提供了服务发现,请求转发,路由规则,性能指标收集等功能。 备注:本文安装指南基于Ubuntu 16.04,在Centos上某些安装步骤的命令可能需要稍作改动。 安装Kubernetes Cluster Kubernetes Cluster包含etcd, api server, scheduler,controller manager等多个组件,组件之间的配置较为复杂,如果要手动去逐个安装及配置各个组件,需要了解kubernetes,操作系统及网络等多方面的知识,对安装人员的能力要求较高。kubeadm提供了一个简便,快速安装Kubernetes Cluster的方式,并且可以通过安装配置文件提供较高的灵活性,因此我们采用kubeadm安装kubernetes cluster。 首先参照kubeadm的说明文档在计划部署kubernetes cluster的每个节点上安装docker,kubeadm, kubelet 和 kubectl。 安装docker apt-get update apt-get install -y docker.io 使用google的源安装kubelet kubeadm和kubectl apt-get update && apt-get install -y apt-transport-https curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - cat <<EOF >/etc/apt/sources.list.d/kubernetes.list deb http://apt.kubernetes.io/ kubernetes-xenial main EOF apt-get update apt-get install -y kubelet kubeadm kubectl 使用kubeadmin安 …

旅行记录

“Do not go gentle into that good night” 尘埃落地之前,去看看这世界。 In-N-Out Burger - Milpitas, USA, 2024.05 In-N-Out 是加州才有的快餐连锁店,加州人对 In-N-Out 有着特殊的感情。在疫情之后,其他的快餐店都涨价了,In-N-Out 仍然保持着之前的价格,并且其食材新鲜,口味独特,是加州人的最爱。其装修风格也很有特色,简洁明快的红白色调,再加上墙上加州风格的装饰画,让人感觉心情愉悦。 雕像:在图书馆前玩耍的孩子们 - Milpitas 图书馆,Milpitas,美国,2024.05 在图书馆里阅读一本童话,在草地上和小伙伴一起嬉闹,无忧无虑的童年是最美好的时光。 Rubin 拿着刚为我组装的滑板 - Santa Cruz,美国,2024.05 Rubin 在 35 年前创立了这家 SkateWorks 滑板店,他从 5 岁开始玩滑板,现在已经快 75 了,看来滑板是保持健康的不二秘诀。 无名礁石 - Santa Cruz,美国,2024.05 大自然是最耐心的雕刻家,以海浪为刻刀,用千百年的时间将礁石打磨成各种奇妙的形状。 冲浪的情侣 - Santa Cruz,美国,2024.05 Santa Cruz 是加州最著名的冲浪胜地之一,这对情侣正在准备下海冲浪。 金门大桥 - 旧金山,美国,2023.11 巨大的红色桥塔横跨在桥面上,如同一个昂首阔步的巨人。 唐人街 - 旧金山,美国,2023.11 传奇武术大师李小龙在旧金山留下的印记至今仍然清晰可见。 芝加哥 - 芝加哥,美国,2023.11 芝加哥是美国很少的几个有摩天大楼的城市之一,这里的建筑风格独具特色,具有强烈的现代感。 雅女湖 - 四川,眉山 2024.01 清晨的湖面平静如镜,湖边的树木和远处的瓦屋山倒影在湖中,如同一幅水墨画。 穿藏族服装的少女 - 理塘,甘孜,2022.08 青春的少女穿着藏族服装,背景是一片蓝天白云,仿佛置身于天空之城。 兴伊措 - 227国道稻城和理塘之间,甘孜,2022.08 开车途经一段异常崎岖,遍地石头的路段,突然开阔起来,一片湖泊映入眼帘,湖水清澈见底,周围群山环绕,仿佛置身于仙境。 香格里拉圣路 - 227国道稻城和理塘之间,甘孜,2022.08 前方黑色的云层中正酝酿着一场 …

Envoy Gateway OIDC Authentication & Authorization Demo

In this demo, I’ll walk you through how to use Envoy Gateway’s SecurityPolicy to enforce OIDC authentication and authorization, using Amazon Cognito as the identity provider. You’ll learn how to: Set up Envoy Gateway in your Kubernetes cluster Configure a Gateway + HTTPRoute for HTTPS traffic Attach a SecurityPolicy to protect backend services Validate JWT tokens and apply fine-grained access control 🎯 Everything is handled at the gateway layer — your backend stays clean and simple. 📦 Try the demo yourself in 5 minutes: https://github.com/zhaohuabing/kubecon-envoy-gateway-securitypolicy 📺 Watch the full demo on YouTube:

Introduce MetaProtocol Proxy: A Layer-7 Proxy Framework Powered by Envoy

Even with Envoy’s powerful filter extension mechanism, writing a proxy for none-http protocols from scratch can be challenging. MetaProtocol Proxy solves this by abstracting layer-7 proxy with a concept called metadata and providing a “batteries included” framework that includes common traffic management capabilities: load balancing, circuit breaker, routing, rate limiting, fault injection, observability, etc. To write a layer-7 proxy for a new protocol, the only thing you need to do is implementing the codec interface. Videos Bilibili YouTube

Linux Tun/Tap 介绍

什么是Tun/Tap 在计算机网络中,TUN与TAP是操作系统内核中的虚拟网络设备。不同于普通靠硬件网路板卡实现的设备,这些虚拟的网络设备全部用软件实现,并向运行于操作系统上的软件提供与硬件的网络设备完全相同的功能。 TAP等同于一个以太网设备,它操作第二层数据包如以太网数据帧。TUN模拟了网络层设备,操作第三层数据包比如IP数据封包。 操作系统通过TUN/TAP设备向绑定该设备的用户空间的程序发送数据,反之,用户空间的程序也可以像操作硬件网络设备那样,通过TUN/TAP设备发送数据。在后种情况下,TUN/TAP设备向操作系统的网络栈投递(或“注入”)数据包,从而模拟从外部接受数据的过程。 应用程序如何操作Tun/Tap Linux Tun/Tap驱动程序为应用程序提供了两种交互方式:虚拟网络接口和字符设备/dev/net/tun。写入字符设备/dev/net/tun的数据会发送到虚拟网络接口中;发送到虚拟网络接口中的数据也会出现在该字符设备上。 应用程序可以通过标准的Socket API向Tun/Tap接口发送IP数据包,就好像对一个真实的网卡进行操作一样。除了应用程序以外,操作系统也会根据TCP/IP协议栈的处理向Tun/Tap接口发送IP数据包或者以太网数据包,例如ARP或者ICMP数据包。Tun/Tap驱动程序会将Tun/Tap接口收到的数据包原样写入到/dev/net/tun字符设备上,处理Tun/Tap数据的应用程序如VPN程序可以从该设备上读取到数据包,以进行相应处理。 应用程序也可以通过/dev/net/tun字符设备写入数据包,这种情况下该字符设备上写入的数据包会被发送到Tun/Tap虚拟接口上,进入操作系统的TCP/IP协议栈进行相应处理,就像从物理网卡进入操作系统的数据一样。 Tun虚拟设备和物理网卡的区别是Tun虚拟设备是IP层设备,从/dev/net/tun字符设备上读取的是IP数据包,写入的也只能是IP数据包,因此不能进行二层操作,如发送ARP请求和以太网广播。与之相对的是,Tap虚拟设备是以太网设备,处理的是二层以太网数据帧,从/dev/net/tun字符设备上读取的是以太网数据帧,写入的也只能是以太网数据帧。从这点来看,Tap虚拟设备和真实的物理网卡的能力更接近。 下图描述了Tap/Tun的工作原理: 使用Tun/Tap …

Istio Ambient 模式流量管理实现机制详解(二)

ambient 模式中,应用 pod 通过 ztunnel 之间的安全通道进行通信。要实现这一点,Istio 需要劫持应用 pod 的 outbound 和 inbound 流量,并转发到 ztunnel 进行处理。这是如何实现的呢? Istio 采用了 iptables 规则和策略路由(Policy-based Routing)来将应用 pod 的流量转发到 ztunnel。下面我们以 初探 Istio Ambient 模式 中安装的 demo 为例来详细介绍 ambient 模式是如何对流量进行劫持,并转发到 ztunnel 中的。 实验环境 实验环境采用了 kind 来安装 k8s 集群,集群中有三个 node,如下所示: ~ k get node NAME STATUS ROLES AGE VERSION ambient-control-plane Ready control-plane 4d9h v1.25.0 ambient-worker Ready <none> 4d9h v1.25.0 ambient-worker2 Ready <none> 4d9h v1.25.0 备注:kind 使用一个 container 来模拟一个 node,在 container 里面跑 systemd ,并用 systemd 托管 kubelet 以及 containerd,然后通过容器内部的 kubelet 把其他 K8s 组件,比如 kube-apiserver、etcd、CNI 等跑起来。 在 ambient-worker2 这个 node 中运行了下面这些应用 pod。 ~ k get pod -ocustom-columns=NAME:.metadata.name,IP:.status.podIP,NODE:.spec.nodeName|grep ambient-worker2 productpage-v1-7c548b785b-mhjm6 10.244.2.3 ambient-worker2 ratings-v1-85c74b6cb4-t4pq6 10.244.2.2 ambient-worker2 reviews-v1-6494d87c7b-jnjcl 10.244.2.7 ambient-worker2 …

Tencent Music’s service mesh practice with Istio and Aeraki(Istio + Aeraki 在腾讯音乐的服务网格落地)

IstioCon 介绍 IstioCon 是 Istio 社区一年一度举行的全球线上峰会,此次峰会包含主题演讲、技术演讲、闪电演讲、研讨会和路线图会议等多种形态,聚焦社区新特性、生产落地案例、动手实战、社区生态发展等话题。 分享主题简介 This session will introduce Tencent music’s service mesh practice with Istio and Aeraki. Including: How to extend Istio with Aeraki to manage the traffic of proprietary protocols Deep dive into Aeraki and MetaProtcol Proxy How Tencent Music leverage Istio and Aeraki to build a fully functional service mesh, managing both the HTTP and proprietary protocols 本场分享将介绍腾讯音乐使用 Istio + Aeraki 的服务网格落地实践,主要包含下述内容: 如何利用 Aeraki 来扩展 Istio 的协议扩展能力 Aeraki 和 MetaProtocol Proxy 的原理介绍 腾讯音乐如何使用 Istio + Aeraki 来构建一个管理 HTTP 和私有协议的全功能服务网格 References: Aeraki: https://aeraki.net Github: https://github.com/aeraki-mesh Tencent Music: https://www.tencentmusic.com 活动链接 Istiocon 官网链接 演讲稿 pdf 下载 视频回放 B站 YouTube

How service mesh can help during the ONAP Microservice journey

ONAP Beijing is available now! ONAP, as part of LF Networking, now accounts for more than 65% of global subscriber participation through carriers creating a harmonized, de-facto open source platform. While it’s so exciting to see that more operators are deploying ONAP in their commercial network, ONAP community realizes that there are still somewhere we can improve to smooth the deployment process. For example, instead of deploying ONAP as a whole, users may just want to pick some modules, integrate these modules with their existing system to get a customized ONAP solution. Actually, this is a very usual usage scenario in open source world. So it should be easy to tailor ONAP to suit the different scenarios and purposes for various users. To reflect these requirements, According to ONAP Casablanca Developer Event this week in Beijing, China, ONAP is planning enhancements for Casablanca release towards a more mature architecture, which will be modular, mode-drive, and …

Istio Ambient 模式流量管理实现机制详解(一)

Istio ambient 模式采用了被称为 HBONE 的 方式来连接 ztunnel 和 waypoint proxy。HBONE 是 HTTP-Based Overlay Network Environment 的缩写。虽然是一个新的名词,但其实 HBONE 并不是 Istio 创建出来的一个新协议,而只是利用了 HTTP 协议标准提供的隧道能力。简单地说,ambient 模式采用了 HTTP 的 CONNECT 方法 在 ztunnel 和 waypoint proxy 创建了一个隧道,通过该隧道来传输数据。本文将分析 HBONE 的实现机制和原理。 HTTP 隧道原理 建立 HTTP 隧道的常见形式是采用 HTTP 协议的 CONNECT 方法。在这种机制下,客户端首先向 HTTP 代理服务器发送一个 HTTP CONNECT 请求,请求中携带需要连接的目的服务器。代理服务器根据该请求代表客户端连接目的服务器。和目的服务器建立连接后,代理服务器将客户端 TCP 数据流直接透明地传送给目的服务器。在这种方式中,只有初始连接请求是 HTTP,之后代理服务器处理的是 TCP 数据流。 HTTP CONNECT 隧道 通过这种方法,我们可以采用 HTTP CONNECT 创建一个隧道,该隧道中可以传输任何类型的 TCP 数据。 假设我们有一个运行在 127.0.0.1 的 10080 端口的 HTTP 代理服务器,我们想通过该代理服务器连接到外部的服务器 httpbin.org 的 80 端口。我们可以使用 Telnet 来模拟这个过程。 首先通过 Telnet 连接到代理服务器。 telnet 127.0.0.1 10080 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. 接下来发送 HTTP CONNECT 请求,请求代理服务器连接到 httpbin.org 的 80 端口。 CONNECT httpbin.org HTTP/1.1 如果代理允许连接,它将返回一个 HTTP 200 响应,表示已经和远程主机建立了连接。 HTTP/1.1 200 Connection established 现在客户端就可以通过代理访问远程主机。 发送到代理服务器的所有数 …

Envoy 源码流程图

最近在实现 MetaProtocol 时阅读了 Envoy 相关的一些源码。这里将一些重要流程的时序图记录下来,以备后续查看。 TCP Proxy TCP Proxy 时序图 Dubbo Proxy Dubbo Proxy 时序图 RDS RDS(路由发现服务)的代码包括下面三个主要的流程: 订阅 RDS 执行线程:Main Thread 工作流程:RDS 订阅是在 HCM 配置工厂类中处理的,详细流程如下: Envoy 在初始化 Network Filter Chain 时调用 HttpConnectionManagerFilterConfigFactory 的 createFilterFactoryFromProtoTyped 方法。 该方法中会创建一个 RouteConfigProviderManager 对象。代码中只会创建一个单实例,所有的 HCM 初始化过程会共用一个 RouteConfigProviderManager Singleton 对象。由于所有 HCM 初始化都是在 Main Thread 中进行的,因此对该 Singleton 的访问不会存在并发冲突。(相关代码) 根据 HCM 的路由配置是 RDS 还是静态配置,分别创建 RdsRouteConfigProvider 或者 StaticRouteConfigProvider (相关代码)。该方法中会创建一个 RdsRouteConfigSubscription 对象,该对象负责具体的订阅逻辑,然后再以 RdsRouteConfigSubscription 作为参数来创建 RdsRouteConfigSubscription。注意这里 RdsRouteConfigProvider 实例是和 RDS 配置的 hash 值一一对应的,同样的 RDS 配置(即 config_source 和 route_config_name 相同),只会创建一个 RdsRouteConfigProvider,以避免多个 HCM 重复订阅相同的 RDS。如果一个 RDS 配置对应的 RdsRouteConfigProvider 已经存在,会将已有的 RdsRouteConfigProvider 返回给 HCM 。即多个 HCM 配置的 RDS 相同的话,会共用一个 RdsRouteConfigProvider 实 …

在 Istio 中实现 Redis 集群的数据分片、读写分离和流量镜像

Redis 是一个高性能的 key-value 存储系统,被广泛用于微服务架构中。如果我们想要使用 Redis 集群模式提供的高级特性,则需要对客户端代码进行改动,这带来了应用升级和维护的一些困难。利用 Istio 和 Envoy ,我们可以在不修改客户端代码的前提下实现客户端无感知的 Redis Cluster 数据分片,并提供读写分离、流量镜像等高级流量管理功能。 Redis Cluster Redis 的一个常见用途是用作数据高速缓存。通过在应用服务器和数据库服务器之间加入一个 Redis 缓存层,可以减少应用服务器对数据库的大量读操作,避免数据库服务器在大压力下响应缓慢甚至宕机的风险,显著加强整个系统的健壮性。Redis 作为数据缓存的原理如图所示: 在一个小规模的系统中,上图所示的单个 Redis 就可以很好地实现缓存层的功能。当系统中需要缓存的数据量较大时,一个 Redis 服务器无法承担所有应用服务器的缓存需求;同时单个 Redis 实例失效时也会导致大量读请求被直接发送到后端的数据库服务器上,导致数据库服务器瞬时压力超标,影响系统的稳定性。我们可以采用 Redis Cluster 来对缓存数据进行分片,将不同的数据放到不同的 Redis 分片中,以提高 Redis 缓存层的容量能力。在每个 Redis 分片中,还可以采用多个 replica 节点对缓存的读请求进行负载分担,并实现 Redis 的高可用。采用了 Redis Cluster 的系统如下图所示: 从图中可以看到,在 Redis Cluster 模式下,客户端需要根据集群的分片规则将不同 key 的读写操作发送到集群中不同的 Redis 节点上,因此客户端需要了解 Redis Cluster 的拓扑结构,这导致我们无法在不修改客户端的情况下将一个使用 Redis 独立节点模式的应用平滑迁移到 Redis Cluster 上。另外,由于客户端需要了解 Redis Cluster 的内部拓扑,也将导致客户端代码和 Redis Cluster 运维上的耦合,例如要实现读写分离或者流量镜像的话,就需要修改每个客户端的代码并重新部署。 这种场景下,我们可以在应用服务器和 Redis Cluster 之间放置一个 Envoy 代理服务器,由 Envoy …