【kubernetes】【基础】基础知识
Kubernetes(k8s)是什么
-
容器是打包和运行应用程序的最好方式。
-
kubernetes是一个提供了基于容器的应用集群管理平台或解决方案,kubernetes为容器化应用提供了部署运行、资源调度、服务发现和动态伸缩灯一系列完整的方案。
-
kubernetes的设计理念是:用户定义要部署的应用程序的规则(通过yaml文件),而Kubernetes则负责按照用户定义的规则去部署并运行应用程序。
-
用户通过使用kubernetes API对象来描述应用程序规则,包括pod,Service,Volume,namespace,ReplicaSet,Deployment,Job等等资源对象的规则定义,这些资源规则定义需要写入一系列的yaml文件中,然后通过kubernetes命令行工具kubectl调用kubernetesAPI进行部署和运行。
K8s整体架构图
k8s组件介绍
-
控制平面组件/master:负责控制集群的一个主要节点,集群的控制中心
主节点包含四个关键组件,3个核心组件+1个数据库组件:
-
API Server
提供操作的REST接口,是所有k8s资源对象增删改查的唯一入口。
-
controller manager(控制器管理器)
所有资源的控制中心。
-
scheduler(调度器)
负责pod的调度。
-
Etcd
一个分布式高可用、强一致性的key/value存储,保存所有资源的信息和状态
-
Node组件:负责运行容器的节点
node节点包含组件有:
-
Kubelet
节点的管理员,负责创建、删除、更新节点上的资源;如管控docker容器, docker启动/停止、监控docker运行状态等。它会定期从etcd获取分配到本机的pod,并根据pod信息启动或停止相应的容器。同时,它也会接收apiserver的http请求,汇报pod的运行状态。
-
Kube-proxy
负责为pod提供通信和负载均衡,它会定期从etcd获取所有的service,并根据service信息创建代理,当某个客户pod要访问其他pod的时候,访问请求会经过本机proxy做转发。
- 上面四个组件的工作流程(以系统缺少一个pod资源事件为例):
- Controller Manager控制中心通过API Server查询到etcd数据库中的pod资源缺少了一个pod;
- Controller Manager控制中心又通过API Server告诉Scheduler,让其创建一个pod资源;
- Scheduler接收到需求后,通过API Server实现pod的资源调度
- Scheeduler调度完并把调度信息的pod资源信息状态写到etcd数据库
说明:kubectl为客户端命令行工具,用来管理k8s集群,需要单独安装。
k8s主要资源对象
- 资源类:node、pod、replicaSet、deployment、statefulset、daemonset、PV/PVC
- 服务类:service、ingress
- 配置类:configmap、secret
K8s基本概念简介
- Node
对应的虚拟机VM或物理机,一个Node节点就是一台虚拟机VM或物理机,是容器运行的载体,多个Node节点组成一个集群;安装有控制平面组件的节点就称之为master节点:集群的控制中心。
- Pod
是k8s能够创建、调度和管理的最小部署单位,一个pod可以包含多个容器(如docker),是一个容器的集合。Pod寄存于Node之上,一个Node可以存在多个pod,它们相互协作完成一个应用功能。
- Service
- service表示同类型的pod(提供相同服务的pod),每个pod都可以独立完成某一项任务,service跟微服务类似,service对外提供服务,具体是由那个pod完成的,这由service进行调度,这就达到了负载均衡的目的。
- service最主要的作用就是保证pod的动态变化对访问端透明,访问端只需知道service的地址,由service来提供代理。达到了前端与后端pods的解耦作用。
- service支持TCP和UDP协议,默认是TCP协议
- Labels
service是k8s抽象出来的表示逻辑相同的pod,那么service是根据什么来划分pod的呢,答案就是labels,在yaml中给每个pod标记labels标签,label的selector选择器就会根据相同的标签名(键值对)来划分service了。
- Selector
一个yaml文件里面pod可以定义多个labels标签值,在定义service的时候,可以使用selector选择器指定那个label标签,以便于划分service。
- RC(Replication Controller)
在创建pod的时候,怎么去创建指定种类和数量的pod呢,答案是通过RC文件,RC的功能完全可以使用Deployments完成。在yaml中通过replicas指定pod数量和selector选择service类别
- RS(ReplicaSets)
ReplicaSets是一个副本控制器,用于确保在yaml中配置replica数量的pod在运行,与Deployments配合使用,主要用于解决pod的扩容和缩容的问题,如果超过replica数量的pod会杀死一些pod,如果少了会启动一些。通常用于无状态的应用。
- Deployments
主要用于更新pod和ReplicaSet,支持上线部署,回滚升级Reployments版本,暂停恢复上线任务等功能。通常用于无状态的应用。
- StatefulSets
与RS或Deployments相对的,StatefulSets适用于有状态的应用;RS或Deployment管理的pod之间是没什么区别的,可以随时创建一个新的pod来代替;而StatefulSets则是不一样,其创建的每个pod都有一个唯一标识(pod标识和网络标识)和自己的存储地方,如果有其中一个pod crash了,statefulSets会创建一个具有相同标识的pod,并使用原来的存储。
- DaemonSet
DaemonSet 是这样一种资源pod(守护进程),它在集群的每个节点上运行一个 Pod,且保证只有一个 Pod,这非常适合一些系统层面的应用,例如日志收集、资源监控等,这类应用需要每个节点都运行,且不需要太多实例。一个比较好的例子就是 Kubernetes 的 kube-proxy。DaemonSet是跟随节点label的创建而创建,消失而消失。
- Job/CronJob
前面RS和Deployments部署的pod是长时间运行的,而job拉起来的pod是一种任务,做完就结束停止pod;Job可以设置一个任务执行多少次并且同时执行多少格任务,通过设置 completions 和 parallelism 两个参数即可。同时支持扩容replicas。
另外一种任务CronJob支持定时任务,也就是指定时间去创建pod来执行任务。
- Ingress
ingress为外部访问集群的一种方式,有NodePort和LoadBalance提供给外部访问了为什么还需要Ingress呢,第一个原因:每个LoadBalance都需要一个公网IP,而Ingress不需要,一个Ingress通过host和path映射到多个service;第二个原因是Ingress是基于HTTP实现的,可以提供基于Cookie的会话亲和特性,Service基于TCP无法做到。
- configMap
用于pod环境的应用配置,通过configMap可以让不同环境有不同的配置,configMap是一组key-value键值对,可以做到使用相同pod描述文件的两个pod(一个生产环境一个开发环境)使用不同的配置。
- PV/PVC
PV/PVC(PersistentVolume/Claim)是k8s用于持久化存储的。volume将本地目录或网络存储挂载给pod中的容器使用,生命周期与pod保持一致,不能持久化,而使用PV可以做到持久化存储,使用PV绑定volume,然后再声明pvc关联pv即可实现持久化存储,pvc屏蔽了持久化存储的一个复杂过程,只需要使用pvc声明存储资源即可。
- Secret
secret是专门设计用来保存密码、私钥等敏感信息的。
Secret 与 ConfigMap 很像,都是 key-value 的键值对,对 Secret,可以
- 通过环境变量传递给容器
- 通过 Volume 以文件形式挂载到容器中
Kubernetes 确保 Secret 仅分发到运行需要访问 Secret 的 pod 的节点,以此保证 Secret 安全,而且在普通节点上,Secret 仅仅会存储在内存中,在 Master 节点上,Secret 会加密保存(在 ETCD 中).
- PodIP
每个pod拥有的IP
- ClusterIP
每一个Service的IP地址
- NodeIP
物理机或虚拟机实际的物理IP地址
- 点赞
- 收藏
- 关注作者
评论(0)