前言
前面看了一些关于devops方面的知识,很多文章都提到了云原生。但我对云原生一直都是很迷糊,所以有了这篇文章。
由于本人水平有限,文章中可能会出现一些错误,欢迎各位大佬指正,感激不尽。如果有什么好的想法也欢迎交流~~
云原生安全是什么?
现在云原生很火,好像你还不懂云原生,就真的out了。每个人对于云原生都能说上两句,但是你要问他云原生的明确定义是什么,那么大部分人可能都回到不上来,这是因为云原生本来就没有一个明确的定义,随着时间其定义也在不断地变化。
从字面上看云原生(CloudNative)包含两个方面:云,原生。云很好理解,就是表示应用上云,那么到底原生指的是什么?
云:表示应用程序位于云中,而不是传统的数据中心
原生:表示应用程序从设计之初即考虑到云的环境,原生为云而设计,在云上以最佳姿势运行,充分利用和发挥云平台的弹性+分布式优势
云原生是一种构建和运行应用程序的方法,是一套技术体系和方法论。
总而言之,符合云原生架构的应用程序应该是:采用开源堆栈(K8S+Docker)进行容器化,基于微服务架构提高灵活性和可维护性,借助敏捷方法、DevOps支持持续迭代和运维自动化,利用云平台设施实现弹性伸缩、动态调度、优化资源利用率。
云原生也是在不断地变化中,不同的时期对其的定义可能也不同。用一句话来说,云原生就是为了适应云环境而出现的一种技术架构,可以充分利用云环境进行弹性扩展收缩(其实未必是说一定要k8s+docker)
云原生与devops
云原生经常和devops两个放到一起说,那么这两者到底有什么区别?
DevOps是一种开发理念,强调的是快速集成快速部署。devops不强调一定要上云,用容器。而云原生一定是与云,容器相关联的。
云原生关键技术
云原生的代表技术包括容器、服务网格(Service Mesh)、微服务、不可变基础设施和声明式API。
容器:容器使得应用服务能从底层架构中分离出来,实现了完全的可移植性(在任何操作系统或环境上运行应用的能力),当应用程序有很多独立组件构成,也可以为每个组件分配一个容器。为快速的部署提供了有力的支持。容器的代表就是docker。
服务网格:服务网格被设计用来保障服务与服务之间进行迅速、可靠和安全的通信。服务网格提供了诸如服务发现、负载均衡、加密、身份鉴定、授权、熔断器模式(Circuit Breaker Pattern)以及其他一系列功能。
微服务:云原生下可以说都采用了微服务的架构,为解决传统单体应用缺点而诞生。在微服务架构下,每个微服务都是通过独立的进程运行的,且微服务间通过轻量级的通信机制进行通信,如RESTful API。微服务架构强调每个微服务都聚焦于某个具体的业务,与具体业务场景相关,因此开发团队可以通过微服务快速响应业务场景的变更(比如业务逻辑变更)。此外,每个微服务都可以独立地开发和部署,且能够弹性扩展,可以有效应对业务量的变化。
不可变基础设施:不可变基础设施不同于传统的运维,服务器在部署后永远不会被修改。如果需要以任何方式更新,如版本升级或是参数配置,需要构建新服务器以替换旧服务器。在不可变基础设施中,服务器的构建通常是以镜像(Image)的方式提供的,任何一个更改都对应一个镜像。这个概念感觉比较难以理解,我认为就是服务所依赖的环境被打包成一个整体,这个整体一般情况下是不会进行改变的,在部署应用时直接通过使用这个整体。
声明式API:API一般分为两种,声明式API和命令式API。命令式的API是给出每一个操作步骤,目标系统只需要按照步骤进行执行,目标系统将结果返回给调用者,调用者对结果进行处理;声明式API是给出一个最终的状态,目标系统对资源进行操作,以到达要求,调用者不需要进行干预。声明式API的优势在于让分布式系统之间的交付变的简单。我们不需要关心任何过程细节。声明式的方式能够大量地减少使用者的工作量,极大地增加开发的效率,这是因为声明式能够简化需要的代码,减少开发人员的工作,如果我们使用命令式的方式进行开发,虽然在配置上比较灵活,但是带来了更多的工作。
云原生下安全性分析
上面了解了云原生的关键技术,与传统安全相比,这些技术的引入也增加了新的安全风险。大概可以分为下面的几类:
1)容器安全/镜像安全
2)编排工具安全
3)微服务安全
4)服务网格安全
容器安全/镜像安全
容器技术
容器是一种轻量级的虚拟化方式,将应用与必要的执行环境打包成容器镜像,使得应用程序可以直接在宿主机(物理机或虚拟机)中相对独立地运行。
虚拟机通常包括整个操作系统和应用程序,里面运行的是一个真实的操作系统。本质上虚拟机是Hypervisor虚拟化出来的硬件上安装不同的操作系统,而容器是宿主机上运行的不同进程。从用户体验上来看,虚拟机是重量级的,占用物理资源多,启动时间长。容器则占用物理资源少,启动迅速。相对地,虚拟机隔离的更彻底,容器则要差一些。
容器建立在两项关键技术之上:Linux Namespace和Linux Cgroups。
Namespace
Namespace创建一个近乎隔离的用户空间,并为应用程序提供系统资源(文件系统、网络栈、进程和用户ID)。目前大概分为下面的6中隔离机制:
·PID Namespace:不同容器就是通过pid名字空间隔离开的,不同名字空间中可以有相同的pid。 ·Mount Namespace:mount允许不同名称空间的进程看到的文件结构不同,因此不同名称空间中的进程所看到的文件目录就被隔离了。另外,每个名称空间中的容器在/proc/mounts的信息只包含当前名称的挂载点。 ·IPC Namespace:容器中进程交互还是采用Linux常见的进程交互方法(interprocess communication -IPC),包括信号量、消息队列和共享内存等。 ·Network Namespace:网络隔离是通过Net实现,每个Net有独立的网络设备,IP地址,路由表,/proc/net目录。这样每个容器的网络就能隔离开来。 ·UTS Namespace:UTS(UNIX Time-sharing Syste