当前位置: 首页 > news >正文

k8s系列(一)——什么是云原生

缘由

在写此系列文章之前,我做了3年的Java开发,后来因为项目的变动,接触了大约半年的k8s相关东西,零零散散,似懂非懂的,而且在日常开发中,经常会卡壳,问人总会被怼,所以自己索性来系统的学学大名鼎鼎的k8s,为日后自己的职业规划做一些打算。

本篇作为k8s系列文章的开篇,主要介绍了什么是云原生、k8s的引入以及云原生未来如何。

另外:

由于【kubbernetes中文指南】书中对这块的介绍太好了,大部分内容是原封不动的搬运过来的,各位如果有兴趣的可以看看此书,强烈推荐!!!

我在这里贴出电子版的地址,大家可放心食用。
Kubernetes 中文指南——云原生应用架构实战手册

什么是云原生

为了解决传统应用升级缓慢、架构臃肿、不能快速迭代、故障不能快速定位、问题无法快速解决等问题,云原生这一概念横空出世。

另外,云原生也很好地解释了云上运行的应用应该具备什么样的架构特性 —— 敏捷性、可扩展性、故障可恢复性。

在【kubbernetes中文指南】一书中提到:

云原生是一种行为方式和设计理念,究其本质,凡是能够提高云上资源利用率应用交付效率的行为或方式都是云原生的。

Kubernetes 开启了云原生的序幕,服务网格 Istio 的出现,引领了后 Kubernetes 时代的微服务,Serverless 的兴起,使得云原生从基础设施层不断向应用架构层挺进。

云原生技术有利于各组织在公有云、私有云和混合云等新型动态环境中,构建和运行可弹性扩展的应用。

云原生的代表技术包括 容器服务网格微服务不可变基础设施声明式 API。这些技术能够构建容错性好、易于管理和便于观察的松耦合系统。结合可靠的自动化手段,云原生技术使工程师能够轻松地对系统作出频繁和可预测的重大变更。

可能看起来有点晦涩难懂,我在这里说一下自己的理解:

所谓的原生,指的利用Java,php,c,c++,python等等开发语言开发出来的应用,应用需要部署到服务器上;而指的是云服务器,那么云原生结合起来就是原生应用上云的过程,以及上云的一系列解决方案。

云原生不局限于 Kubernetes,还包括以下几大主题:

  • 云原生开源组件
  • 云原生应用与微服务架构
  • 基于 Kubernetes 的服务网格(Service Mesh)架构

cloud-native-architecutre-mindnode.jpg

其设计理念如下:

  • 面向分布式设计(Distribution):容器、微服务、API 驱动的开发;

  • 面向配置设计(Configuration):一个镜像,多个环境配置;

  • 面向韧性设计(Resistancy):故障容忍和自愈;

  • 面向弹性设计(Elasticity):弹性扩展和对环境变化(负载)做出响应;

  • 面向交付设计(Delivery):自动拉起,缩短交付时间;

  • 面向性能设计(Performance):响应式,并发和资源高效利用;

  • 面向自动化设计(Automation):自动化的 DevOps;

  • 面向诊断性设计(Diagnosability):集群级别的日志、metric 和追踪;

  • 面向安全性设计(Security):安全端点、API Gateway、端到端加密;

综上所述,云原生应用应该具备以下几个关键词:

  • 敏捷
  • 可靠
  • 高弹性
  • 易扩展
  • 故障隔离保护
  • 不中断业务持续更新

以上特性也是云原生区别于传统云应用的优势特点。

从宏观概念上讲,云原生是不同思想的集合,集目前各种热门技术之大成。

Kubernetes 与云原生的关系

Kuberentes 可以说是乘着 Docker 和微服务的东风,一经推出便迅速蹿红,它的很多设计思想都契合了微服务和云原生应用的设计法则,这其中最著名的就是开发了 Heroku PaaS 平台的工程师们总结的 Twelve-factor App 了。

下面讲解 Kubernetes 设计时是如何按照了十二因素应用法则,并给出 Kubernetes 中的应用示例,并附上一句话简短的介绍。

Kubernetes 介绍

Kubernetes 是 Google 基于 Borg 开源的容器编排调度引擎,作为 CNCF(Cloud Native Computing Foundation)最重要的组件之一,它的目标不仅仅是一个编排系统,而是提供一个规范,可以让你来描述集群的架构,定义服务的最终状态,Kubernetes 可以帮你将系统自动得达到和维持在这个状态。

更直白的说,Kubernetes 用户可以通过编写一个 YAML 或者 json 格式的配置文件,也可以通过工具 / 代码生成或直接请求 Kubernetes API 创建应用,该配置文件中包含了用户想要应用程序保持的状态,不论整个 Kubernetes 集群中的个别主机发生什么问题,都不会影响应用程序的状态,你还可以通过改变该配置文件或请求 Kubernetes API 来改变应用程序的状态。

因素应用

12 因素应用提出已经有几年的时间了,每个人对其可能都有自己的理解,切不可生搬硬套,也不一定所有云原生应用都必须符合这 12 条法则,其中有几条法则可能还有点争议,有人对其的解释和看法不同。

大家不要孤立的来看这每一个因素,将其与自己软件开发流程联系起来,这 12 个因素大致就是按照软件从开发到交付的流程顺序来写的。

12-factor-app.png

1. 基准代码

每个代码仓库(repo)都生成 docker image 保存到镜像仓库中,并使用唯一的 ID 管理,在 Jenkins 中使用编译时的 ID。

2. 依赖

显式的声明代码中的依赖,使用软件包管理工具声明,比如 Go 中的 Glide。

3. 配置

将配置与代码分离,应用部署到 Kubernetes 中可以使用容器的环境变量或 ConfigMap 挂载到容器中。

4. 后端服务

把后端服务当作附加资源,实质上是计算存储分离和降低服务耦合,分解单体应用。

5. 构建、发布、运行

严格分离构建和运行,每次修改代码生成新的镜像,重新发布,不能直接修改运行时的代码和配置。

6. 进程

应用程序进程应该是无状态的,这意味着再次重启后还可以计算出原先的状态。

7. 端口绑定

在 Kubernetes 中每个 Pod 都有独立的 IP,每个运行在 Pod 中的应用不必关心端口是否重复,只需在 service 中指定端口,集群内的 service 通过配置互相发现。

8. 并发

每个容器都是一个进程,通过增加容器的副本数实现并发。

9. 易处理

快速启动和优雅终止可最大化健壮性,Kuberentes 优秀的 Pod 生存周期控制。

10. 开发环境与线上环境等价

在 Kubernetes 中可以创建多个 namespace,使用相同的镜像可以很方便的复制一套环境出来,镜像的使用可以很方便的部署一个后端服务。

11. 日志

把日志当作事件流,使用 stdout 输出并收集汇聚起来,例如到 ES 中统一查看。

12. 管理进程

后台管理任务当作一次性进程运行,kubectl exec 进入容器内部操作。

另外,Cloud Native Go 这本书的作者,CapitalOne 公司的 Kevin Hoffman 在 TalkingData T11 峰会上的 High Level Cloud Native 的演讲中讲述了云原生应用的 15 个因素,在原先的 12 因素应用的基础上又增加了如下三个因素:

API 优先

  • 服务间的合约
  • 团队协作的规约
  • 文档化、规范化
  • RESTful 或 RPC

监控

  • 实时监控远程应用
  • 应用性能监控(APM)
  • 应用健康监控
  • 系统日志
  • 不建议在线 Debug

认证授权

  • 不要等最后才去考虑应用的安全性
  • 详细设计、明确声明、文档化
  • Bearer token、OAuth、OIDC 认证
  • 操作审计

云原生的未来

要想搞明云原生的未来,首先我们要弄明白云原生是什么。CNCF 最初给出的定义是:

  • 容器化
  • 微服务
  • 容器可以动态调度

我认为云原生实际上是一种理念或者说是方法论,它包括如下四个方面:

  • 容器化:作为应用包装的载体
  • 持续交付:利用容器的轻便的特性,构建持续集成和持续发布的流水线
  • DevOps:开发与运维之间的协同,上升到一种文化的层次,能够让应用快速的部署和发布
  • 微服务:这是应用开发的一种理念,将单体应用拆分为微服务才能更好的实现云原生,才能独立的部署、扩展和更新

一句话解释什么是云原生应用:云原生应用就是为了在云上运行而开发的应用。

Kubernetes的引入

Kubernetes:云原生操作系统

00704eQkgy1frr4z08j6oj31p20w2n6n.jpg

要运行这样的应用必须有一个操作系统,就像我们运行PC或手机应用一样,而Kubernetes就是一个这样的操作系统。

下面是CNCF给出的云原生景观图。

00704eQkgy1frr53j3aiuj32fs1dc7wi.jpg

该图中包括云原生的各种层次的提供者和应用,通过该图可以组合出一些列的云原生平台。

  • IaaS云提供商(公有云、私有云)
  • 配置管理,提供最基础的集群配置
  • 运行时,包括存储和容器运行时、网络等
  • 调度和管理层,协同和服务发现、服务管理
  • 应用层

也可以有平台提供以上所有功能,还可以有提供可观测性、分析和扩展应用。

看到这个景观图,大家觉得Kubernetes真的还只做了容器编排吗?实际上它是制定了一个标准。就像一个系统一样,所有的应用和插件都是基于它来构建的。

开始之前

希望您掌握以下知识和准备以下环境:

知识:

  1. Linux 操作系统原理;
  2. Linux 常用命令;
  3. Docker 容器原理及基本操作;
  4. 了解常用的中间件,比如Nginx,MySQL,Redis等;
  5. 云平台相关概念以及操作。

环境:

  1. 多台云服务器,安装Docker。

相关文章:

  • 【JVM】内存快照分析工具Jprofiler
  • Linux 内核参数:min_free_kbytes
  • SpringBoot中使用(@NotEmpty、@NotBlank、@NotNull)注解校验实体类参数
  • 两化融合贯标办理周期和好处是什么
  • 基于双碳背景和趋势讲述AcrelEMS企业微电网能效管理系统-Susie 周
  • PYQT5实现图片显示、通过滚轮缩放图片、通过鼠标拖动图片移动,搞懂所有细节
  • 利用MATLAB绘制箱线图—箱线图在高光谱图像处理中的应用
  • ERPS协议学习笔记
  • node.js基于微信小程序的校园失物招领系统毕业设计源码072343
  • 1.4 Elasticsearch索引的mappings映射
  • ams启动过程以及App的启动过程
  • Java毕业设计-新闻段子发布管理系统
  • maven依赖冲突导致tomcat启动失败
  • Mysql基础(四)——约束与表关系
  • 聚苯乙烯微球表面原位接枝含糖聚合物/pH响应性磁性聚苯乙烯基多孔微球制备方法
  • [译]CSS 居中(Center)方法大合集
  • C# 免费离线人脸识别 2.0 Demo
  • CAP 一致性协议及应用解析
  • HTTP那些事
  • JavaScript设计模式与开发实践系列之策略模式
  • mysql_config not found
  • Python实现BT种子转化为磁力链接【实战】
  • Swift 中的尾递归和蹦床
  • Vue小说阅读器(仿追书神器)
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 复习Javascript专题(四):js中的深浅拷贝
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 近期前端发展计划
  • 学习JavaScript数据结构与算法 — 树
  • 一个项目push到多个远程Git仓库
  • 异常机制详解
  • elasticsearch-head插件安装
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • # 飞书APP集成平台-数字化落地
  • #考研#计算机文化知识1(局域网及网络互联)
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • $$$$GB2312-80区位编码表$$$$
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (12)目标检测_SSD基于pytorch搭建代码
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (篇九)MySQL常用内置函数
  • (算法)N皇后问题
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .Family_物联网
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .NET Core 2.1路线图
  • .Net 中Partitioner static与dynamic的性能对比
  • .NET 中的轻量级线程安全