阿里巴巴 Kubernetes 能力再获 CNCF 认可 | 云原生生态周报 Vol. 32

alicloudnative阅读(2178)评论(0)

作者 | 丁海洋  陈有坤 李鹏  孙健波

业界要闻

  1. 阿里巴巴 Kubernetes 技术能力再获 CNCF 认可

CNCF 官网发布博文《Demystifying Kubernetes as a Service – How Alibaba Cloud Manages 10,000s of Kubernetes Clusters》。这篇长文从为什么需要超大数量的 K8s 集群,以及如何高效的管理这些集群出发,系统介绍了 Alibaba 在 Kubernetes 上取得的成绩。

  1. GitHub 欲在中国设立子公司

今年早些时候传出多起 Github 封锁伊朗、叙利亚、克里米亚等地区的 Github 账号,加上目前中美贸易战的大背景,Github 背后的微软需要为很多可能性进行准备。一个问题是:中国子公司真的可以在贸易战白热化的时候帮助微软和中国开发者吗?无论如何,多年来开源运动对当前 IT 技术的贡献大家有目共睹,而 Github(依然)是聚集开发者最好的平台,我想每一个负责任的开发者,无论国籍,都应该好好思考未来可能会如何,做好应对。

上游重要进展

Kubernetes

目前 K8s apiserver 还是从硬盘读取 service account 的 keys,并在运行时保存在内存中。鉴于现在 apiserver 已经支持验证和发布 projected volume tokens,我们可以考虑开始通过 API 支持外部签发和校验 token。

CSR(CertificateSigningRequest)支持多 signer。

Knative

Knative v0.11.0 版本已于 12 月 10 号正式发布,下面两篇文章将对新版本进行解读,让你快速对 v0.11.0 版本有所了解:

 

Istio

Istio1.5 开发中,计划一月中 code freeze , 二月中发布。

  • 备受瞩目的 Mixer v2 正在紧锣密鼓地开发中:其中使用 V8 的 Telemetry v2 预计将在 1.5 版本中达到 alpha 状态;
  • 引入更好的传输安全:Istio 使用 mTLS 在网格内的工作负载之间提供传输安全性。但是目前 Istio 的某些架构选择导致了相当大的实现复杂性、设计混乱和协议冲突。这个 Proposal 指出了一些现有的难题,并探讨可能的解决方案。

其他内容更新:

  • 社区新提出的 Istio meta API ,用于支持 Envoy 协议路由:提供 Envoy 的 Extensions,其中 protocol filter 的作者仅解析 metadata(headers),并作为 attributes 公开给框架;而框架可以完全基于属性来路由流量,无需了解协议。这个提案目前处于非常早期的讨论中;
  • Istio Config API Versioning Design:从 1.11 开始,Kubernetes 支持在 CustomResourceDefinition(CRD)中指定多个版本。 在 1.15 中,对 Conversion Webhook 的支持处于 beta 状态,预计将在 1.16 中稳定。 Istio API 当前只具备单个版本,随着 Istio 的 API 变得越来越成熟,需要为每个 Istio API 支持多个版本。这将使 Istio 在改进 API 的同时仍能支持可能正在使用旧版 API 的用户。

 

开源项目推荐

  1. ansible/awx

这是 Red Hat 发布的对其内部的 Ansible Tower 系统的开源实现,有兴趣的同学可以去看一下。

  1. oam/admission-controller

一个 Go 语言开发的 K8s Admission Controller 为 OAM 标准 spec 提供转换和校验的功能,该开源项目不仅可以用于 OAM 的 spec 校验,也可以用来学习如何编写一个 K8s Admission Controller。

本周阅读推荐

  1. 《Run Ansible Tower or AWX in Kubernetes or OpenShift with the Tower Operator》

Ansible Tower是Red Hat内部的自动化Ansible平台的核心组件,AWX是Ansible Tower的开源实现,两者的关系类似Fedora和RHEL。这篇文章使用一个Operator来创建和管理试用版的Ansible Tower。

  1. 《Develop a Kubernetes controller in Java》

一篇来自 K8s 官方的 Blog,介绍了如何使用 Kubernetes Java SDK 来开发 Kubernetes Controller。

  1. 《Chaos Engineering: the history, principles and practice》

混沌工程是在大规模复杂系统中寻找问题的最佳实践,这篇文章系统介绍了混沌工程的历史、原则以及实践中需要注意的问题。
https://www.gremlin.com/chaos-engineering/

  1. 《What I learned from Reverse Engineering Windows Containers》

在 Docker 开启容器技术大潮的时候,Windows 是有一点落后的,但不出意外的,微软很快发布了支持 Windows 的容器技术。除了一些官方的文档,关于 Windows container 的技术细节是很少的,本文作者通过 reverse engineering 解析了 Windows 容器在进程、文件调用、系统调用等方面的一些细节,对这方面感兴趣的同事不要错过。

  1. 《Highlights from KubeCon US and Re:Invent 2019 + Live WKP Demo》

Weaveworks 自己总结了一篇 KubeCon US 和 ReInvent: 2019 的一些 highlight,当然也不忘 promote 自己一下,有兴趣的同学可以看看。

  1. 《虚拟化 Pod 性能比裸机还要好,原因竟然是这样!》

VMware 在 VMworld 上宣布的太平洋项目 (Project Pacific)。根据其官博上发布的信息,太平洋项目中通过虚拟化实现的 Native Pods,比物理机(裸机)上 Kubernetes 的 pod 有 8% 的性能提升!这个内容是十分抢眼的,因为不是很符合逻辑。这篇文章解释了这个性能提升的原因,简单的说,就是用好 NUMA。

  1. 《Knative Serverless 之道:如何 0 运维、低成本实现应用托管?》

Knative 作为最流行的应用 Severlesss 编排引擎,其中一个核心能力就是其简洁、高效的应用托管服务。阿里云的工程师在该分享中对此进行了详细的讲解。

阿里巴巴云原生关注微服务、Serverless、容器、Service Mesh 等技术领域、聚焦云原生流行技术趋势、云原生大规模的落地实践,做最懂云原生开发者的技术圈。”

Go 开发关键技术指南 | 为什么你要选择 GO?(内含超全知识大图)

alicloudnative阅读(2592)评论(0)

作者 | 杨成立(忘篱) 阿里巴巴高级技术专家

关注“阿里巴巴云原生”公众号,回复 Go 即可查看清晰知识大图!

导读:从问题本身出发,不局限于 Go 语言,探讨服务器中常常遇到的问题,最后回到 Go 如何解决这些问题,为大家提供 Go 开发的关键技术指南。我们将以系列文章的形式推出《Go 开发的关键技术指南》,共有 4 篇文章,本文为第 1 篇。

Go 开发指南大图

2.png

Overview

该指南主要讨论了服务器领域常见的并发问题,也涉及到了工程化相关的问题,还整理了 C 背景程序员对于 Go 的 GC 以及性能的疑问,探讨了 Go 的错误处理和类型系统最佳实践,以及依赖管理的难处、接口设计的正交性,当然也包含我们在服务器开发中对于 Go 实践的总结,有时候也会对一些有趣的问题做深度的挖掘,列出了 Go 重要的事件和资料集合,以及 Go2 的进展和思考。

以下是各个章节以及简介:

  • About the Name:为何 Go 有时候也叫 Golang?
  • Why Go:为何要选择 Go 作为服务器开发的语言?是冲动?还是骚动?
  • Milestones:Go 的重要里程碑和事件,当年吹的那些牛逼,都实现了哪些?
  • GC:Go 的 GC 靠谱吗?Twitter 说相当的靠谱,有图有真相。
  • Could Not Recover:君可知,有什么 panic 是无法 recover 的?包括超过系统线程限制,以及 map 的竞争写。当然一般都能 recover,比如 Slice 越界、nil 指针、除零、写关闭的 chan 等。
  • Declaration Syntax:为何 Go 语言的声明语法是那样的?C 语言的声明语法又是怎样的?是拍的大腿,还是拍的脑袋?
  • Errors:为什么 Go2 的草稿 3 个中有 2 个是关于错误处理的?好的错误处理应该怎么做?错误和异常机制的差别是什么?错误处理和日志如何配合?
  • Logger:为什么标准库的 Logger 是完全不够用的?怎么做日志切割和轮转?怎么在混成一坨的服务器日志中找到某个连接的日志?甚至连接中的流的日志?怎么做到简洁又够用?
  • Type System:什么是面向对象的 SOLID 原则?为何 Go 更符合 SOLID?为何接口组合比继承多态更具有正交性?Go 类型系统如何做到 looser、organic、decoupled、independent and therefore scalable?
  • Orthogonal:一般软件中如果出现数学,要么真的牛逼,要么就是装逼。正交性这个数学概念在 Go 中频繁出现,是神仙还是妖怪?为何接口设计要考虑正交性?
  • Modules:如何避免依赖地狱(Dependency Hell)?小小的版本号为何会带来大灾难?Go 为什么推出了 GOPATH、Vendor 还要搞 module 和 vgo?新建了 16 个仓库做测试,碰到了 9 个坑,搞清楚了 gopath 和 vendor 如何迁移?以及 vgo with vendor 如何使用(毕竟生产环境不能每次都去外网下载)?
  • Concurrency:服务器中的并发处理难在哪里?为什么说 Go 并发处理优势占领了云计算开发语言市场?什么是 C10K、C10M 问题?
  • Context:如何管理 goroutine 的取消、超时和关联取消?为何 Go1.7 专门将 context 放到了标准库?context 如何使用以及问题在哪里?
  • Engineering:Go 在工程化上的优势是什么?为什么说 Go 是一门面向工程的语言?覆盖率要到多少比较合适?什么叫代码可测性?为什么良好的库必须先写 Example?
  • Go2 Transition:Go2 会像 Python3 不兼容 Python2 那样作吗?C 和 C++ 的语言演进可以有什么不同的收获?Go2 怎么思考语言升级的问题?
  • Documents:Go 官网的重要文档分类,本屌丝读了四遍了,推荐阅读。
  • SRS:Go 在流媒体服务器中的使用。

About the Name

The Go Programming Language 到底是该叫 GO 还是 GOLANG?Google 搜 Why Go is called Golang 能搜到几篇经典帖子。

Rob Pike 在 Twitter 上特意说明是 Go,可以看这个 The language is called Go:

Neither. The language is called Go, not Golang. http://golang.org  is just the the web site address, not the name of the language.

在另外一个地方也说明了是 Go,可以看这个 The name of our language is go

The name of our language is Go
Ruby is called Ruby, not Rubylang.
Python is called Python, not Pythonlang.
C is called C, not Clang. No. Wait. That was a bad example.
Go is called Go, not Golang.

Yes, yes, I know all about the searching and meta tags. Sure, whatever, 
but that doesn't change the fact that the name of the language is Go.

Thank you for your consideration.

这里举了各种例子说明为何不加 lang 的后缀,当然有个典型的语言是加的,就是 Erlang。于是就有回复说“Erlang Erlang, Let’s just call it Er.”

那么为什么大多时候 Go 和 Golang 都很常用呢?在 Why is the Go programming language usually called Golang 中说的比较清楚:

It’s because “go domain” has been registered by Walt Disney and so Go creators couldn’t use it. 
So, they have decided to use golang for the domain name. Then the rest came.

Also, it’s harder to search things on search engines just using the word Go. Although, Rob Pike is 
against this idea but I disagree. Most of the time, for the correct results you need to search for 
golang.

It’s just Go, not golang but it sticked to it.

讲个笑话先,用百度搜下为何 Go 叫做 Golang,一大片都是类似本文的鸡汤煲,告诉你为何 Go 才是天地间最合适你的语言,当然本文要成为鸡汤煲中的战斗煲,告诉你全家都应该选择 Go 语言。

为何 Go 语言名字是 Go,但是经常说成是 Golang 呢?有以下理由:

  1. go.org 被注册了,正在卖,也不贵才 1698 万。所以 Go 只能用 golang.org;
  2. 想要搜点啥信息时,如果搜 go 太宽泛了,特别是 go 还没有这么多用户时,搜 golang 能更精确的找到答案。

为什么在名字上要这么纠结呢?嗯嗯,不纠结,让我们开始干鸡汤吧。

Why Go?

考虑一个商用的快速发展的业务后端服务器,最重要的是什么?当然是稳定性了,如果崩溃可能会造成用户服务中断,崩溃的问题在 C/C++ 服务器中几乎是必然的:

  • 稳定是一种假象;

想象一个 C 服务器,一般不会重头码所有的代码,会从一个开源版本开始,或者从一些网络和线程库开始,然后不断改进和完善。由于业务前期并不复杂,上线也没有发现问题,这时候可以说 C 服务器是稳定的吗?当然不是,只是 Bug 没有触发而已,所有崩溃的 Bug 几乎都不是本次发布导致的。野指针和越界是 C 服务器中最难搞定的狼人,这些狼人还喜欢玩潜伏。

  • 稳定是短暂的,不稳定是必然和长期的;

一般业务会突飞猛进,特别是越偏上层的业务,需要后端处理的逻辑就越多,至于 UTest 和测试一般只存在于传说中,随着业务的发展,潜伏的狼人越来越多,甚至开源的库和服务器中的狼人也开始出来作妖。夜路走多了,总会碰到鬼,碰到鬼了怎么办?当然是遇鬼杀鬼了,还能被它吓尿不成,所以就反思解决 Bug,费了老劲、又白了几根头发,终于迎来短暂安宁,然后继续写 Bug。

  • 最普遍的问题还是内存问题导致崩溃,一般就是野指针和越界;

空指针问题相对很容易查,除零之类的典型错误也容易处理。最完善的解决办法,就是实现 GC,让指针总是有效,无效后再释放,越界时能检测到,这样容易解决问题;其实 Go 早期的版本就和这个很类似了,要实现带 GC 的 C 的同学,可以参考下 Go 的实现。

  • 线上的 CPU 和内存的问题,一般不方便使用工具查看,而线上的问题有时候很难在本地重现。

如何能直接获取线上的 Profile 数据,需要程序本身支持。比如提供 HTTP API 能获取到 Profile 数据,关键是如何采集这些数据。

Go 的使命愿景和价值观:

Go is an open source programming language that makes it easy to build simple, reliable, and efficient software.

Go is a concurrent open source programming language developed at Google. Combines native compilation and static types with a lightweight dynamic feel. Fast, fun, and productive.>

Go is an attempt to make programmers more productive. The first goal is to make a better language to meet the challenges of scalable concurrency. The larger goal is to make a better environment to meet the challenges of scalable software development, software worked on and used by many people, with limited coordination between them, and maintained for years.

Go 语言的关键字:

  • 运行性能高: Statically typed. Native code generation (compiled). Efficiency. Fast development cycle.
  • 码农不苦逼: Memory safe. Garbage collected. Safety.
  • 云计算专享: Native concurrency support. Concurrency. Scalability.
  • 工程师思维: Composition via interfaces. Excellent standard library. Great tools.

参考 The Path to Go1: What is Go? 和 Another Go at Language Design

参考 > Go: a simple programming environment

Go 是面向软件工程的语言,Go 在工程上的思考可以读 Go at Google: Language Design in the Service of Software Engineering 和 Less is exponentially more。Go 最初是解决 Google 遇到的大规模系统和计算的问题,这些问题如今被称为云计算,参考 Go, Open Source, Community

GITHUT上显示 Go 的项目和 PR 一直在上升,如下图所示。

3.png

2014 云计算行业中使用 Go 的有:DockerKubernetes, Packer, Serf, InfluxDB, Cloud Foundry’s gorouter and CLI, CoreOS’s etcd and fleet, Vitess | YouTube’s tooling for MySQL scaling, Canonical’s Juju (rewritten in Go), Mozilla’s Heka, A Go interface to OpenStack Swift, Heroku’s Force.com and hk CLIs, Apcera’s NATS and gnatsd。

2018 年全球使用 Go 的公司数目有:US(329), Japan(79), Brazil(52), India(49), Indonesia(45), China(32), UK(32), Germany(28), Israel(24), France(17), Netherlands(16), Canada (15), Thailand(14), Turkey(14), Spain(12), Poland(11), Australia(9), Russia(9), Iran(8), Sweden(7), Korea(South)(6), Switzerland(6), Ukraine(5)。

参考 Go as the emerging language of cloud infrastructureThe RedMonk Programming Language Rankings: June 2018,还有 GoUsers 以及 Success Stories

参考 > “Go: 90% Perfect, 100% of the time” -bradfitz, 2014。参考 > Nine years of Go: Go Contributors,社区贡献的代码比例。

我们一起看看这些 Go 牛逼的特性,详细分析每个点,虽然不能涵盖所有的点,对于常用的 Go 的特性我们做一次探讨和分析。

Milestones

接下来看一下有关 Go 的重要事件:

  • 2019 年 9 月,Go1.13 发布。增强了 modules,新增了环境变量 GOPRIVATE 和 GOSUMDB,GOPROXY 支持多个,支持了 ErrorWraping;
  • 2019 年 2 月,Go1.12 发布,支持了 TLS1.3,改进了 modules,优化运行时和标准库;
  • 2018 年 8 月,Go1.11 发布,实验性支持 modules,实验性支持 WebAssembly;
  • 2018 年 2 月,Go1.10 发布,go tool 缓存编译,编译加速,很多细微的改进;
  • 2018 年 1 月,Hello, 中国! 及 中国站镜像上线,大陆可以访问官网资源;
  • 2017 年 8 月,Go1.9 发布,支持 Type Alias、sync.Map,使用场景参考 slides,time 保持单增避免时间测量问题;
  • 2017 年 2 月,Go1.8 发布,显著的性能提升,GC 延迟降低到了 10us 到 100us,支持 HTTP/2 Push,HTTP Server 支持 Shutdown,sort.Slice 使排序使用更简单;
  • 2016 年 8 月,Go1.7 发布,支持了 Context,Context 在 K8s 和 Docker 中都有应用,新的编译算法减少 20%-30% 的二进制尺寸;
  • 2016 年 2 月,Go1.6 发布,支持 HTTP/2,HTTPS 时会默认开启 HTTP/2,正式支持 vendor
  • 2015 年 8 月,Go1.5 发布,完全用 Go 代替了 C 代码,完全重新设计和重新实现 GC,支持 internal 的 package,实验性支持 vendor,GOMAXPROCS 默认为 CPU 个数;
  • 2014 年 12 月,Go1.4 发布,支持 Android,从 Mecurial 迁移到了 Git,从 GoogleCode 迁移到了 Github: golang/go,大部分 runtime 的代码从 C 改成了 Go,for 支持三种迭代写法;
  • 2014 年 6 月,Go1.3 发布,支持了 FreeBSD、Plan9、Solaris 等系统;
  • 2013 年 12 月,Go1.2 发布,新增收集覆盖率工具 coverage,限制了最高线程数 ThreadLimit;
  • 2013 年 5 月,Go1.1 发布,主要是包含性能优化,新增 Data Race Detector 等;
  • 2012 年 3 月,Go1.0 发布,包含了基本的语言元素比如 rune、error、map,标准库包括 bufio、crypto、flag、http、net、os、regexp、runtime、unsafe、url、encoding 等;
  • 2009 年 11 月, Google 宣布要开发一门新语言,既要开源,又有 Python 的好处,还要有 C/C++ 的性能。GO 是 BSD 的 License,大部分 GO 的项目都是 BSD 或 MIT 或 Apache 等商业友好的协议。

点击下载《不一样的 双11 技术:阿里巴巴经济体云原生实践》
ban
本书亮点

  • 双11 超大规模 K8s 集群实践中,遇到的问题及解决方法详述
  • 云原生化最佳组合:Kubernetes+容器+神龙,实现核心系统 100% 上云的技术细节
  • 双 11 Service Mesh 超大规模落地解决方案

阿里巴巴云原生关注微服务、Serverless、容器、Service Mesh 等技术领域、聚焦云原生流行技术趋势、云原生大规模的落地实践,做最懂云原生开发者的技术圈。”

istio-网关(GateWay)

Daniel_Ji阅读(12382)

在Istio中,使用网关定义在网格边缘运行的负载均衡器,用于接收传入或传出的HTTP / TCP请求,网关配置适用于在网格边缘运行的独立Envoy代理。

与其他控制进入系统流量的机制(例如Kubernetes Ingress API)不同,Istio网关可以充分利用Istio流量路由的功能和灵活性。Istio的网关资源仅允许配置4-6层负载平衡属性,例如要公开的端口,TLS设置等。没有将应用层流量路由(L7)添加到相同的API资源,而是将Istio 虚拟服务绑定到网关。通过这样的方式呢,就可以像管理Istio网格中的任何其它数据平面流量一样,统一管理网关流量。网关主要用于管理传入的流量,也可以用于配置出口流量的网关。还可以使用网关来配置纯内部代理。Istio提供了一些可以预配置的网关代理部署(istio-ingressgateway和istio-egressgateway)。

表 网关字段

领域 类型 描述 需要
servers Server[] 服务器规格列表。
selector map<string, string> 一个或多个标签,指示应在其上应用此网关配置的一组特定的Pod / VM。标签搜索的范围仅限于存在资源的配置名称空间。换句话说,网关资源必须与网关工作负载实例位于相同的名称空间中。

1 服务器

spec.server字段用于设置网关的服务列表,在下面的例子中,定义了一个名称为demo-ingress的网关,此网关通过80端口接收HTTP2协议的流量。

#—–定义名称为demo-ingress的网关—–

apiVersion: networking.istio.io/v1alpha3

kind: Gateway

metadata:

name: demo-ingress

spec:

selector:

app: demo-ingress-gateway

servers:

– port:

number: 80

name: http2

protocol: HTTP2

hosts:

– “*”

表 网关的服务字段

领域 类型 描述 需要
port Port 传入流量的监听端口。
hosts string[] 网关一台或多台主机。通常适用于HTTP协议的服务,但也可以将其用于使用TLS和SNI的TCP服务。
tls TLSOptions 与TLS相关的选项,用于控制服务器的行为。使用这些选项可控制是否应将所有http请求都重定向到https,以及要使用的TLS模式。
defaultEndpoint string 默认情况下,将流量转发到的环路IP端口或Unix域套接字。格式应为127.0.0.1:PORT或unix:///path/to/socket或unix://@foobar(Linux抽象名称空间)。

网关中的端口用于设置接收输入流量的监听端口,主要的字段包括,number、protocol和name。

表 网关的端口字段

领域 类型 描述 需要
number uint32 监听流量的端口号。
protocol string 传输协议。必须是HTTP | HTTPS | GRPC | HTTP2 | MONGO | TCP | TLS之一。
name string 端口的名称。

2 网关示例

在下面的示例中,定义了一个名称为ext-host-gwy的网关。

#——–定义名称为demo-gwy的网关—

apiVersion: networking.istio.io/v1alpha3

kind: Gateway

metadata:

name: demo-gwy

spec:

selector:

app: demo-gateway-controller

servers:

– port:

number: 443

name: https

protocol: HTTPS

hosts:

– demo.example.com

tls:

mode: SIMPLE

serverCertificate: /tmp/tls.crt

privateKey: /tmp/tls.key

此网关允许以HTTPS协议通过443端口访问demo.example.com,但没有为该流量指定任何路由。要指定路由并使网关按预期工作,还必须将网关绑定到虚拟服务。下面的例子创建了一个名称为virtual-svc的虚拟服务,使用虚拟服务的spec.gateways字段将demo-gwy网关与虚拟服务进行了绑定。

#—定义名称为demo-virtual-svc虚拟服务—-
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: demo-virtual-svc
spec:
  hosts:
  – demo.example.com
  # 将名称为demo-gwy的网关绑定到虚拟服务
  gateways:
    – demo-gwy

作者简介:

季向远,北京神舟航天软件技术有限公司。本文版权归原作者所有。

阿里云叔同:以容器为代表的云原生技术,已成为释放云价值的最短路径

alicloudnative阅读(2361)评论(0)

作者 | 丁宇(叔同) 阿里云智能容器平台负责人 、刘丹

2019 年阿里巴巴 双11 核心系统 100% 以云原生的方式上云,完美支撑了 54.4w 峰值流量以及 2684 亿的成交量。随着阿里巴巴经济体云原生技术的全面升级,容器性能、稳定性及在线率也得到了全面提升。本文作者将从云计算时代容器的发展路径为出发点,剖析阿里云的容器技术演进历程,借此探析整个行业的发展趋势。

以容器为代表的云原生技术,成为云时代释放云价值的最短路径

过去我们常以虚拟化作为云平台和与客户交互的界面,为企业带来灵活性的同时也带来一定的管理复杂度;容器的出现,在虚拟化的基础上向上封装了一层,逐步成为云平台和与客户交互的新界面之一,应用的构建、分发和交付得以在这个层面上实现标准化,大幅降低了企业 IT 实施和运维成本,提升了业务创新的效率。

从技术发展的维度看,开源让云计算变得越来越标准化,容器已经成为应用分发和交付的标准,可以将应用与底层运行环境解耦;Kubernetes 成为资源调度和编排的标准,屏蔽了底层架构的差异性,帮助应用平滑运行在不同的基础设施上;在此基础上建立的上层应用抽象如微服务和服务网格,逐步形成应用架构现代化演进的标准,开发者只需要关注自身的业务逻辑,无需关注底层实现,云原生正在通过方法论、工具集和理念重塑整个软件技术栈和生命周期。

“以容器为代表的云原生技术,用开放、标准的技术体系,帮助企业和开发者在云上构建和运行可弹性扩展、容错性好、易于管理、便于观察的系统,已经成为释放云价值的最短路径。”在提及容器演进历程中叔同强调道。最早创造和应用容器技术的是互联网公司,今天有了开放标准的云原生生态,使得容器技术得到迅速普及,越来越多的企业和开发者使用容器构建应用,共同享受这一技术红利。

目前企业级用户对于容器技术有何新的需求呢?对此,叔同表示:云原生应用落地过程中,安全性是企业用户最为关注的需求之一。传统的 RunC 容器与宿主机 Linux 共享内核,通过 CGroup 和 namespace 提供有限的隔离性,随着越来越多的企业客户开始关注容器安全,近两年新型高隔离、安全的运行时开始出现,包括 MircoVM  (Kata Container、FireCracker) 方向和 gVisor 安全沙箱方向。

阿里云和蚂蚁金服团队合作,引入安全沙箱容器技术,于 2019 年 9 月发布了基于轻量虚拟化技术的 RunV 安全沙箱,相比于 RunC 容器,每个 RunV 容器具有独立内核,即使容器所属内核被攻破,也不会影响其他容器。阿里云容器服务提供了端到端的云原生安全架构,包括基础设施安全、软件供应链安全和运行时安全,为企业提供全方位、立体化、多层次的安全防护。

第二个需求是混合云架构,上云已是大势所趋,很多客户由于业务原因会考虑混合云的方式,不同云环境的基础设施和安全架构差异会造成企业 IT 和运维体系的割裂,加大管理复杂性。

在云原生时代,以容器、Kubernetes 为代表的技术屏蔽了基础设施差异,作为底座推动了以应用为中心的混合云 2.0 架构到来,满足了用户诉求。同时企业在运营效率、研发效率、运行成本以及系统容错性、可维护性等方面,也提出了更高的要求。阿里云在整个容器产品的研发过程中,致力于解决企业痛点,尽管各个企业对于上云的诉求有诸多不同,但容器和云原生作为一种普适技术,可以满足不同企业不同层次的需求。

谈及阿里云对于容器技术与产品的创新,叔同强调,“阿里云希望在云原生领域继续走社区路线,和开源技术完全兼容,利用阿里巴巴经济体的规模复杂度和阿里云客户的场景丰富度,不断创新,形成云原生的技术领先并回馈社区共建标准。2019 年年初我们将云原生大规模生产落地最佳实践沉淀下来,以开源项目 OpenKruise 的方式向社区开放,一方面帮助企业客户在云原生的探索过程中,少走弯路减少技术碎片化;一方面推动上游社区逐渐完善和丰富应用自动化管理能力。

在 2019 年 10 月,阿里云联合微软一起发布开放应用模型 Open Application Model(OAM),OAM 是专注于描述应用生命周期的标准规范,可以帮助应用开发者、应用运维人员和基础架构运维团队更好地进行协同。在这个模型里开发人员负责定义应用组成、依赖与架构;应用运维人员负责定义应用运行时配置与运维需求,比如发布策略和监控指标,而基础架构运维团队可以针对应用部署环境的不同,配置定制化参数,通过这种关注点分离的设计,可以将应用定义、运维能力与基础设施实现解耦,让应用交付变得更加高效、可靠和自动化,解决行业痛点。

Serverless 通过更高层次的抽象,让开发者免去资源管理、日常运维等工作,做到简化研发、极致弹性、按用付费。阿里云打造了函数计算产品 FunctionCompute:

  • 提供了事件驱动的编程方式;
  • 提供了面向应用的 Serverless 应用托管平台 SAE,用户只需提供应用实现,而平台负责弹性、自动化运维;
  • 提供了面向容器的 Serverless 产品 ECI 和 Serverless  Kubernetes,另一方面也在推动一些传统技术的 Serverless 化,例如数据库和消息中间件。

在技术创新的驱动下,阿里云希望成为云原生最佳的产品实现,继续发挥国内最大规模的云原生应用实践、国内最丰富的云原生产品家族、国内最大的云原生客户群体、国内最全面的云原生开源贡献的优势,服务更广泛的企业客户和开发者。”

十一年 双11 的云化架构演进与升级,造就容器技术最好的创新土壤

“阿里云与其他云厂商最大的不同,就是阿里巴巴的核心业务运行在云上,形成最好的创新土壤,也就是说我们最先进的技术,首先会在阿里巴巴自己的业务体系中进行尝试,得到了大规模的运用,证明其技术的普适性与价值后再开放给客户。”

在谈及阿里云容器化进展时,叔同强调:任何技术都会在阿里巴巴自己的业务体系中得到尝试与应用, 2011 年阿里云开始迈进容器大门,2013 年 Docker 问世,阿里云容器迅速融合其先进理念,并在 2015 年推进集团业务全面的容器化演进,而这一系列的发展与演进其实都离不开 双11 大促的需求,例如全面容器化帮助 双11 大促实现快速弹性扩容。

在 双11 活动的历练中,数以百万的容器支撑着 双11 活动顺利进行。由于业务的超大规模使得其复杂程度非常高,这也为容器技术带来了更大的挑战。例如在容器镜像分发过程中,一次发布分发几万个镜像,这样巨大的流量是一个不小的挑战。为实现效率的极致要求,阿里云利用 P2P 技术,实现大规模大批量的快速分发,实现 10 秒内完成跨机房镜像下载容器启动。

容器技术对于 双11 的显著影响还包括在具体的混部技术实施中,叔同表示通过混部技术,阿里巴巴集团范围内能够节省 30% 左右的 IT 成本支出,能够在 双11 这个特殊时间段里,将每万笔交易成本下降超过 75%。

容器、微服务、人工智能未来趋势:协作、融合

容器技术已经获得了业界的广泛认可,在未来的发展前景,不仅取决于其在技术领域的卓越表现,同时也需要与更多的技术相融合,从而成为与时代共同进步的成功产品技术。

早期 Kubernetes 上主要运行无状态的 Web 应用,比如基于 Apache Dubbo/Spring Cloud 的微服务应用,现在越来越多的企业核心业务、数据智能业务和创新业务也运行在 Kubernetes 之上。以阿里云自身的云产品举例,包括企业级分布式应用服务 EDAS 、实时计算平台 Flink 、弹性 AI 算法服务 EAS 、区块链平台 BaaS 都部署在阿里云 Kubernetes 服务 ACK 之上。

从应用架构演进来看,容器的发展促进了微服务的发展。微服务在早期落地遇到的大问题是架构拆分导致的运维复杂度和环境不一致,正是通过容器对应用和其运行环境的打包和隔离,很好的解决微服务体系的痛点,让微服务得以快速发展。微服务架构的引入解决了一些问题的同时,入侵了研发框架,框架迭代和研发迭代被耦合,并且在多语言环境的支持不够友好,在管理上也更加复杂。因此社区开始尝试 Service Mesh,逐渐把微服务能力从框架能力下沉为平台能力,可以看到容器与微服务在互相促进。

“云原生与 AI 是绝佳搭档,两者是相互赋能的。”在提及 AI 与容器的融合时叔同强调。首先 AI 是新兴领域,架构上没有那么多历史包袱,另外 AI  计算本身对弹性、资源效率和部署效率有所要求,容器技术可以解决上述问题。GPU、FPGA、专有的 ASIC 芯片等新架构,带来巨大算力提升的同时也带来管理维护的难度,利用 Kubernetes 提供对异构资源的统一管理和高效调度,提升弹性支持细粒度共享,可以提升资源利用率 3 到 5 倍。

AI 对于容器云原生技术同样帮助巨大,AI 往往代表着业务场景,这对于云原生技术如何更为普适通用提供了丰富的验证空间,从而提升了云原生技术的成熟度。

容器技术出现已经超过 6 年,Kubernetes 的快速发展已不是新闻,但这并不意味着容器技术的生态系统已经发展平缓。相反的是,容器及其周边的技术体系还在保持高速发展。

谈及未来关注的新技术、新方向,叔同坦承要让容器走到所有的环境中,不仅是传统 IDC,更要走到公共云、专有云、边缘节点、物联网、大数据、AI 等各种场景中,希望运用云原生技术降低云计算的使用门槛,真正实现云上拐点。

点击下载《不一样的 双11 技术:阿里巴巴经济体云原生实践》
ban.jpg

本书亮点

  • 双11 超大规模 K8s 集群实践中,遇到的问题及解决方法详述
  • 云原生化最佳组合:Kubernetes+容器+神龙,实现核心系统 100% 上云的技术细节
  • 双 11 Service Mesh 超大规模落地解决方案

阿里巴巴云原生关注微服务、Serverless、容器、Service Mesh 等技术领域、聚焦云原生流行技术趋势、云原生大规模的落地实践,做最懂云原生开发者的技术圈。”

Rainbond 5.1.9发布,新增实例弹性伸缩、OAuth代码仓库互联功能

好雨云阅读(2525)评论(0)

Rainbond 5.1.9发布,新增实例弹性伸缩、OAuth代码仓库互联功能

2019年12月12日,Rainbond开源2周年纪念,我们带来了5.1.9版本,本次更新引入组件实例自动伸缩、代码仓库互联(OAuth2.0互联)两大功能,同时在系统高可用、系统服务自动运维、功能可用性等方面做大量优化。

  • Rainbond:以应用为中心,支撑企业应用的开发、架构、模块化组装、交付和运维的全生命周期,通过“无侵入”架构无缝衔接各类企业应用,通过软件定义管理企业物理资源,并提供DevOps能力。 Rainbond是什么?

  • 发布版本:5.1.9

  • 版本更新:推荐

  • 更新范围:组件实例控制、系统自动化运维、持续集成

实例弹性伸缩

弹性伸缩是指对于无状态类组件服务或有状态可水平伸缩类组件服务当业务量大时自动增加实例数量,以保证计算能力。当业务处理量下降时减少实例数量,以降低资源占用成本。本次实现我们采用Kubernetes 默认伸缩算法。

伸缩算法

HPA Controller会通过调整副本数量使得某一指标尽量向期望值靠近,而且不是完全相等.另外,考虑到自动扩展的决策可能需要一段时间才会生效:例如当某一个组件实例的内存使用率一直上升并超过期望值,创建一个新实例的过程中,原实例的内存使用率还会持续上升。所以,在每一次作出决策后的一段时间内,将不再进行扩展决策。对于扩容而言,这个时间段为3分钟,缩容为5分钟。

HPA Controller中有一个tolerance(容忍力)的概念,它允许一定范围内的使用量的不稳定,现在默认为0.1,这也是出于维护系统稳定性的考虑。例如,设定HPA调度策略为内存使用率高于50%触发扩容,那么只有当使用率大于55%或者小于45%才会触发伸缩活动,HPA会尽力把实例的使用率控制在这个范围之间。

  • 具体的每次扩容或者缩容的多少Pod的算法为:Ceil(采集到的使用率 / 用户自定义的使用率) * Pod数量)

  • 每次最大扩容pod数量不会超过当前副本数量的2倍

对于指标当前版本支持资源使用类的内存(使用率、使用量)和CPU(使用率、使用量)指标。

组件弹性伸缩设置演示

未来计划

未来的版本中我们将支持用户自定义组件的业务能力指标,比如API服务暴露其每秒处理的请求数量,则可通过配置请求处理效率指标为实例伸缩指标,对于这类业务类指标将更能够及时准确的衡量业务伸缩的时机。除了扩充业务指标外,HPA Controller将联合网关模块、ServiceMesh模块来实现组件实例缩放到“0”的能力。这种能力对于企业长期不使用的应用或业务能够节省较多企业资源,这同时也是服务于FaaS的能力基础。

代码仓库互联(OAuth2.0互联)

Rainbond基于源码新建或持续构建组件都直接与Git代码仓库交互。过去需要用户手动输入项目仓库地址,对于私有仓库还需要提供账号密码等信息。OAuth是目前最常用的开放授权通信协议,目前几乎全部Git代码仓库服务实现都支持基于OAuth2.0实现开放用户授权。当前版本Rainbond实现对Github、Gitlab、Gitee三类代码仓库服务的支持,用户授权后可直接获取用户项目列表、提供创建组件的快捷流程。通过OAuth Token从代码仓库获取源码或调用API自动设置webhook,从而简化用户配置。

OAuth流程演示

其他新增功能

  • 新增Kubernetes集群监控服务平台Mysql数据库监控服务

  • 支持租户删除和资源清理

  • 新增管理节点磁盘自动清理功能

  • 新增已删除组件所占资源自动清理功能

  • 应用网关支持VIP漂移后,关联策略自动漂移功能

  • 应用网关管理支持HTTPS证书更新后自动生效 #527

  • 云端备份存储类型支持阿里对象存储和兼容S3的其他对象存储#545

  • 组件互相依赖时支持启动顺序控制 #499

  • 平台默认数据库切换到Mysql5.7版本,并对8.0版本作兼容测试

  • 新增节点Condition更新机制,grctl命令行和管理后台体现Condition更新状态,便于用户发现节点健康检测故障

  • 节点处于UNKNOW的节点自动下线该节点注册的系统服务保证高可用性

解决问题清单

K8S容灾方案的五个关键点

Portworx阅读(9070)评论(0)

容灾恢复是绝大多数企业级应用的基本要求
在没有Kubernetes也没有容器的时候,备份和恢复解决方案通常在虚拟机(VM)级别上实现。当应用程序在单个VM上运行时,容灾系统适用于这样的传统应用程序。但是,当使用Kubernetes对应用程序进行容器化管理时,这样的容灾系统就无法使用了。有效的Kubernetes容灾恢复方案必须针对容器化架构进行重新设计,并按Kubernetes的原生方式来运行。

传统的基于VM的备份和恢复解决方案,使用快照来收集数据,但这些数据对于某个具体容器化应用并不足够。因为任何一个特定的VM都将包含来自多个应用的数据。如果您尝试通过VM快照来备份APP 1,将会同时获取其他应用的多余数据。但这些数据从容器角度来看又不够:APP 1可能还会将数据存储在其他VM上。因此通过对某个单独VM的快照无法捕获所有APP1的数据。

基于分布式体系结构的现代应用需要的容灾方案,需要能够找到特定应用的所有相关数据和配置信息,并能够以零RPO(Recovery Point Objective,复原点目标)和接近零RTO(Recovery Time Object,复原时间目标)的方式进行恢复。

一个有效的Kubernetes容灾解决方案需要具备:

  • 容器粒度的控制
  • 能够备份数据和配置
  • Kubernetes命名空间感知
  • 针对多云和混合云架构的优化
  • 保持应用的一致性

容灾解决方案必须满足以上五个标准,才能确保Kubernetes上运行的含大量数据的应用程序在容灾恢复的时候,满足服务水平协议(SLA)或相关法律要求。

让我们分析一下为什么这五个标准都很重要。

容器粒度控制  

容器粒度控制容灾方案意味着用户可以备份特定的Pod或Pod组,而不是备份整个VM或服务器。这使得用户可以仅快照属于该应用程序的容器。

假设您有一个三节点Kubernetes集群,其中有一个三节点Cassandra环和三个单节点PostgreSQL数据库,分布在三个虚拟机上。使用传统的灾难恢复解决方案,备份群集的唯一方法是备份三个虚拟机。这将导致提取,转换和加载过程带来的复杂性增加,存储成本增加和RTO增加。备份充足数据的唯一方法是备份超出必要数据的更多数据。

使用容器粒度的方式,可以在三个VM上仅备份一个PostgreSQL数据库或三节点Cassandra环,而无需其他任何备份。

Kubernetes命名空间感知  

传统的备份和恢复解决方案不是以Kubernetes的方式进行的。

Kubernetes中的命名空间通常运行多个相关的应用程序。例如,企业Kubernetes部署中的一种常见模式是使公司/部门所有的应用都运行在同一个命名空间内。在这种情况下,通常有必要一起备份Kubernetes命名空间中的所有应用程序。

但是,像每个单独的应用一样,命名空间分布在许多虚拟机上。每个虚拟机可能还有来自几个不同命名空间的Pod。如果没有支持命名空间的容灾解决方案,则完全备份将需要备份和存储远远超出必要的数据。即使采用了这种过分的备份策略,在发生故障的情况下也很难还原整个命名空间,从而导致较高的RTO。

应用的一致性 

即使您想通过备份系统中的所有VM来解决上述问题,使用传统的容灾恢复方案也很难避免数据损坏。为了成功地备份分布式应用,而没有数据损坏的风险,在快照进行过程中,必须锁定应用程序中的所有Pods。基于VM的快照无法实现此目的,因为它们无法锁定整个应用程序,无法跨多个VM执行应用一致性的快照。

成功的快照,要使数据损坏风险最小化,并必须保持分布式架构的应用的一致性。这意味着在锁定属于应用程序的所有Pods的同时,来执行快照。

 

数据和配置备份 

容灾系统的目标不仅是防止数据丢失,还在于保持RTO较低。您需要应用程序在遇到问题后尽快重新启动并运行。

这需要备份应用数据和配置信息。如果备份中不包含配置信息,则必须就地重建应用程序,这是一个缓慢,手动且可能容易出错的过程。但是,如果仅保存配置,则可能会丢失所有数据。

一个真正的Kubernetes的企业级容灾系统将同时包含数据和配置备份。这样在系统失败后,可以用一两个命令快速重新部署应用程序。

针对多云和混合云架构进行了优化 

绝大多数企业在实践中,应用程序至少在两个环境中运行。这可能意味着多个本地数据中心或多个Amazon Web Services(AWS)区域。在容灾恢复的情况下,通常将一个数据中心作为主站点,而将第二个数据中心作为备份站点。但是,也有许多公司使用公有云和本地数据中心的组合来运行应用程序并满足其业务需求。在大多数情况下,企业会根据其RPO和RTO要求选择最佳的架构方式。

对于容灾恢复解决方案而言,结合这些不同的架构方式以支持不同级别的RPO和RTO至关重要。有效的容灾恢复解决方案应该能够提供同步和异步数据复制,具体取决于主群集和备份群集之间的延迟。

当主站点和备份站点之间的往返延迟通常在10毫秒以下时,可以实现允许RTO和RPO为零的同步复制。这种情况通常是当主集群和备份群集所在数据中心地理相距较近。

在某些情况下,企业希望主站点和备份站点之间的地理距离远一些。在这种情况下,RTO仍可以为零或接近零。但是延迟的增加,同步复制数据会产生比较大的性能问题。如果应用能够接受15分钟或1小时的RPO,则也是可接受的容灾方案。

Kubernetes的企业级容灾恢复方案,应为用户提供适用于多云或混合云架构的,同步复制或异步复制的选择。这样可以使用户能够基于自己的数据中心架构和业务需求情况,来选择不同的容灾恢复方案。

结论  

当企业将关键业务应用迁移至Kubernetes时,重新思考和设计容灾恢复的方案非常重要。实际上可以做到在满足与容灾相关的SLA的同时,

在Kubernetes上运行应用。

但它需要采用专为Kubernetes设计的容灾方法,与Kubernetes的工作方式深入结合。传统的基于VM的容灾解决方案无法做到这一点。

Portworx Enterprise 存储平台是专门为容器和Kubernetes构建的。它可为Kubernetes上运行的应用实现零RPO和接近零的RTO容灾恢复。并具有容器粒度控制的,命名空间感知的,应用一致性的容灾恢复。故障恢复可以完全自动化,从尽可能降低RTO

2019北美KubeCon+CloudNativeCon上的K8S五大趋势

Portworx阅读(4182)评论(0)

KubeCon+CloudNativeCon – 业界最隆重的盛会今年在圣地亚哥举办,超过 12000 名参会者以及 100 多个云原生供应商出席了这次大会。越来越多的企业开始采用K8S和容器架构来进行数字化转型的实践。我们总结了目前K8S发展存在的挑战,以及未来K8S发展的五大趋势,在这里分享。

1.     K8S公认复杂性较高,如何降低部署的复杂性,如何增加系统的可见性和易操作性成为重要发展方向。当前情况下,用户很难知道正在发生什么,以及谁有权限访问数据。系统的复杂性使得许多配置容易出错。另外加密技术的安全性,保护容器集群和多云之间的通信安全。以及通过包括Kubernetes、底层OS和容器内的软件组件等安全更新使系统保持在最新状态。

2.    如何通过K8S在容器架构中使用数据库,成为重要的趋势。目前K8S对数据库功能的支持还不够有力。有状态下存储数据的能力还很一般。这使得K8S很难大规模承载生产系统和核心应用系统。

3.    如何提供更有效和更简单的手段对容器进行管理,应对类似传统架构中用户需要面对的关键问题:如存储和数据管理,包括迁移,备份,加密,容灾等等,成为决定企业能否快速采用容器和微服务架构实现生产系统云原生数字化的重要先决条件。在受调查的K8S用户中,有46%的人提到了安全问题,网络和存储分别排在第二和第三位。

4.    企业越来越多的采用混合云/多云架构,成为驱动容器技术的重要原因。很大一部分公有云用户正采用多供应商策略,这一比例已经从2016年的13%上升到2019年的27%。此外,在同一时间段内,混合云的使用率从24% 上升到了32% 。在多个云平台上运行应用程序已经成为了容器技术使用的主要驱动力,带来了远超以往的益处,如开发者效率的提升以及支持微服务等。

5.      K8S正在逐步被应用到生产环境和核心应用上。多个Kubernetes集群的集中管理,例如开发、测试和生产集群,或用于动态工作负载处理的多云设置将变得更加普遍。根据知名软件行业分析公司Redmonk的调查,财富100强的企业中有71%使用容器,其中超过50%的企业使用Kubernetes作为容器编排平台。”除此之外,CNCF还指出,纽约时报、eBay、Uber、高盛及Buffer等知名国际企业已经将Kubernetes大规模应用于生产环境。

2020年Service Mesh 三大发展方向

中文社区阅读(39844)评论(0)

2019年,Service Mesh已从实验性技术到开始形成技术解决方案,将来也会成为Kubernetes 部署的基本组成部分。今年已经有一部分公司开始大规模采用Service Mesh,受第一批使用Service Mesh企业成功的经验影响,观望中的企业也会开始评估Service Mesh技术,以解决使用Kubernetes 所面临的挑战。
 
随着Service Mesh的采用日益广泛,2019年提供了一个新兴的Service Mesh市场。Istio和Linkerd一直保持竞争,一年中Istio周围的工具和供应商生态系统几乎增加了两倍。当然,也有许多新进入市场的参与者提供了解决第七层网络挑战的替代方法。networking(例如Kuma和Maesh提供的网格)已经出现,以提供不同的Service Mesh方法,以解决各种边缘用例。我们也看到了引进类似的工具服务网接口规范,但在主要参与者等待市场首先选择获胜者的同时还没有收缩。诸如 Network Service Mesh之类的相邻项目将服务网格原理带到了堆栈的较低层。
 
尽管在Service Mesh空间中仍有很多需要解决的问题,但是Service Mesh作为一种技术模式的价值是显而易见的,正如451 Research最近发布的“Voice of the Enterprise: DevOps”调查所证明的那样。
 

 

尽管仍然是一个新兴市场,但企业将Service Mesh作为基础架构的关键部分组成计划,将其迅速赶上Kubernetes和容器。

2020年Service Mesh:三大发展方向

 
1、对Service Mesh需求的快速增长
 
Kubernetes正在爆发,它已成为企业和容器编排的第一选择。Kubernetes是一项新兴技术,并且全球还有很多企业距离采用它还需要很多年。但是很明显,Kubernetes已经并且将继续是软件世界中的主导力量。
 
如果Kubernetes赢得了胜利,并且基于Kubernetes的应用程序的规模和复杂性将增加,那么就有一个临界点,即Service Mesh将成为有效管理那些应用程序所必需的一切。
 
2、Istio将很难被击败
 
未来市场上可能还有其他竞争者的空间,但市场的整合将于2020年开始。从长远来看,我们很可能会看到类似Kubernetes的情况,其中出现了赢家,公司开始标准化那个赢家。可以想象,Service Mesh可能不是解决第7层网络问题的技术模式。但是,如果确实发生了这种情况,则Istio似乎有可能成为事实上的Service Mesh。有很多支持和反对的观点,但是最有说服力的因素是围绕Istio开发的生态系统。几乎每个主要的软件供应商都有Istio解决方案或集成,并且Istio开源社区在活动和贡献方面远远超过任何其他社区。
 
3、案例、案例、案例
 
2019年是解决Service Mesh问题的一年。早期采用者从Service Mesh中选择了自己想要的前两个或三个功能并加入其中。在过去的一年中,最常用的三个解决方案是:
 
  • mTLS.
  • Observability.
  • Traffic management.
 
2020年将是Service Mesh核心用例出现的一年,并将被用作下一波采用者实施服务网格解决方案的模型。
 
客户要求的前三个用例是:
 
  • 可观察性,以更好地了解集群状态,快速调试并更深入地了解系统,构架更灵活,更稳定的系统。
  • 利用Service Mesh策略来驱动预期的应用程序行为。
  • 实施和证明安全且合规的环境。
  • 像WebAssembly这样的技术将使现有功能分配到数据平面边车上以及构建新的智能性和可编程性成为可能。
 
如果您已经使用了Service Mesh,那您将了解它带来的价值。
作者:Zach Jory
​原文:https://thenewstack.io/the-top-3-service-mesh-developments-in-2020/

如何保障云上数据安全?一文详解云原生全链路加密

alicloudnative阅读(4010)评论(0)

 

本文节选自《不一样的 双11 技术:阿里巴巴经济体云原生实践》一书。

作者
李鹏(壮怀)阿里云容器服务高级技术专家
黄瑞瑞  阿里云技术架构部资深技术专家

导读:对于云上客户而言,其云上数据被妥善的安全保护是其最重要的安全需求,也是云上综合安全能力最具象的体现。本文作者将从云安全体系出发,到云数据安全,再到云原生安全体系对全链路加密进行一次梳理,从而回答:在云原生时代,全链路加密需要做什么?如何做到?以及未来要做什么?

什么是云原生全链路加密

数据安全在云上的要求,可以用信息安全基本三要素 “CIA”来概括,即机密性(Confidentiality)、完整性(Integrity)和可用性(Availability)。

  • 机密性专指受保护数据只可以被合法的(或预期的)用户可访问,其主要实现手段包括数据的访问控制、数据防泄露、数据加密和密钥管理等手段;
  • 完整性是保证只有合法的(或预期的)用户才能修改数据,主要通过访问控制来实现,同时在数据的传输和存储中可以通过校验算法来保证用户数据的完整性;
  • 数据的可用性主要体现在云上环境整体的安全能力、容灾能力、可靠度,以及云上各个相关系统(存储系统、网络通路、身份验证机制和权限校验机制等等)的正常工作保障。

在三要素中,第一要素机密性(Confidentiality)最常见也是最常被要求的技术实现手段就是数据加密。具体到云原生维度,需要实现的就是云原生的全链路加密能力。

“全链路”指的是数据在传输 (in Transit,也叫 in-motion)、计算 (Runtime,也叫 in-process),存储 (in storage,也叫 at-rest) 的过程,而“全链路加密”指的是端到端的数据加密保护能力,即从云下到云上和云上单元之间的传输过程、到数据在应用运行时的计算过程(使用/交换),和到数据最终被持久化落盘的存储过程中的加密能力。

• 数据传输 (数据通信加密,微服务通信加密,应用证书和密钥的管理);
• 数据处理(运行时安全沙箱 runV, 可信计算安全沙箱 runE);
• 数据存储 (云原生存储的 CMK/BYOK 加密支持、密文/密钥的存储管理、容器镜像的存储加密、容器操作/审计日志安全)。

1.png

本文中的技术描述针对的是在云原生全链路加密中已有的和未来需要实现的技术目标。

云安全 > 云数据安全 > 云原生全链路加密

2.png

云安全

针对用户群体的不同,对安全链路有不同的层次定义,云安全涵盖了云客户安全和云厂商安全在 IaaS 的软件、硬件以及物理数据中心等的安全。

3.png

  • 云原生客户(Cloud Native Customer)安全
    • 应用安全
    • 操作安全
    • 商业安全
    • 容器网络安全
    • 容器数据安全
    • 容器运行时安全
  • 云客户(Cloud Customer)安全
  • 云厂商(Cloud IaaS DevOps)安全

云原生安全

4.png

云原生安全首先需要遵循云数据安全标准,在复用了云基础架构安全能力的前提下,同时在安全运行时,软件供应链上有进一步的安全支持。

云原生存储是通过声明式 API 来描述了云数据的生命周期,并不对用户透出底层 IaaS 的数据加密细节。不同的云原生存储一般作为云数据的载体,复用了云 IaaS 基础安全能力,还需要包括软件供应链中的镜像安全,和容器运行时 root 文件系统安全和容器网络安全。

  • 云原生安全的运行时 = 数据处理过程中的计算安全,内存安全,文件系统安全和网络安全
  • 云原生软件供应链安全 = 可执行文件/用户代码安全
  • 云原生基础架构的安全 = 云数据存储安全

云数据安全

云用户数据安全包括以下的三个方面的工作:

  • 数据保护:RAM ACL 控制细粒度的数据的访问权限;敏感数据保护(Sensitive
    Data Discovery and Protection,简称 SDDP)、数据脱敏、数据分级分类。
  • 数据加密:CMK 加密数据能力;BYOK 加密数据能力。
  • 密钥/密文管理:KMS/HSM 等云服务;三方 Vault 服务。

数据安全的生命周期

为了更好的理解数据保护,需要对数据安全的生命周期有一个了解,因为数据保护贯穿于整个的数据生命周期:

  • 数据收集
  • 数据传输
  • 数据处理
  • 数据交换
  • 数据存储
  • 数据销毁

5.png

云原生数据生命周期,以 ACK(容器服务 Kubernetes)挂载阿里云云盘为例:

  • 云盘 PV 的申明和创建定义了数据,云盘数据的加密需要在申明定义中就体现,对密钥匙选择、加密算法选择都可以申明式支持,RAM 权限细粒度遵循最小权限;
  • 云盘挂载到虚拟机通过 PVC 在容器组 Pod 引用得以触发和实现;
  • 云盘数据的解密通过用户 CMK/BYOK 在块设备上实现透明加密解密;
  • Pod 生命周期的变化导致 PVC 关联云盘在不同宿主 ECS 上的 Detach/Attach;
  • 对 PV 的 Snapshot 生命触发了云盘 Snapshot 的创建;
  • PV 的删除可以通过 OnDelete 关联到云盘的中止和数据的删除。

全链路的数据安全

在狭义上来说是对数据端到端的加密,主要集中在了数据生命周期中的三个阶段:

  • 数据传输
  • 数据处理
  • 数据存储

数据传输阶段

安全通信设计,密文/密钥的安全管理和传输,既要满足云环境下的安全传输、云原生引入的容器网络、微服务、区块链场景,又对云原生数据安全传输提出了进一步的要求。

  • 云安全传输

在云环境下 VPC/安全组的使用,密文/密钥的安全管理 KMS 南北向流量通过 SSL 证书服务获取可信有效的 CA,对南北流量实现 HTTPS 加密和卸载,以及对 RPC/gRPC 通信使用 SSL 加密, 减小 VPC 的攻击面,通过 VPN/SAG Gateway 来实现安全访问链路。

  • 云原生安全传输

云原生场景,单一集群允许多租户的同时共享网络、系统组件权限控制、数据通信加密、证书轮转管理,多租场景下东西流量的网络隔离、网络清洗;云原生微服务场景,应用/微服务间通信加密,和证书管理;云原生场景下密钥、密文的独立管理和三方集成、KMS 与 Vault CA, fabric-ca, istio-certmanager 等的集成。

数据处理阶段

数据处理阶段,对内存级的可信计算,既有云安全虚拟化安全运行的要求,又有容器安全沙箱和可信安全沙箱的需求。

6.png

  • 云安全虚拟化可信计算:TEE SGX;ARM Trust Zone;
  • 云原生容器安全沙箱:runV Kata 安全容器沙箱 ;runE Graphane/Occlum 可信安全沙箱。

7.png

数据存储阶段

既有云安全对云存储加密、云数据服务加密需求,又有对容器镜像存储加密,审计日志、应用日志加密和三方集成的需求,以及对密文密码的不落盘存储支持。

云存储加密方式:

  • 数据 + 加密算法 + 用户密钥或主密钥;
  • 客户端加密/服务端加密。

8.png

云存储数据,以服务端加密为主;安全的密钥管理 KMS/HSM;安全的加密算法,全面支持国产算法以及部分国际通用密码算法,满足用户各种加密算法需求:

  • 对称密码算法:支持 SM1、SM4、DES、3DES、AES;
  • 非对称密码算法:支持 SM2、RSA(1024-2048);
  • 摘要算法:支持 SM3、SHA1、SHA256、SHA384。

阿里云只能管理设备硬件,主要包括监控设备可用性指标、开通、停止服务等。密钥完全由客户管理,阿里云没有任何方法可以获取客户密钥。

云存储加密支持

  • 块存储 EBS 云盘:支持虚拟机内部使用的块存储设备(即云盘)的数据落盘加密,确保块存储的数据在分布式系统中加密存放,并支持使用服务密钥和用户自选密钥作为主密钥进行数据加密;
  • 对象存储 OSS:支持服务端和客户端的存储加密能力。在服务端的加密中,支持使用服务密钥和用户自选密钥作为主密钥进行数据加密;在客户端的加密中,支持使用用户自管理密钥进行加密,也支持使用用户 KMS 内的主密钥进行客户端的加密;
  • RDS 数据库的数据加密:RDS 数据库的多个版本通过透明加密(Transparent
    Data Encryption,简称 TDE)或云盘实例加密机制,支持使用服务密钥和用户自选密钥作为主密钥进行数据加密;
  • 表格存储 OTS:支持使用服务密钥和用户自选密钥作为主密钥进行数据加密;
  • 文件存储 NAS:支持使用服务密钥作为主密钥进行数据加密;
  • MaxCompute 大数据计算:支持使用服务密钥作为主密钥进行数据加密;
  • 操作日志,审计日志的安全存储,以及三方日志系统集成。

云原生存储加密:目前阿里云容器服务 ACK 可以托管的主要以块存储、文件存储和对象存储为主,其他类型的 RDS、OTS 等数据服务是通过 Service Broker 等方式支持。

  • 用户容器镜像/代码 (企业容器镜像服务,OSS CMK/BYOK 加密);
  • 云原生存储卷 PV(申明式支持云存储的 CMK/BYOK 以及数据服务层的加密支持);
  • 操作日志和审计日志 (ActionTrail OpenAPI/Kubernetes AuditLog: SLS 日志加密);
  • 密文密码 (KMS/Vault 对密文的三方加密支持和内存存储,非 etcd 持久化)。

9.png

结论

云原生全链路的数据安全、云安全体系下的全链路加密已经成为了基础配置,新的容器化基础架构和应用架构的变化,结合云原生技术体系的特征,在数据传输、数据处理、数据存储阶段都需要增加相应云原生环境对网络、运行时、存储的全链路加密需求。

  • 既要满足云环境下的安全传输、云原生引入的容器网络、微服务、区块链场景,又对云原生数据安全传输提出了进一步的要求;
  • 既有云安全虚拟化安全运行的要求,又有容器安全沙箱,可信安全沙箱的需求;
  • 既有云安全对云存储加密、云数据服务加密需求,又有对容器镜像存储加密、审计日志、应用日志加密和三方集成的需求,以及对密文密码的不落盘存储的支持。

点击下载《不一样的 双11 技术:阿里巴巴经济体云原生实践》

ban.jpg

本书亮点

  • 双11 超大规模 K8s 集群实践中,遇到的问题及解决方法详述
  • 云原生化最佳组合:Kubernetes+容器+神龙,实现核心系统 100% 上云的技术细节
  • 双 11 Service Mesh 超大规模落地解决方案

阿里巴巴云原生关注微服务、Serverless、容器、Service Mesh 等技术领域、聚焦云原生流行技术趋势、云原生大规模的落地实践,做最懂云原生开发者的技术圈。”

开放下载 | 《Knative 云原生应用开发指南》开启云原生时代 Serverless 之门

alicloudnative阅读(10209)评论(0)

knative海报.png

 

点击下载《Knative 云原生应用开发指南》

自 2018 年 Knative 项目开源后,就得到了广大开发者的密切关注。Knative 在 Kubernetes 之上提供了一套完整的应用 Serverless 编排服务,让应用开发者可以不用为底层的基础设施分心,把更多的精力投入到业务逻辑上。
Knative 的一个很重要的目标就是制定云原生、跨平台的 Serverless 编排标准。它的优势在于:

  • 基于 Kubernetes 实现 Serverless 编排;
  • 基于 Istio 实现服务的接入、服务路由的管理以及灰度发布等功能。

今年 5 月份,我们推出了 Knative 系列文章,由阿里云容器平台技术专家牛秋霖(冬岛)及阿里云容器平台高级开发工程师李鹏(元毅)结合自身的实践经验,由浅入深的介绍了 Knative 的使用、剖析其内部实现。

为了进一步方便大家理解 Knative,我们整理了系列文章中的 25 篇重点内容编排成书《Knative 云原生应用开发指南》,并开放分享给大家,希望能够帮助更多技术爱好者快速掌握 Knative 的应用 Serverless 编排技能,揭开 Knative 的神秘面纱。

为什么你要读这本书?

对于开发者而言,本书可以让你快速掌握 Knative 的应用 Serverless 编排技能;对于管理者或决策者而言,可以通过本书的介绍和案例深入了解企业为什么需要应用的 Serverless 编排;如何对普通应用进行 Serverless 编排;应用编排和 IaaS 无服务器计算的关系以及为什么会是 Knative 等问题。

本书主要分为入门、进阶和实战三个部分。

  • 入门篇可以帮助你快速掌握 Knative 的核心理念和关键设计,让你对应用的云原生编排应该具备什么能力有一个清晰的认识;
  • 进阶篇会对 Knative 各大核心模块的高级功能进行更深入的介绍,剖析 Knative 是如何构建在 Kubernetes 之上的;
  • 实战篇给出了很多基于 Knative 的云原生实战,让你对 Knative 的使用有一个更直观的体感。

目录.png

《Knative 云原生应用开发指南》目录 点击可查看大图

在 All in Cloud 的时代,对云的驾驭能力已经成为企业的核心竞争力,云正在重塑企业 IT 架构。每个企业都在思考如何最大化利用“云”的能力,最大化发挥“云”的价值。而企业上云的过程中是要直接面对众多的云厂商和各种繁杂的云产品,比如最基本的 IaaS 资源,同样是 VM 在不同的云厂商就有不同的特性、不同的 OpenAPI 和不同的创建与销毁方式。

这给企业上云带来了巨大的复杂度,大大打击了企业上云的积极性。所以对于上云的企业和提供云服务的厂商而言都在摸索寻找一个折中的平衡点,既能帮助企业上云,又能帮助云厂商释放云的能力。

云原生理念的形成与完善

云原生理念是在以上过程中逐渐形成和完善的。这套理念是协调所有参与方对服务上云逐渐形成的统一标准,它可以很好地帮助企业上云、帮助云厂商释放云的能力。云原生旨在以更标准化的方式衔接云厂商和上云企业:

  • 这种方式对于企业而言降低了上云和跨云的成本,让企业始终保有和云厂商议价的能力;
  • 对于云厂商而言,因为企业跨云迁移的成本低,所以只要能提供性价比更高的云服务,就能很容易的聚集大量用户。

云原生是在不断促进整个系统的良性循环:既能让企业始终保有选择的能力,又能让优秀的云厂商快速服务更多的客户。如果客户的业务服务能像水一样低成本在不同云厂商之间流动,那么云厂商提供的服务就能像货币一样在客户之间流通。这是一个多赢的局面。

Kubernetes 已经成为分布式资源调度和资源编排的事实标准,它屏蔽了底层基础架构的差异,帮助应用轻松运行在不同的基础设施之中。

目前云原生生态已经在 Kubernetes 之上构建了大量的上层服务支撑框架。比如:服务网格 Istio、 Kubeflow 、各种上层服务的 Operator 等等。我们可以看到构建在 Kubernetes 之上的云原生操作系统的雏形开始出现,这是开发者最好的时代,极大地提升了业务创新的速度。

无服务器(Serverless)的出现

随着 Kubernetes 的普及,开发者已经不需要关心基础设施,有了更多的精力放在业务的核心逻辑上,随之而来的就是无服务器计算的出现。

无服务器首先是在 IaaS 层的变革,用户无需提前准备冗余的 IaaS 资源,只需要在使用的时候自动扩容不用的时候自动缩容。因为应用真正需要的是 IaaS 资源的按需分配按量计费,而不是长期保有 IaaS 资源。

无服务器这个词是从 Serverless 翻译过来的,其实 Serverless 除了基础 IaaS 资源的按量分配以外还有一层就是对应用的 Serverless 编排。

Knative 出现的必然性

IaaS 资源可以按需分配只是一个开始,当 IaaS 完成了 Serverless 进化以后,应用层应该如何做呢?比如:一个普通应用需要具备什么能力才能按量使用 IaaS 资源呢?对应用进行 Serverless 编排是否能保证应用可以很容易的在不同的云厂商之间跨云迁移?

Knative 就是应用 Serverless 编排的云原生解决方案。

Knative 建立在 Kubernetes 和 Istio 之上,通过 Kubernetes 的跨云能力能够让企业应用原生具备跨云迁移的能力。在多云、混合云以及云边端互通的时代,基于 Knative 的应用 Serverless 云原生编排能力可以极大降低企业上云的成本。

云原生时代,如何在云上玩转 Knative?

《Knative 云原生应用开发指南》一书中共收录了 8 篇具体的 Knative 开发实践案例,给出了很多基于 Knative 的云原生实战,借此讲述了如何正确使用 Knative 中的 Build、Serving 以及 Eventing 三大组件来发挥其作用,逐渐精简我们的代码;直观地展示了如何使用 Knative 来一步步简单高效地开发云原生应用,让你对通过  Knative 来实践 Serverless 有一个更全面的体感。

期待《Knative 云原生应用开发指南》能够帮助更多的开发者真正开启云原生时代的 Serverless 之门,轻松解决迎面难题,避免踩坑!

点击下载《Knative 云原生应用开发指南》

knative海报.png

阿里巴巴云原生关注微服务、Serverless、容器、Service Mesh 等技术领域、聚焦云原生流行技术趋势、云原生大规模的落地实践,做最懂云原生开发者的技术圈。”

从零开始入门 K8s | 手把手带你理解 etcd

alicloudnative阅读(11660)评论(0)

作者 | 曾凡松(逐灵) 阿里云容器平台高级技术专家

本文整理自《CNCF x Alibaba 云原生技术公开课》第 16 讲。

导读:etcd 是用于共享配置和服务发现的分布式、一致性的 KV 存储系统。本文从 etcd 项目发展所经历的几个重要时刻开始,为大家介绍了 etcd 的总体架构及其设计中的基本原理。希望能够帮助大家更好的理解和使用 etcd。

一、etcd 项目的发展历程

etcd 诞生于 CoreOS 公司,它最初是用于解决集群管理系统中 OS 升级的分布式并发控制以及配置文件的存储与分发等问题。基于此,etcd 被设计为提供高可用、强一致的小型 keyvalue 数据存储服务。

项目当前隶属于 CNCF 基金会,被 AWS、Google、Microsoft、Alibaba 等大型互联网公司广泛使用。

1.png

最初,在 2013 年 6 月份由 CoreOS 公司向 GitHub 中提交了第一个版本的初始代码。

到了 2014 年的 6 月,社区发生了一件事情,Kubernetes v0.4 版本发布。这里有必要介绍一下 Kubernetes 项目,它首先是一个容器管理平台,由谷歌开发并贡献给社区,因为它集齐了谷歌在容器调度以及集群管理等领域的多年经验,从诞生之初就备受瞩目。在 Kubernetes v0.4 版本中,它使用了 etcd 0.2 版本作为实验核心元数据的存储服务,自此 etcd 社区得到了飞速的发展。

很快,在 2015 年 2 月份,etcd 发布了第一个正式的稳定版本 2.0。在 2.0 版本中,etcd 重新设计了 Raft 一致性算法,并为用户提供了一个简单的树形数据视图,在 2.0 版本中 etcd 支持每秒超过 1000 次的写入性能,满足了当时绝大多数的应用场景需求。2.0 版本发布之后,经过不断的迭代与改进,其原有的数据存储方案逐渐成为了新时期的性能瓶颈,之后 etcd 启动了 v3 版本的方案设计。

2017 年 1 月份的时候,etcd 发布了 3.1 版本,v3 版本方案基本上标志着 etcd 技术上全面成熟。在 v3 版本中 etcd 提供了一套全新的 API,重新实现了更高效的一致性读取方法,并且提供了一个 gRPC 的 proxy 用于扩展 etcd 的读取性能。同时,在 v3 版本的方案中包含了大量的 GC 优化,在性能优化方面取得了长足的进步,在该版本中 etcd 可以支持每秒超过 10000 次的写入。

2018 年,CNCF 基金会下的众多项目都使用了 etcd 作为其核心的数据存储。据不完全统计,使用 etcd 的项目超过了 30 个,在同年 11 月份,etcd 项目自身也成为了 CNCF 旗下的孵化项目。进入 CNCF 基金会后,etcd 拥有了超过 400 个贡献组,其中包含了来自 AWS、Google、Alibaba 等 8 个公司的 9 个项目维护者。

2019 年,etcd 即将发布全新的 3.4 版本,该版本由 Google、Alibaba 等公司联合打造,将进一步改进 etcd 的性能及稳定性,以满足在超大型公司使用中苛刻的场景要求。

二、架构及内部机制解析

总体架构

etcd 是一个分布式的、可靠的 key-value 存储系统,它用于存储分布式系统中的关键数据,这个定义非常重要。

2.png

一个 etcd 集群,通常会由 3 个或者 5 个节点组成,多个节点之间通过 Raft 一致性算法的完成分布式一致性协同,算法会选举出一个主节点作为 leader,由 leader 负责数据的同步与数据的分发。当 leader 出现故障后系统会自动地选取另一个节点成为 leader,并重新完成数据的同步。客户端在多个节点中,仅需要选择其中的任意一个就可以完成数据的读写,内部的状态及数据协同由 etcd 自身完成。

在 etcd 整个架构中,有一个非常关键的概念叫做 quorum,quorum 的定义是 (n+1)/2,也就是说超过集群中半数节点组成的一个团体,在 3 个节点的集群中,etcd 可以容许 1 个节点故障,也就是只要有任何 2 个节点可用,etcd 就可以继续提供服务。同理,在 5 个节点的集群中,只要有任何 3 个节点可用,etcd 就可以继续提供服务,这也是 etcd 集群高可用的关键。

在允许部分节点故障之后继续提供服务,就需要解决一个非常复杂的问题:分布式一致性。在 etcd 中,该分布式一致性算法由 Raft 一致性算法完成,这个算法本身是比较复杂的有机会再详细展开,这里仅做一个简单的介绍以方便大家对其有一个基本的认知。Raft 一致性算法能够工作的一个关键点是:任意两个 quorum 的成员之间一定会有一个交集(公共成员),也就是说只要有任意一个 quorum 存活,其中一定存在某一个节点(公共成员),它包含着集群中所有的被确认提交的数据。正是基于这一原理,Raft 一致性算法设计了一套数据同步机制,在 Leader 任期切换后能够重新同步上一个 quorum 被提交的所有数据,从而保证整个集群状态向前推进的过程中保持数据的一致。

3.png

etcd 内部的机制比较复杂,但 etcd 给客户提供的接口是简单直接的。如上图所示,我们可以通过 etcd 提供的客户端去访问集群的数据,也可以直接通过 http 的方式(类似 curl 命令)直接访问 etcd。在 etcd 内部,其数据表示也是比较简单的,我们可以直接把 etcd 的数据存储理解为一个有序的 map,它存储着 key-value 数据。同时 etcd 为了方便客户端去订阅数据的变更,也支持了一个 watch 机制,通过 watch 实时地拿到 etcd 中数据的增量更新,从而实现与 etcd 中的数据同步等业务逻辑。

API 介绍

接下来我们看一下 etcd 提供的接口,这里将 etcd 的接口分为了 5 组:

4.png

  • 第一组是 Put 与 Delete。上图可以看到 put 与 delete 的操作都非常简单,只需要提供一个 key 和一个 value,就可以向集群中写入数据了,删除数据的时候只需要指定 key 即可;
  • 第二组是查询操作。etcd 支持两种类型的查询:第一种是指定单个 key 的查询,第二种是指定的一个 key 的范围;
  • 第三组是数据订阅。etcd 提供了 Watch 机制,我们可以利用 watch 实时订阅到 etcd 中增量的数据更新,watch 支持指定单个 key,也可以指定一个 key 的前缀,在实际应用场景中的通常会采用第二种形势;
  • 第四组事务操作。etcd 提供了一个简单的事务支持,用户可以通过指定一组条件满足时执行某些动作,当条件不成立的时候执行另一组操作,类似于代码中的 if else 语句,etcd 确保整个操作的原子性;
  • 第五组是 Leases 接口。Leases 接口是分布式系统中常用的一种设计模式,其用法后面会具体展开。

数据版本机制

要正确使用 etcd 的 API,必须要知道内部对应数据版本号的基本原理。

首先 etcd 中有个 term 的概念,代表的是整个集群 Leader 的任期。当集群发生 Leader 切换,term 的值就会 +1。在节点故障,或者 Leader 节点网络出现问题,再或者是将整个集群停止后再次拉起,都会发生 Leader 的切换。

第二个版本号叫做 revision,revision 代表的是全局数据的版本。当数据发生变更,包括创建、修改、删除,其 revision 对应的都会 +1。特别的,在集群中跨 Leader 任期之间,revision 都会保持全局单调递增。正是 revision 的这一特性,使得集群中任意一次的修改都对应着一个唯一的 revision,因此我们可以通过 revision 来支持数据的 MVCC,也可以支持数据的 Watch。

对于每一个 KeyValue 数据节点,etcd 中都记录了三个版本:

  • 第一个版本叫做 create_revision,是 KeyValue 在创建时对应的 revision;
  • 第二个叫做 mod_revision,是其数据被操作的时候对应的 revision;
  • 第三个 version 就是一个计数器,代表了 KeyValue 被修改了多少次。

这里可以用图的方式给大家展示一下:

5.png

在同一个 Leader 任期之内,我们发现所有的修改操作,其对应的 term 值始终都等于 2,而 revision 则保持单调递增。当重启集群之后,我们会发现所有的修改操作对应的 term 值都变成了 3。在新的 Leader 任期内,所有的 term 值都等于3,且不会发生变化,而对应的 revision 值同样保持单调递增。从一个更大的维度去看,可以发现在 term=2 和 term=3 的两个 Leader 任期之间,数据对应的 revision 值依旧保持了全局单调递增。

mvcc & streaming watch

了解 etcd 的版本号控制后,接下来如何使用 etcd 多版本号来实现并发控制以及数据订阅(Watch)。

在 etcd 中支持对同一个 Key 发起多次数据修改,每次数据修改都对应一个版本号。etcd 在实现上记录了每一次修改对应的数据,也就就意味着一个 key 在 etcd 中存在多个历史版本。在查询数据的时候如果不指定版本号,etcd 会返回 Key 对应的最新版本,当然 etcd 也支持指定一个版本号来查询历史数据。

6.png

因为 etcd 将每一次修改都记录了下来,使用 watch 订阅数据时,可以支持从任意历史时刻(指定 revision)开始创建一个 watcher,在客户端与 etcd 之间建立一个数据管道,etcd 会推送从指定 revision 开始的所有数据变更。etcd 提供的 watch 机制保证,该 Key 的数据后续的被修改之后,通过这个数据管道即时的推送给客户端。

如下图所示,etcd 中所有的数据都存储在一个 b+tree 中(灰色),该 b+tree 保存在磁盘中,并通过 mmap 的方式映射到内存用来支持快速的访问。灰色的 b+tree 中维护着 revision 到 value 的映射关系,支持通过 revision 查询对应的数据。因为 revision 是单调递增的,当我们通过 watch 来订阅指定 revision 之后的数据时,仅需要订阅该 b+ tree 的数据变化即可。

7.png

在 etcd 内部还维护着另外一个 btree(蓝色),它管理着 key 到 revision 的映射关系。当客户端使用 key 查询数据时,首先需要经过蓝色的 btree 将 key 转化为对应的 revision,再通过灰色的 btree 查询到对应的数据。

细心的读者会发现,etcd 将每一次修改都记录下来会导致数据持续增长,这会带来内存及磁盘的空间消耗,同时也会影响 b+tree 的查询效率。为了解决这一问题,在 etcd 中会运行一个周期性的 Compaction 的机制来清理历史数据,将一段时间之前的同一个 Key 的多个历史版本数据清理掉。最终的结果是灰色的 b+tree 依旧保持单调递增,但可能会出现一些空洞。

mini-transactions

在理解了 mvcc 机制及 watch 机制之后,继续看 etcd 提供的 mini-transactions 机制。etcd 的 transaction 机制比较简单,基本可以理解为一段 if-else 程序,在 if 中可以提供多个操作,如下图所示:

8.png

If 里面写了两个条件,当 Value(key1) 大于 “bar” 并且 Version(key1) 的版本等于 2 的时候,执行 Then 里面指定的操作:修改 Key2 的数据为 valueX,同时删除 Key3 的数据。如果不满足条件,则执行另外一个操作:Key2 修改为 valueY。

在 etcd 内部会保证整个事务操作的原子性。也就是说 If 操作所有的比较条件,其看到的视图一定是一致的。同时它能够确保多个操作的原子性不会出现 Then 中的操作仅执行了一半的情况。

通过 etcd 提供的事务操作,我们可以在多个竞争中去保证数据读写的一致性,比如说前面已经提到过的 Kubernetes 项目,它正是利用了 etcd 的事务机制,来实现多个 KubernetesAPI server 对同样一个数据修改的一致性。

lease 的概念及用法

lease 是分布式系统中一个常见的概念,用于代表一个分布式租约。典型情况下,在分布式系统中需要去检测一个节点是否存活的时,就需要租约机制。

9.png

上图示例中的代码示例首先创建了一个 10s 的租约,如果创建租约后不做任何的操作,那么 10s 之后,这个租约就会自动过期。接着将 key1 和 key2 两个 key value 绑定到这个租约之上,这样当租约过期时 etcd 就会自动清理掉 key1 和 key2,使得节点 key1 和 key2 具备了超时自动删除的能力。

如果希望这个租约永不过期,需要周期性的调用 KeeyAlive 方法刷新租约。比如说需要检测分布式系统中一个进程是否存活,可以在进程中去创建一个租约,并在该进程中周期性的调用 KeepAlive 的方法。如果一切正常,该节点的租约会一致保持,如果这个进程挂掉了,最终这个租约就会自动过期。

在 etcd 中,允许将多个 key 关联在同一个 lease 之上,这个设计是非常巧妙的,可以大幅减少 lease 对象刷新带来的开销。试想一下,如果有大量的 key 都需要支持类似的租约机制,每一个 key 都需要独立的去刷新租约,这会给  etcd 带来非常大的压力。通过多个 key 绑定在同一个 lease 的模式,我们可以将超时间相似的 key 聚合在一起,从而大幅减小租约刷新的开销,在不失灵活性同时能够大幅提高 etcd 支持的使用规模。

三、典型的使用场景介绍

元数据存储

Kubernetes 将自身所用的状态存储在 etcd 中,其状态数据的高可用交给 etcd 来解决,Kubernetes 系统自身不需要再应对复杂的分布式系统状态处理,自身的系统架构得到了大幅的简化。

10.png

Server Discovery (Naming Service)

第二个场景是 Service Discovery,也叫做名字服务。在分布式系统中,通常会出现的一个模式就是需要多个后端(可能是成百上千个进程)来提供一组对等的服务,比如说检索服务、推荐服务。

11.png

对于这样一种后端服务,通常情况下为了简化后端服务的运维成本(节点故障时随时被替换),后端的这一进程会被类似 Kubernetes 这样的集群管理系统所调度,这样当用户(或上游服务)调用过来时,我们就需要一个服务发现机制来解决服务路由问题。这一服务发现问题可以利用 etcd 来高效解决,方式如下:

  • 在进程内部启动之后,可以将自身所在的地址注册到 etcd;
  • API 网关够通过 etcd 及时感知到后端进程的地址,当后端进程发生故障迁移时会重新注册到 etcd 中,API 网关也能够及时地感知到新的地址;
  • 利用 etcd 提供的 Lease 机制,如果提供服务的进程运行过程中出现了异常(crash),API 网关也可以摘除其流量避免调用超时。

在这一架构中,服务状态数据被 etcd 接管,API 网关本身也是无状态的,可以水平地扩展来服务更多的客户。同时得益于 etcd 的良好性能,可以支持上万个后端进程的节点,使得这一架构可以服务于大型的企业。

Distributed Coordination: leader election

在分布式系统中,有一种典型的设计模式就是 Master+Slave。通常情况下,Slave 提供了 CPU、内存、磁盘以及网络等各种资源 ,而 Master 用来调和这些节点以使其对外提供一个服务(比如分布式存储,分布式计算)。典型的分布式存储服务(HDFS)以及分布式计算服务(Hadoop)它们都是采用了类似这样的设计模式。这样的设计模式会有一个典型的问题:Master 节点的可用性。当 Master 故障以后,整个集群的服务就挂掉了,没有办法再服务用户的请求。

为了解决这个问题,典型的做法就是启动多个 Master 节点。因为 Master 节点内会包含控制逻辑,多个节点之间的状态同步是非常复杂的,这里最典型的做法就是通过选主的方式,选出其中一个节点作为主节点来提供服务,另一个节点处于等待状态。

12.png

通过 etcd 提供的机制可以很容易的实现分布式进程的选主功能,比如可以通过对同一个 key 的事务写来实现抢主的逻辑。一般而言,被选主的 Leader 会将自己的 IP 注册到 etcd 中,使得 Slave 节点能够及时获取到当前的 Leader 地址,从而使得系统按照之前单个 Master 节点的方式继续工作。当 Leader 节点发生异常之后,通过 etcd 能够选取出一个新的节点成为主节点,并且注册新的 IP 之后,Slave 又能够拉取新的主节点的 IP,继续恢复服务。

Distributed Coordination 分布式系统并发控制

在分布式系统中,当我们去执行一些任务,比如说去升级 OS、或者说升级 OS 上的软件的时候、又或者去执行一些计算任务的时候,出于对后端服务的瓶颈或者是业务稳定性的考虑,通常情况下需要控制任务的并发度。如果该任务缺少一个调和的 Master 节点,可以通过 etcd 来完成这样的分布式系统工作。

13.png

在这个模式中通过 etcd 去实现一个分布式的信号量,并且可以利用 etcd leases 机制来实现自动地剔除掉故障节点。在进程执行过程中,如果进程的运行周期比较长,我们可以将进程运行过程中的一些状态数据存储到 etcd,从而使得当进程故障之后且需要恢复到其他地方时,能够从 etcd 中去恢复一些执行状态,而不需要重新去完成整个的计算逻辑,以此来加速整个任务的执行效率。

本文总结

本文分享的主要内容就到此为止了,这里为大家简单总结一下:

  • 第一部分,为大家介绍了 etcd 项目是如何诞生的,以及在 etcd 发展过程中经历的几个重要时刻;
  • 第二部分,为大家介绍了 etcd 的架构以及其内部的基本操作接口,在理解 etcd 是如何实现高可用的基础之上,展示了 etcd 数据的一些基本操作以及其内部的实现原理;
  • 第三部分,介绍了三种典型的 etcd 使用场景,以及在对应的场景下,分布式系统的设计思路。

 阿里巴巴云原生微信公众号(ID:Alicloudnative)关注微服务、Serverless、容器、Service Mesh等技术领域、聚焦云原生流行技术趋势、云原生大规模的落地实践,做最懂云原生开发者的技术公众号。”

Kubernetes 时代的安全软件供应链

alicloudnative阅读(3484)评论(0)

本文节选自《不一样的 双11 技术:阿里巴巴经济体云原生实践》一书。

作者
汤志敏  阿里云容器服务高级技术专家
汪圣平  阿里云云平台安全高级安全专家

导读:从 Docker image 到 Helm, 从企业内部部署到全球应用分发,作为开发者的我们如何来保障应用的交付安全。本文会从软件供应链的攻击场景开始,介绍云原生时代的应用交付标准演进和阿里云上的最佳实践。

“没有集装箱,就不会有全球化”。在软件行业里,Docker 和 Kubernetes 也扮演了类似的角色,加速了软件行业的社会化分工和交付运维的效率。2013 年, Docker 公司提出了容器应用打包规范 Docker Image,帮助开发者将应用和依赖打包到一个可移植的镜像里。2015 年,Google 将 Kubernetes 捐献给 CNCF,进一步普及了大规模容器编排调度的标准。

Kubernetes 以一种声明式的容器编排与管理体系,屏蔽了底层基础架构的差异,让软件交付变得越来越标准化。随着 K8s 为代表的云原生技术的大规模运用,越来越多的容器化应用被分发到 IDC、公共云、边缘等全球各地。

在 2019 年,阿里云容器镜像服务 ACR 的月镜像下载量超过了 3 亿次。同年 10 月,阿里云云市场的容器镜像类目发布,越来越多的企业将其软件以容器的方式进行上架和销售。11 月,天猫 双11 的所有核心系统 100% 上云,容器镜像服务 ACR 除了支持 双11 的内部镜像托管以外,也将内部的能力在云上透出,支持更多的 双11 生态公司。

接下来我们看下如何保证容器和 Kubernetes 下的软件供应链安全,并先熟悉下软件供应链的常见攻击场景。

软件供应链攻击面和典型攻击场景

软件供应链通常包括三个阶段:

  • 软件研发阶段
  • 软件交付阶段
  • 软件使用阶段

在不同阶段的攻击面如下:

1.png

历史上著名的 APPLE Xcode IDE 工具攻击就是发生在软件研发阶段的攻击,攻击者通过向 Xcode 中注入恶意后门,在非官方网站提供下载,所有使用此 Xcode 的开发者编译出来的 APP 将被感染后门。同样著名的还有美国的棱镜门事件,亦是在大量的软件中植入后门程序,进行数据获取等恶意操作。

Kubernetes 中的软件供应链攻击面也包括在以上范围之中,以软件使用阶段为例,今年 RunC 漏洞 CVE-2019-5736,漏洞本身与 RunC 的运行设计原理相关,Container 之外的动态编译 Runc 被触发运行时会引用 Conainer 内部的动态库,造成 RunC 自身被恶意注入从而运行恶意程序,攻击者只需要在一个 Container 镜像中放入恶意的动态库和恶意程序,诱发受攻击者恶意下载运行进行模糊攻击,一旦受攻击者的 Container 环境符合攻击条件,既可完成攻击。

2.png

同样的攻击面还存在于 Kubernetes 自身服务组件之中,前段时间爆出的 HTTP2 CVE-2019-9512、CVE-2019-9514 漏洞就是一个非常好的软件研发阶段脆弱性的例子,漏洞存在于 GO 语言的基础 LIB 库中,任何依赖 GO 版本(<1.2.9)所编译的 KubernetesHTTP2 服务组件都受此漏洞影响,因此当时此漏洞影响了 K8s 全系列版本,攻击者可以远程 DOS Kubernetes API Server。同时在 Kubernetes 组件的整个交付过程中也存在着攻击面,相关组件存在被恶意替换以及植入的可能性。

不同于传统的软件供应链,镜像作为统一交付的标准如在容器场景下被大规模应用,因此关注镜像的使用周期可以帮助攻击者更好的设计攻击路径。

3.png

攻击者可以在镜像生命周期的任何一个阶段对镜像进行污染,包括对构建文件的篡改、对构建平台的后门植入、对传输过程中的劫持替换和修改、对镜像仓库的攻击以替换镜像文件、对镜像运行下载和升级的劫持攻击等。

整个攻击过程可以借助云化场景中相关的各种依赖,如 Kubernetes 组件漏洞、仓库的漏洞,甚至基础设施底层漏洞。对于防御者来说,对于镜像的整个生命周期的安全保障,是容器场景中攻击防范的重中之重。

云原生时代的应用交付标准演进(从 Image 到 Artifacts)

在云原生时代之前,应用交付的方式比较多样化,比如脚本、RPM 等等。而在云原生时代,为了屏蔽异构环境的差异,提供统一的部署抽象,大家对应用交付标准的统一也迫切起来。

Helm

Helm 是 Kubernetes 的包管理工具,它提出了 Chart 这个概念。

  • 一个 Chart 描述了一个部署应用的多个 Kubernetes 资源的 YAML 文件,包括文档、配置项、版本等信息;
  • 提供 Chart 级别的版本管理、升级和回滚能力。

CNAB

CNAB 是 Docker 和微软在 2018 年底联合推出平台无关的 Cloud Native Application Bundle 规范。相比于 Helm,有额外几个定义:

  • 在 thick 模式时,CNAB 的 bundle 可以包含依赖的镜像二进制,从而不需要额外去镜像仓库下载,作为一个整体打包;
  • CNAB 定义了扩展的安全标准,定义了 bundle 的签名(基于 TUF )和来源证明(基于 In-Toto)描述;
  • CNAB 的部署是平台无关性,可以部署在 K8s 之上,也可以通过 terraform 等方式来部署。

CNAB 的这些特性,可以在可信软件分发商与消费者之间进行跨平台(包括云和本地 PC)的应用打包和分发。

4.png

OCI Artifacts

2019 年 9 月,开放容器标准组织(OCI)在 OCI 分发标准之上,为了支持更多的分发格式,推出了 OCI Artifacts 项目来定义云原生制品(Cloud Native Artifacts)的规范。我们可以通过扩展 media-type 来定义一种新的 Artifacts 规范,并通过标准的镜像仓库来统一管理。

Kubernetes 时代的安全软件供应链

在之前章节也提到过,相对于传统软件的安全软件供应链管理,容器和 Kubernetes 的引入使得:

  • 发布和迭代更加频繁,容器的易变性也使得安全风险稍纵即逝;
  • 更多的不可控三方依赖,一旦一个底层基础镜像有了安全漏洞,会向病毒一样传递到上层;
  • 更大范围的全球快速分发,在分发过程中的攻击也会使得在末端执行的时造成大规模安全风险。

在传统的软件安全和安全准则之上,我们可以结合一些最佳实践,沉淀一个新的端到端安全软件供应链:

5.png

我们来看一些和安全软件供应链相关的社区技术进展:

Grafeas

2017 年 10 月,Google 联合 JFrog、IBM 等公司推出了 Grafeas。Grafeas(希腊语中的”scribe”)旨在定义统一的方式来审核和管理现代软件供应链,提供云原生制品的元数据管理能力。可以使用 Grafeas API 来存储,查询和检索有关各种软件组件的综合元数据,包括合规和风险状态。

6.png

In-toto

In-toto 提供了一个框架或策略引擎来保护软件供应链的完整性

通过验证链中的每个任务是否按计划执行(仅由授权人员执行)以及产品在运输过程中未被篡改来做到这一点。In-toto 要求项目所有者创建布局 (Layout)。布局列出了软件供应链的步骤 (Step) 顺序,以及授权执行这些步骤的工作人员。当工作人员执行跨步操作时,将收集有关所使用的命令和相关文件的信息,并将其存储在链接 (Link) 元数据文件中。通过在完整的供应链中定义每个 Step,并对 Step 进行验证,可以充分完整的完整整个供应链的安全。

Kritis

为强化 Kubernetes 的安全性,Google 引入了二进制授权 (Binary Authorization),确保使用者只能将受信任的工作负责部署到 Kubernetes 中。二进制授权可以基于 Kubernetes 的 Admission Controller 来插入部署准入检测,让只有授权后的镜像在环境中运作。

下图为一个策略示例:

7.png

同时对于在安全软件供应链中占比很大的第三方软件,需要有完善的基线机制和模糊安全测试机制来保障分发过程中的安全风险,避免带已知漏洞上线,阿里云正在与社区积极贡献帮助演进一些开源的工具链。

关于基础镜像优化、安全扫描、数字签名等领域也有非常多的工具和开源产品,在此不一一介绍。

云端的安全软件供应链最佳安全实践

在阿里云上,我们可以便捷地基于容器服务 ACK、容器镜像服务 ACR、云安全中心打造一个完整的安全软件供应链。

安全软件供应链全链路以云原生应用托管为始,以云原生应用分发为终,全链路可观测、可追踪、可自主设置。可以帮助安全需求高、业务多地域大规模部署的企业级客户,实现一次应用变更,全球化多场景自动交付,极大提升云原生应用交付的效率及安全性。

8.png

在云原生应用的安全托管阶段,容器镜像服务 ACR 支持容器镜像、Helm Chart 等云原生资产的直接上传托管;也支持从源代码(Github、Bitbucket、阿里云 Code、GitLab 来源)智能构建成容器镜像。在安全软件供应用链中,支持自动静态安全扫描并自定义配置安全阻断策略。一旦识别到静态应用中存在高危漏洞后,可自动阻断后续部署链路,通知客户失败的事件及相关漏洞报告。客户可基于漏洞报告中的修复建议,一键更新优化构建成新的镜像版本,再次触发自动安全扫描。

  • 在云原生应用的分发阶段,当安全漏洞扫描完成且应用无漏洞,应用将被自动同步分发至全球多地域。

由于使用了基于分层的调度、公网链路优化以及免公网入口开启的优化,云原生应用的全球同步效率,相比本地下载后再上传提升了 7 倍。云原生应用同步到全球多地域后,可以自动触发多场景的应用重新部署,支持在 ACK、ASK、ACK@Edge 集群中应用自动更新。针对集群内大规模节点分发场景,可以实现基于镜像快照的秒级分发,支持 3 秒 500 Pod 的镜像获取,实现业务在弹性场景下的极速更新。

  • 在云原生应用运行阶段,可实现基于云安全中心的应用运行时威胁检测与阻断,实时保障每个应用 Pod 的安全运行。

云安全中心基于云原生的部署能力,实现威胁的数据自动化采集、识别、分析、响应、处置和统一的安全管控。利用多日志关联和上下文分析方案,实时检测命令执行、代码执行、SQL 注入、数据泄露等风险,覆盖业务漏洞入侵场景。结合 K8s 日志和云平台操作日志实时进行行为审计和风险识别,实现容器服务和编排平台存在的容器逃逸、AK 泄露、未授权访问风险。

总结

随着云原生的不断发展,云原生应用也会在安全、交付、全球分发等领域持续演进。我们可以预见一个新的时代:越来越多的大型软件以积木的方式由全球开发者独立开发而最终合并组装。

点击下载《不一样的 双11 技术:阿里巴巴经济体云原生实践》

ban.jpg

 

本书亮点

  • 双11 超大规模 K8s 集群实践中,遇到的问题及解决方法详述
  • 云原生化最佳组合:Kubernetes+容器+神龙,实现核心系统 100% 上云的技术细节
  • 双 11 Service Mesh 超大规模落地解决方案

阿里巴巴云原生微信公众号(ID:Alicloudnative)关注微服务、Serverless、容器、Service Mesh等技术领域、聚焦云原生流行技术趋势、云原生大规模的落地实践,做最懂云原生开发者的技术公众号。”