目标:云平台多个主机管理容器化应用的平台,目的是通过各种抽象概念,让部署和应用简单高效。
#一,为什么需要k8s
(独立性问题,环境不隔离)传统部署ip不动:java打包成war包-通过tomcat上传到服务器。资源不隔离,比如带宽,cpu,内存等问题会被抢占。
虚拟化部署:占用资源过度,虚拟化本身就占用很多。
容器化部署:(类似包装袋,生命周期大大缩短,例如去超市买菜用的那个包装袋,回家就丢了,不太稳定了)(没有硬件设备的虚拟)容器:像虚拟机一样实现文件系统,网络,cpu,内存,磁盘,进程,用户空间等资源的隔离
#1,k8s的特点
(1)自我修复:有error就直接把容器干掉,重新复制一个容器运行。
(2)弹性伸缩。如果需要4个,也会自己搞两个出来,若又需要2个,改一下也可以自动变为两个。
(3)自动部署和回滚。编写配置文件,他就可以自动部署(比如删除重新部署),可以用户无感知的情况下进行更新升级,或者回退版本。
(4)服务发现和负载均衡。
(5)机密和配置管理。动态配置敏感信息管理啥的可以统一编排。
(6)存储编排。
(7)批处理。
#二,集群架构与组件
相关组件
分层架构:生态系统,接口层,管理层,应用层,核心层。
#三,核心概念和专业术语
#1,服务的分类
#(1)无状态应用
没有存数据。不会对本地环境产生任何依赖,不会存储到本地磁盘和内存(请求过来,做个运算,调用就结束了)高效的扩容和迁移
客户端——>Nginx 反向代理路由转到目标服务—>java应用商城
#(2)有状态应用
存数据,比如redis。和上面相反。需要维护数据存储
#2,资源和对象
资源和对象:可以把资源当成java中的类,对象就是资源的实例
#资源的分类(元数据,集群,命名空间)
#元数据型(对pod的一种描述)
1,Horizontal Pod Autoscaler(HPA):Pod自动扩容:根据cpu的使用量或者自定义指标自动对pod进行扩/缩容。解放运维能力。(应用场景:比如每日早上10点超市鸡蛋秒杀,本来5台服务器,马上10点的时候就会自动扩容变为10台服务器,过去这个时间段就不用占用这么多服务器,就缩容,又变为5台服务器)
-
控制管理器每隔30秒,会查询metrics的资源使用情况。
-
支持三种metrics的资源使用情况(预定义metrics以利用率的方式计算,自定义pod metrics ,以原始值的方式计算,自定义的object metrics)
-
支持两种metrics查阅方式:Heapster和自定义的rest api
-
支持多metrics
2,PodTemplate :pod模板。利用pod模板来创建新的应用
3,LimitRange:对集群里面的资源进行限制。 request(最少用多少资源) limits(最多可以用到多少资源)。相当于批量设置了一个范围(某个命名空间)的pod的资源使用限制。
#集群级
Namespace 命名空间
Node 节点资源。不像其他资源(pod 和 namespace)node 本质上不是k8s来创建的,只是管理node上的资源,虽然可以通过manifest创建一个node对象,但是k8s只是去检查是否真的是有这么一个node 如果检查失败,也不会往上调度pod
ClusterRole(集群角色,集群资源之上的,对集群权限的一个管理,声明了一个权限组,没有把权限应用到哪一个账户之上,没有进行绑定)
ClusterRoleBingding(把哪一个资源跟角色进行绑定,让这个资源拥有角色,就拥有了对应角色的权限,只能绑定到集群级别的资源对象,不能往命名空间资源对象去绑定)
#命名空间级(Pod, 服务发现,配置和存储,特殊类型存储,其他)
pod(副本,控制器)
副本:一个pod可以被复制成多份,每一份可以被称为一个副本,这些副本除了一些描述信息(pod的名称,uid等)不一致以外,其他信息都是一样的,比如pod内部容器,容器数量,容器里面运行的应用等的这些信息都是一样的,这些副本提供同样的功能。
pod的控制器(可以认为是一个pod对象)通常包含一个名为replicas的属性,这个属性则指定了待定pod的副本数量,当前集群中该pod的数量与该属性指定的值不一致时,k8s会采取一些策略去使得当前状态满足配置的要求。
pod:
是k8s中最小的可部署单元,一个pod(容器组)包含了一个应用程序容器(某些情况下是多个容器),存储资源,一个唯一的网络ip,以及一些确定容器该如何运行的选项。pod容器组代表了k8s中一个独立的应用容器运行实例,该实例可能由单个容器或者几个紧耦合在一起的容器组成。
两种使用途径:
一个pod只运行一个容器,此时可认为pod容器组是该容器的wrapper k8s通过pod管理容器,而不是直接管理容器
一个pod中运行多个需要互相协作的容器。可以将多个紧密耦合,共享资源且始终在一起运行的容器编排在同一个pod中
pod 希望当两个容器有强依赖关系时,可以共享网络或者实现容器之间文件系统的共享,做资源限制
pod之间通过pause来实现“共享”
#控制器:(包括适用无状态,有状态服务,守护进程,任务/定时任务)
适用无状态服务(nginx)
ReplicationController RC(已经废除)帮助我们动态更新pod副本数(实现扩容和缩容的效果),在副本也就是replicas 中给参数就可
ReplicaSet RS 帮助我们动态更新pod的副本数,可以通过selector来选择对哪些POD生效
Label和Selector
Deployment 针对RS的更高层次的封装,提供了更丰富的部署相关功能
1,创建Replica Set/pod
2,滚动升级/回滚
3,平滑扩容和缩容
4,暂停与恢复Deployment
适用有状态服务 (一般像redis mysql)(特点,组成,注意事项)
StatefulSet:专门针对有状态服务进行部署的一个控制器
网络固定,数据不能丢失,顺序要得到保证等(通过statefulSet)
特点:(1)稳定的持久化存储(2)稳定的网络标志(3)有序部署,有序扩展(4)有序收缩,有序删除
组成:
(1)Headless Service:针对有状态服务的DNS管理。DNS域名服务,将域名与ip绑定映射关系
(2)volumeClaimTemplate:用于创建持久化卷的模板
注意事项:所有的pod的volume必须使用persistentVolume或者是管理员先创建好。为了保证数据安全,删除statefulSet时不会删除Volume。statefulset需要一个headless service 来定义DNS domain,需要在statefulset 之前创建好。
守护进程(日志收集)
保证在每个Node上都运行一个容器副本,常用来部署一些集群的日志,监控或者其他系统管理应用,典型的应用包括,日志搜集,系统监控,系统程序。
DaemonSet:为每一个匹配的Node都部署一个守护进程。
任务/定时任务
Job 一次性任务,运行完成之后Pod销毁,不再重新启动新容器
CronJob 在job的基础上加上了定时任务。(什么时间做,每隔多久做)
服务发现:service和ingress
Service:集群内部的网络通信,pod不能直接提供给外网访问,利用service来暴露端口,提供服务,中文名就叫服务。
用户-负载均衡服务器-网关-微服务。微服务之间可能存在一些调用关系,这种流量叫横向流量,也叫东西流量。
配置与存储:volume和CSL
Volume数据卷,共享pod中容器使用的数据,用来放持久化的数据比如数据库数据。CSL行业标准接口规范,将任意存储系统暴露给容器化应用程序(作用类似JDBC)
特殊类型配置:configMap和secret和downwardAPI
-
ConfigMap是key value类型的配置,灵活化配置文件。
-
secret比configmap多了加密的功能。默认加密方式是base64,但是这只是一种编码echo “密文“ | base —decode即可解密
-
downwardAPI不是为了存放容器的数据,也不是进行数据交换的,是为了让pod里面的容器直接获取到pod对象本身的一些信息。(将pod的信息直接注入容器内部)两种方式环境变量和挂载。
其他:Role RoleBinding
-
Role 定义(命名空间级别)一组权限
-
RoleBinding 可以把role或者clusterrole绑定到命名空间级别。区别上面的clusterrolebinding,可以把role或者clusterrole绑定到集群级别的。是一个绑定。
#资源清单
学习配置文件。资源是通过配置文件来描述的,配置文件可以是json yaml等文件,常用yaml
#3,对象的规约和状态
#spec(规约)
描述了对象的期望状态,是希望对象所具有的特征,以及关于对象的一些基本名称(例如名称),而不是必须的。创建对象时,必须提供对象的规约。
#status(状态)
表示对象的实际状态,该属性由k8s自己维护,k8s会通过一些列的控制器对对应对象进行管理,让对象尽可能的让实际状态与期望状态重合。