Cloud Native Application 云原生 程序开发出来就运行在云平台上,而非传统的物理机单机主机上
ServerLess 无服务器概念 Knative
Faas:函数即服务,调用时运行,不调用时服务不运行
1、docker与kubernetes的关系
1.1docker介绍
- docker是容器的一种,对于容器来说,它事实上也是虚拟化的一种,被称之为操作系统级的虚拟化。
容器运行的时侯,所有的容器全部共同使用操作系统的内核,而对于每一个容器来说,只有必要的应用和二进制文件。
容器为任务而生,每一个容器通常,只会运行一个任务,在主机操作系统上体现为一个进程。各容器之间通过namespace和cgroup来进行隔离与资源的限制。 -
但是,容器也会有自身缺陷:
1、基于命令行一次只能启动一个容器,容器和容器之间没有办法建立更好的关联关系。
2、当容器数量足够多的时候,管理员不能有效的记录每一个容器的配置,导致容器运行混乱。
3、容器没有办法做到负载均衡,自我修复,弹性伸缩等 -
docker的解决方案
通过docker-compose去做容器的单机编排
通过docker-swarm去做容器的集群编排
但这两种方式都没有kubernetes的生态强大,并且能做到的功能弱于kubernetes。接下来去介绍一下基于google开源的kubernetes
1.2kubernetes介绍
kubernetes,是一个全新的基于容器技术的分布式架构领先方案,是谷歌严格保密十几年的秘密武器----Borg系统的一个开源版本,于2014年9月发布第一个版本,2015年7月发布第一个正式版本。
kubernetes的本质是一组服务器集群,它可以在集群的每个节点上运行特定的程序,来对节点中的容器进行管理。目的是实现资源管理的自动化,主要提供了如下的主要功能:
- 自我修复:一旦某一个容器崩溃,能够在1秒中左右迅速启动新的容器
- 弹性伸缩:可以根据需要,自动对集群中正在运行的容器数量进行调整
- 服务发现:服务可以通过自动发现的形式找到它所依赖的服务
- 负载均衡:如果一个服务起动了多个容器,能够自动实现请求的负载均衡
- 版本回退:如果发现新发布的程序版本有问题,可以立即回退到原来的版本
- 存储编排:可以根据容器自身的需求自动创建存储卷
1.3 kubernetes组件
一个kubernetes集群主要是由控制节点(master)、工作节点(node)构成,每个节点上都会安装不同的组件。
master:集群的控制平面,负责集群的决策 ( 管理节点)
ApiServer : 资源操作的唯一入口,接收用户输入的命令,提供认证、授权、API注册和发现等机制
Scheduler : 负责集群资源调度,按照预定的调度策略将Pod调度到相应的node节点上
ControllerManager : 负责维护集群的状态,比如程序部署安排、故障检测、自动扩展、滚动更新等
Etcd :负责存储集群中各种资源对象的信息
node:集群的数据平面,负责为容器提供运行环境 ( 工作节点 )
Kubelet : 负责维护容器的生命周期,即通过控制docker,来创建、更新、销毁容器
KubeProxy : 负责提供集群内部的服务发现和负载均衡
Docker : 负责节点上容器的各种操作
1.4交互流程
以创建一个POD(kubernetes的最小资源单位,暂且理解为一个容器或一组容器)为例
1、用户申请创建一个POD
2、该请求会被APIServer所接受,ApiServer收到用户请求后,首先会对用户做身份认证以及权限验证;
3、APIServer通过认证之后会将该任务的描述信息写入etcd数据库当中
4、Scheduler监听ApiServer,和ApiServer保持心跳联系;
5、Scheduler定时询问ApiServer是否有创建POD的请求,ApiServer查询数据库,拿到请求之后,交由Scheduler,Scheduler向ApiServer获取当前所有Kubelet状态,选择一个合适的后端(Kubelet),交给ApiServer;
6、ApiServer存放在etcd数据库当中
7、Kublet监听ApiServer,和ApiServer保持心跳联系;
8、Kubelet询问ApiServer是否有创建POD的请求,ApiServer查询数据库,拿到任务之后,交由Kubelet,Kubelet创建POD完成后,
告知ApiServer;
9ApiServer存放在etcd数据库当中
10、controller-managert监听ApiServer,和ApiServer保持心跳联系;
11、controller-manager向apiserver发起请求,询问是否有任务;
12、apiserver会将POD的任务信息以及描述信息发送给controller-manager;
13、controller-manager对比任务是否有异常,如果没有,则确定任务完成;
14、如果有,则将未完成的任务返回给kube-apiserver
1.5kubernetes关键概念
1、Pod
kubernetes的最小控制单元,容器都是运行在pod中的,一个pod中可以有1个或者多个容器
- 自主式Pod
通过手动创建Pod,该方式创建出来,不具备k8s的编排特性,当中运行的只是一个或一组容器 - 控制器管理的Pod
通过控制器去创建Pod,该方式创建出来,具备k8s的编排特性,具有生命周期,可以做到负载均衡,弹性伸缩,滚动更新等。
2、控制器controller
- ReplicationController
用于数据副本维持在期望值,当前已被弃用,由ReplicaSet替代 - ReplicaSet
保证副本数量一直维持在期望值,并支持pod数量扩缩容,镜像版本升级 - Depliyment
通过ReplicaSet控制Pod,并支持滚动升级、回退版本。只能管理无状态应用 - StatefulSet
管理有状态应用 - HPA(Horizontal Pod Autoscaler)
可以根据集群负载自动水平调整Pod的数量,实现削峰填谷 - DaemonSet
在集群中的指定Node上运行且仅运行一个副本,一般用于守护进程类的任务 - Job
它创建出来的pod只要完成任务就立即退出,不需要重启或重建,用于执行一次性任务 - Cronjob
它创建的Pod负责周期性任务控制,不需要持续后台运行
3、Service
在kubernetes中,pod是应用程序的载体,我们可以通过pod的ip来访问应用程序,但是pod的ip地址不是固定的,这也就意味着不方便直接采用pod的ip对服务进行访问。
为了解决这个问题,kubernetes提供了Service资源,Service会对提供同一个服务的多个pod进行聚合,并且提供一个统一的入口地址。通过访问Service的入口地址就能访问到后面的pod服务。
4、网络
-
Pod网络
通过插件提供CNI
(1、flannel提供网络配置 2、calico提供网络配置和网络策略 3、canel通过flannel提供网络配置,calico提供网络策略 4、等等) - 集群网络(Service网络)
- 节点网络