应用部署方式
传统部署时代
- 早期的时候,各个组织是在物理服务器上运行应用程序。
- 缺点
- 资源分配问题:
- 无法限制在物理服务器中运行的应用程序资源使用
- 维护成本问题:
- 部署多个物理机,维护许多物理服务器的成本很高
- 资源分配问题:
虚拟化部署时代
- 虚拟化技术允许在单个物理服务器的 CPU 上运行多台虚拟机(VM)
- 虚拟化能使应用程序在不同 VM 之间被彼此隔离,且能提供一定程度的安全性
- 虚拟化技术能够更好地利用物理服务器的资源,并且因为可轻松地添加或更新应用程序
- 缺点
- 需要单独一个系统,占用资源
- 不能灵活的扩容和缩容
容器部署时代
- 容器类似于 VM,但是更宽松的隔离特性,使容器之间可以共享操作系统(OS)
- 容器比起 VM 被认为是更轻量级的,每个容器都具有自己的文件系统、CPU、内存、进程空间等
- 跨云和操作系统发行版本的可移植性:可在 Ubuntu、RHEL、CoreOS、本地、 Google Kubernetes Engine 和其他任何地方运行。
容器化带来的问题
容器化部署存在的问题
- 20个物理机发布100个容器,怎么快速发布和管理
- 应用发布上线出现问题,需要进行回滚历史版本,如何进行回滚
- 突发海量请求过来,如何根据情况进行快速扩容
- 用户请求过来,怎么分配请求到100个容器里面
- 某个容器故障了,如何快速启动新容器去替代
- 。。。。。。。
上面容器管理的问题称为容器编排,为了解决这些问题,产生了一些容器编排的软件
- Docker Swarm:Docker自己的容器编排工具
- Mesos:Apache的资源管控的工具,结合Marathon使用
- Kubernetes:Google开源的的容器编排工具, 基于内部Borg系统的开源版本
什么是Kubernetes(简称 k8s)
介绍
- Kubernetes 这个名字源于希腊语,意为“舵手”或“飞行员”。
- k8s 这个缩写是因为 k 和 s 之间有八个字符的关系。
- Google 在 2014 年开源了 Kubernetes 项目。 Kubernetes 建立在 Google 大规模运行生产工作负载十几年经验的基础上, 结合了社区中最优秀的想法和实践。
- Kubernetes 是一个可移植、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。
k8s 常用功能
- 服务发现和负载均衡
- Kubernetes 可以使用 DNS 名称或自己的 IP 地址来暴露容器。
- 如果进入容器的流量很大,Kubernetes 可以负载均衡并分配网络流量,从而使部署稳定。
- 存储编排
- Kubernetes 允许你自动挂载你选择的存储系统,例如本地存储、公共云提供商等。
- 自动部署和回滚
- 你可以自动化 Kubernetes 来为你的部署创建新容器, 删除现有容器并将它们的所有资源用于新容器
- 当版本发布错误,可以立刻回退到之前的版本
- 自我修复
- 如果某个容器宕机了,K8S 可以快速重新启动新的的容器,替换旧的容器
- 密钥与配置管理
- Kubernetes 允许你存储和管理敏感信息,例如密码、OAuth 令牌和 SSH 密钥。
- 你可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置,也无需在堆栈配置中暴露密钥。
Kubernetes常见概念组件和整体架构
Kubernetes常见组件和整体架构讲解
K8S整体架构,也是Client-Server模型
- 控制节点Master-Node,负责集群的管理
- 工作节点Worker-Node,负责为集群提供运行环境
kubernetes常见概念
Master (集群控制节点)
- 指的是集群控制节点(相当于整个集群的指挥中心),在每个Kubernetes集群里都需要有一个Master来负责整个集群的管理和控制
Node (Node节点)
- 除了master,k8s集群中的其他机器被称为Node节点,Node节点才是kubernetes集群中的工作负载节点
- 每个Node节点都会被master分配一些工作负载(docker容器),node节点上的docker负责容器的运行
Pod
- Pod是一组容器, 在K8S中,最小的单位是Pod, 一个Pod可以包含多个容器,但通常情况下我们在每个Pod中仅使用一个容器
- 可以把Pod理解成豌豆荚, Pod内的每个容器是一颗颗豌豆
- 分类
- 自主创建:直接创建出来的Pod,这种pod删除后就没有了,也不会自动重建
- 控制器创建:通过控制器创建的pod,这类Pod删除了之后还会自动重建
Pod Controller (Pod控制器)
- 控制器是管理pod的中间层,只需要告诉Pod控制器,想要创建多少个什么样的Pod,它会创建出满足条件的Pod并确保每一个Pod资源处于用户期望的目标状态。如果Pod在运行中出现故障,它会基于指定策略重新编排Pod
- 通过它来实现对pod的管理,比如启动pod、停止pod、扩展pod的数量等等
- 类型
- ReplicaSet、Deployment、Horizontal Pod Autoscaler、DaemonSet等
Service
- 在k8s里面,每个Pod都会被分配一个单独的IP地址,但这个IP地址会随着Pod的销毁而消失
- Service (服务)就是用来解决这个问题的, 对外服务的统一入口,用于为一组提供服务的Pod 抽象一个稳定的网络访问地址
- 一个Service可以看作一组提供相同服务的Pod的对外访问接口,作用于哪些Pod是通过标签选择器来定义的
Label (标签)
- K8S提供了一种机制来为Pod进行分类,那就是Label(标签),同一类pod会拥有相同的标签
- Label的具体形式是key-value的标记对,可以在创建资源的时候设置,也可以在后期添加和修改
- 给某个资源对象定义一个Label,就相当于给它打了一个标签,可以通过Label Selector(标签选择器)查询和筛选拥有某些Label的资源对象,K8S通过这种方式实现了类似SQL的对象查询机制
- 应用场景
- 未使用前,分散难管理,如果需要部署不同版本的应用到不同的环境中,难操作
- 为Pod打上不同标签,使用Label组织的Pod,轻松管理
- 未使用前,分散难管理,如果需要部署不同版本的应用到不同的环境中,难操作
Label选择器
- 对应的资源打上标签后,可以使用标签选择器过滤指定的标签
- 标签选择器目前有两个
- 基于等值关系(等于、不等于)
- 基于集合关系(属于、不属于、存在)
NameSpace(命名空间)
- 可以在一个物理集群上运行多个虚拟集群,这种虚拟集群被称作命名空间,用来隔离pod的运行环境
- 同一个名字空间中的资源名称必须唯一,而不同名字空间之间则没有这个要求
- NameSpace是不能嵌套的,每一个 Kubernetes 的资源都只能在一个NameSpace内
- NameSpace是在多个用户之间划分集群资源的一种方法(通过资源配额)
(注意)
不必使用多个名字空间来分隔轻微不同的资源,例如同一软件的不同版本: 应该使用标签 来区分同一名字空间中的不同资源- Kubernetes 会创建四个初始NameSpace名称空间
default
没有指明使用其它名字空间的对象所使用的默认名字空间kube-system
Kubernetes 系统创建对象所使用的名字空间kube-public
所有的客户端(包括未经身份验证的客户端)都可以读取该名字空间。kube-node-lease
该名字空间包含用于与各个节点关联的 Lease(租约)对象。 节点租约允许 kubelet 发送心跳, 由此控制面能够检测到节点故障
应用分类
- 有状态应用
- 不能简单的实现负载均衡的服务,有数据产生的服务,Redis、MySql、RabbitMQ等
- 相关服务须通过一些较复杂的配置才能做到负载均衡
- 有状态的应用,建议直接在物理机部署,方便维护管理
- 无状态应用
- 没有对应业务数据的应用,可以简单的实现负载均衡,复制一个节点即可快速扩容,如SpringCloud中的业务服务
- 无状态的应用适合部署在 Kubernetes(K8s)中或者容器中
K8S整体架构
- K8S整体架构,也是Client-Server模型
-
控制节点Master-Node,负责集群的管理
apiserver
:提供操作【k8s集群资源】的唯一入口,RESTful方式请求,并提供认证、授权、访问控制、API注册和发现等scheduler
:负责资源的调度,按照预定的调度策略,【计算】将Pod调度到相应的Node节点进行应用部署controller-manager
:控制器管理中心,负责维护集群的状态,比如故障检测、滚动更新等,根据调度器的安排通知对应的节点创建podetcd
:存储中心,是兼具一致性和高可用性的键值数据库,可以作为保存 Kubernetes 所有集群数据的后台数据库
-
工作节点Worker-Node,负责为集群提供运行环境
Node
是Pod真正运行的主机,可以是物理机也可以是虚拟机, Node本质上不是K8S来创建的, K8S只是管理Node上的资源,为了管理Pod,每个Node节点上至少需要运行container runtime(Docker)
、kubelet
和kube-proxy
服务kubelet
:相当于主节点派到工作节点的一个代表,用于管理本机容器(相当于master节点的化身),负责维护容器的生命周期也负责Volume(CVI)
和网络(CNI)
的管理kube-proxy
:负责为Service
提供cluster内部的服务发现
/网络代理
/负载均衡
等操作,为部署的应用程序提供访问入口,和apiserver是不一样的,后者是操作k8s集群内部的
-
文档
K8S文档:https://kubernetes.io/docs/home/