云原生技术全攻略:从新手到专家

发表时间: 2022-06-30 16:25

一,云原生(CloudNative)是什么

CNCF(云原生计算基金会)定义:

云原生技术有利于各组织在公有云、私有云和混合云等新型动态环境中,构建和运行可弹性扩展的应用。云原生的代表技术包括容器、服务网格、微服务、不可变基础设施和声明式API。

这些技术能够构建容错性好、易于管理和便于观察的松耦合系统。结合可靠的自动化手段,云原生技术使工程师能够轻松地对系统作出频繁和可预测的重大变更。

云原生计算基金会(CNCF)致力于培育和维护一个厂商中立的开源生态系统,来推广云原生技术。我们通过将最前沿的模式民主化,让这些创新为大众所用。

从字面意思理解: 应用原生被设计为在云上以最佳方式运行。

个人的理解: 在云平台时代,各种中间件,基础服务都在云上运行,而开发应用不在过多考虑这些基础应用,而是更多专注于业务.换句话说,云原生应用从开发到部署都是基于云产品开箱即用的特性,充分利用云平台的分布式和可伸缩特性。云原生是一整套体系,包含了从开发,部署到运维的完整技术栈.

总而言之,符合云原生架构的应用程序应该是:采用开源堆栈(K8S+Docker)进行容器化,基于微服务架构提高灵活性和可维护性,借助敏捷方法、DevOps支持持续迭代和运维自动化,利用云平台设施实现弹性伸缩、动态调度、优化资源利用率。

云原生构建应用简便快捷,部署应用轻松自如、运行应用按需伸缩。优点不一而足,缺点微乎其微;秒杀传统Web框架,吊打祖传IT模式,实在是保命、评优晋级不可多得的终极绝密武器。

二,云原生应用的特点

云原生应用基于云平台产生,具有云平台产品的通用特性.

  • 弹性可伸缩 根据业务需求,业务量按需弹性扩展应用
  • 快速部署 基于云平台可快速发布,快速应用于生产
  • 分布式
  • 高效持续迭代

总的来说,对于传统应用,云原生应用从诞生就可以直接在云上运行,而无需考虑服务器,中间件,第三方组件等资源.

三,云原生技术概述

云原生是一整套技术体系,涵盖了从开发到部署运维:

核心元素分为四块

3.1 微服务

微服务技术:几乎每个云原生的定义都包含微服务,跟微服务相对的是单体应用,微服务有理论基础,那就是康威定律,指导服务怎么切分,很玄乎,凡是能称为理论定律的都简单明白不了,不然就忒没b格,大概意思是组织架构决定产品形态,不知道跟马克思的生产关系影响生产力有无关系。

微服务架构的好处就是按function切了之后,服务解耦,内聚更强,变更更易;另一个划分服务的技巧据说是依据DDD来搞。

  • SpringBoot
  • SpringCloud
  • SpringCloudAlibaba
  • Dubbo

3.2 容器化

Docker是应用最为广泛的容器引擎,在思科谷歌等公司的基础设施中大量使用,是基于LXC技术搞的,容器化为微服务提供实施保障,起到应用隔离作用,K8S是容器编排系统,用于容器管理,容器间的负载均衡,谷歌搞的,Docker和K8S都采用Go编写,都是好东西。

  • Docker容器化技术
  • Kubernetes容器编排技术

3.3 DevOps

这是个组合词,Dev+Ops,就是开发和运维合体,不像开发和产品,经常刀刃相见,实际上DevOps应该还包括测试,DevOps是一个敏捷思维,是一个沟通文化,也是组织形式,为云原生提供持续交付能力。

  • dev就是开发,ops就是运维
  • DevOps就是构建从开发到运维的自动化流程技术
  • DevOps也是一个技术栈,例如git,Jenkins,无

3.4 持续交付

持续交付是不误时开发,不停机更新,小步快跑,反传统瀑布式开发模型,这要求开发版本和稳定版本并存,其实需要很多流程和工具支撑。

持续交付与DevOps的含义很相似,所以经常被混淆。但是它们是不同的两个概念。DevOps的范围更广,它以文化变迁为中心,特别是软件交付过程所涉及的多个团队之间的合作(开发、运维、QA、管理部门等),并且将软件交付的过程自动化。另一方面,持续交付是一种自动化交付的手段,关注点在于将不同的过程集中起来,并且更快、更频繁地执行这些过程。因此,DevOps可以是持续交付的一个产物,持续交付直接汇入DevOps。硬分的话,我将DevOps看作自动化流程的技术,将持续交付看作一种概念,DevOps是一种实现.

如何云原生?

首先,云原生借了云计算的东风,没有云计算,自然没有云原生,云计算是云原生的基础。

随着虚拟化技术的成熟和分布式框架的普及,在容器技术、可持续交付、编排系统等开源社区的推动下,以及微服务等开发理念的带动下,应用上云已经是不可逆转的趋势。

云计算的3层划分,即基础设施即服务(IaaS)、平台即服务(PaaS)、软件即服务(SaaS)为云原生提供了技术基础和方向指引,真正的云化不仅仅是基础设施和平台的变化,应用也需要做出改变,摈弃传统的土方法,在架构设计、开发方式、部署维护等各个阶段和方面都基于云的特点,重新设计,从而建设全新的云化的应用,即云原生应用。

1.本地部署的传统应用往往采用c/c++、企业级java编写,而云原生应用则需要用以网络为中心的go、node.js等新兴语言编写。

2.本地部署的传统应用可能需要停机更新,而云原生应用应该始终是最新的,需要支持频繁变更,持续交付,蓝绿部署。

3.本地部署的传统应用无法动态扩展,往往需要冗余资源以抵抗流量高峰,而云原生应用利用云的弹性自动伸缩,通过共享降本增效。

4.本地部署的传统应用对网络资源,比如ip、端口等有依赖,甚至是硬编码,而云原生应用对网络和存储都没有这种限制。

5.本地部署的传统应用通常人肉部署手工运维,而云原生应用这一切都是自动化的。

6.本地部署的传统应用通常依赖系统环境,而云原生应用不会硬连接到任何系统环境,而是依赖抽象的基础架构,从而获得良好移植性。

7.本地部署的传统应用有些是单体(巨石)应用,或者强依赖,而基于微服务架构的云原生应用,纵向划分服务,模块化更合理。

可见,要转向云原生应用需要以新的云原生方法开展工作,云原生包括很多方面:基础架构服务、虚拟化、容器化、容器编排、微服务。幸运的是,开源社区在云原生应用方面做出了大量卓有成效的工作,很多开源的框架和设施可以通过拿来主义直接用,2013年Docker推出并很快成为容器事实标准,随后围绕容器编排的混战中,2017年诞生的k8s很快脱颖而出,而这些技术极大的降低了开发云原生应用的技术门槛。

学习云原生的建议

在学习云原生技术之前,首先需要了解以下几点:

初学者在学习时,看再多云原生的历史沿革、优势好处以及涉及到哪些技术方向,听再多大佬的“夸夸其谈”,都不如自己动手实践,从部署上线几个应用开始;

云原生是一个技术的“时代”,不是某一个的职业或技术产品,而不同的职业方向与目的,学习的内容也会有很大差异;而其中Docker和Kubernetes是云原生的两个核心基础产品,值得所有方向的技术人员、工程师及早开始学习;

网络上很多云原生课程虽然都是大厂宝贵的经验,但是大多数内容都是写给运维工程师和架构师看的,不太适合新手学习,需先掌握基础后再来进阶;

如何学习云原生?

学习云原生技术时,建议在本地安装部署好 Docker 环境、Kubernetes 集群以及使用云服务商提供的线上托管 Kubernetes(如腾讯云容器服务TKE、弹性容器服务 EKS)搭配来学习,这才贴近企业实际生产时的真实环境。

可以先从 Docker 开始学起,Docker 是一个非常容易呈现效果和结果的工具,在粗略了解了容器、镜像和镜像仓库的情况下,只需要几行命令就能启动一些“看得见”的应用程序。Docker的核心思想就是如何将应用整合到容器中,并且能在容器中实际运行。这个整合并运行的过程就是“容器化”。

容器化主要分为以下几个步骤:

  1. 编写应用的代码,应用要能在本地环境正常运行;
  2. 创建一个 Dockerfile ,Dockerfile包含对当前应用的描述、依赖以及该如何运行这个应用;比如基础的base环境,系统组件的安装(如apk add, apt install等)、应用代码的拷贝、业务系统依赖的安装(php composer, npm install 等)、分层、stage构建等;
  3. 对Dockerfile执行docker build命令将项目源代码打包成镜像;
  4. 将镜像分发到容器镜像服务,如 http://hub.docker.com 或使用腾讯云镜像服务等;
  • 创建本地集群和托管集群
  • 使用 kubectl 来创建Depoyment部署应用
  • 学会查看 pod 和工作节点
  • 使用 Service 公开地暴露你的应用
  • 使用 Kubectl 实现应用的扩缩容
  • 使用 kubectl 执行滚动更新
  • 使用 ConfigMaps、Secrets 实现外部化应用配置
  • 了解有状态应用程序和无状态应用程序
  • 了解如何限制容器对资源的访问和系统的调用

尽管 Docker 和 Kubernetes 官方技术文档是一个不错的入门教程,但是仍然存在很多新手不可避免的一些“坑”,让原本简单且有意思的动手变得艰难,有的人甚至连安装配置环境就阻力重重。


详读K8s官方技术文档

无疑,官方技术文档是最为重要的学习参考资料,其中比较重要的是比较侧重于原理描述的【概念(concepts)】部分和比较侧重于案例实战部署的【任务tasks】部分。

值得一提的是,技术文档;不像教程,它没有按照重要程度和难易程度排序,同时有些内容可能在你工作中并不会用到,所以要有侧重点地去学习。学习时可以先从【任务tasks】部分的实战案例入手,比如【运行应用】、【配置Pods和容器】、【管理Kubernetes对象】、【给应用注入数据】、【访问集群中的应用】、【管理Secrets】等章节的案例都值得动手实战一下。

在实战的过程中,再去理解【概念(concepts)】部分关于架构、概念等的描述,就不会显得那么晦涩了。尤其是【概念(concepts)】关于Kubernetes架构,容器,工作负载,服务、负载均衡和联网,存储,配置,安全,策略,调度、抢占和驱逐等相关的内容。

在这个阶段的学习中,要熟悉掌握使用配置文件对各种Kubernetes资源对象进行声明式管理,并能部署并运行多种类型的应用程序(工作负载)。

4、最佳实践与云原生核心技术

云原生最终还是要应用到企业的生产实践当中,为企业的降本增效助力,这里有一份云原生在企业落地的路径图,详细列出了每个阶段的核心要点以及涉及到的一些云原生技术产品,因此对云原生的系统学习,也不能只停留在Docker和Kubernetes上:

  • 1、容器化;
  • 2、CI/CD;
  • 3、容器编排与应用部署;
  • 4、可观测与分析
  • 5、代理,服务发现与服务网格
  • 6、网络、网络策略与安全
  • 7、分布式数据库与存储
  • 8、流式数据与消息
  • 9、容器仓库与运行时
  • 10、应用分发

这份云原生企业落地路径图,基本囊括了以“云原生应用为中心”的云原生比较关键的技术领域,而这些都在CNCF对云原生应用的定义里有所概括:

  • 云原生应用的DevOps,包括镜像打包、配置、CI/CD、流式数据与消息、存储以及数据库等;
  • 云原生应用的编排与管理,包括了应用编排与调度、服务发现治理、远程调用、API网关以及服务网格;
  • 云原生应用的监控与可观测性,比如云原生应用的状态监控、日志收集、链路追踪以及混沌工程;
  • 云原生的底层技术,比如容器运行时、云原生存储技术、云原生网络技术、云原生安全技术等。
  • 云原生组件,云原生有着非常丰富的技术产品生态,比如Helm、etcd、Cilium、Prometheus等。

这些环节环环相扣,而且每一个环节都涉及到大量企业最佳实践方面的知识,而这些重要的知识相对来说就零散很多,比如各大云服务商提供的官方技术文档、大厂高级工程师撰写的技术文章里,或者一些云原生大会上。

CNCF

要系统了解云原生的一些开源产品,就不得不提到云原生基金会CNCF。CNCF列出了一份云原生相关领域的全景图,详细列出了应用部署与镜像打包、容器的调度与编排、RPC、服务治理、存储与数据库等等相关领域的开源技术产品,可以给我们进一步学习指明方向。

云原生的不同方向与参考书籍

前面已经说过,不同职业方向需要掌握的内容存在比较大的差异,云原生基本可以分为云原生运维与安全(运维工程师)、云原生开发工程师(Golang)、云原生架构师、云原生应用开发(广大程序员)等方向。

在掌握了大致掌握和了解了关于Docker和Kubernetes相关内容的情况下,不同的职业方向还可以阅读一下以下书籍作为参考。推荐的书大多都是计算机行业比较推崇的O'reilly和Manning出品的。

1、云原生运维与架构

云原生运维与架构主要聚焦于云原生系统的设计与交付,通过监控统计、自动化等方式维护系统的高并发、高可用、可伸缩性、安全性等。云原生运维有着一些全新的工具和方法论,比较明显地提高了传统运维的技术门槛,也对传统架构提出了新的挑战。

除了需要关注Prometheus、etcd、istio、Terraform等产品的技术文档以及实践外,比较推荐的书籍如下:

  • 《基于Kubernetes的云原生DevOps》
  • 《Kubernetes in Action》
  • 《云原生模式》
  • 《Kubernetes设计模式》(Kubernetes Patterns)
  • 《Terraform:多云、混合云环境下实现基础设施即代码(第2版)》

SRE还可以阅读一下运维之道、运维解密、工作手册、生存指南,这几本书基本都与Google SRE相关。

2、云原生开发工程师(Golang)

云原生开发工程师除了比较核心的操作系统、网络相关的知识外,还需要掌握云原生时代的“C语言”Golang,同时需要了解Kubernetes编程和源码相关的知识。

  • 《Kubernetes编程》(Programming Kubernetes)
  • 《Kubernetes源码剖析》
  • 《Kubernetes操作器》(Kubernetes Operators)

3、云原生应用开发

云原生应用开发一般来说主要是广大程序员的事情,云原生应用并不限于某一门编程语言,无论是Java、Python、Golang、PHP、前端开发等,需要掌握的是Docker与容器化(重点)、Kubernetes基础操作(基本入门就行)、微服务、GitOps等相关的内容,所学内容其实并不多,大部分都是交给工具和平台来搞定。

  • 《Docker实战(第2版)》(Docker in Action),清华大学出版社
  • 《深入剖析Kubernetes》(其实这是一本入门的书籍)
  • 《云原生Java》

附带学习路线: