k8s的简单执行流程:
Kubernetes Master(API Server、Scheduler等组件)负责调度Pod到合适的Node上。
当Pod被调度到某个Node时,该Node上的kubelet代理会收到指令并开始执行Pod的生命周期管理任务,包括创建、监控和终止Pod中的容器。
kubelet通过调用底层容器运行时接口来管理容器,而默认情况下,这个容器运行时就是Docker。也就是说,kubelet实际上是间接控制Docker引擎来创建和管理Pod内的容器。
所以,Pod更像是Kubernetes对容器进行抽象和编排的一种方式,并不是直接“控制”Docker的。在Kubernetes生态系统下,Docker是实现容器化技术的一种具体工具,kubelet通过与Docker API交互,确保Pod中的容器按照Kubernetes的规则运行。
1、Master 主节点 与Node计算节点 (组件)
Master-节点包括API Server、Scheduler、Controller manager、etcd.
API Server是整个系统的对外接口,供客户端和其它组件调用,相当于“营业厅”。
Scheduler负责对集群内部的资源进行调度,相当于“调度室”。
Controller manager负责管理控制器,相当于"“大总管”。
初步理解 提供api ,调度任务,mananager器,数据库
然后是Node节点。
Node节点包括Docker、kubelet、kube-proxy、Fluentd、kube-dns(可选),还有就是Pod。
Pod是Kubernetes最基本的操作单元。一个Pod代表着集群中运行的一个进程,它内部封装了一个或多个紧密相关的容器。除了Pod之外,K8S还有一个Service的概念,一个Service可以看作一组提供相同服务的Pod的对外访问接口
Docker,不用说了,创建容器的。
Kubelet,主要负责监视指派到它所在Node上的Pod,包括创建、修改、监控、删除等。
先理解为类似于redis的sentinel
Kube-proxy,主要负责为Pod对象提供代理。
mybatis插件 切面分页
Fluentd,主要负责日志收集、存储与查询,守护进程。
打日志
RKT
rkt运行容器,作为docker工具的替代方案。
supervisord
supervisord是一个轻量级的监控系统,用于保障kubelet和docker运行。
2、K8s对象
1.容器化应用正在运行(以及在哪些节点上)
这些应用可用的资源
关于这些应用如何运行的策略,如重新策略,升级和容错
Kubernetes对象是“record of intent”,一旦创建了对象,Kubernetes系统会确保对象存在。通过创建对象,可以有效地告诉Kubernetes系统你希望集群的工作负载是什么样的。
要使用Kubernetes对象(无论是创建,修改还是删除),都需要使用Kubernetes API。例如,当使用kubectl命令管理工具时,CLI会为提供Kubernetes API调用。你也可以直接在自己的程序中使用Kubernetes API,Kubernetes提供一个golang客户端库 (其他语言库正在开发中-如Python)。Java:k8sClient源码库
<dependency>
<groupId>io.kubernetes</groupId>
<artifactId>client-java</artifactId>
<version>8.0.2</version>
<scope>compile</scope>
</dependency>
2.描述Kubernetes对象
在Kubernetes中创建对象时,必须提供描述其所需Status的对象Spec,以及关于对象(如name)的一些基本信息。当使用Kubernetes API创建对象(直接或通过kubectl)时,该API请求必须将该信息作为JSON包含在请求body中。通常,可以将信息提供给kubectl .yaml文件,在进行API请求时,kubectl将信息转换为JSON。认证信息放在yam文件中发生的时候变为json发送
3.必填字段
对于要创建的Kubernetes对象的yaml文件,需要为以下字段设置值:
apiVersion - 创建对象的Kubernetes API 版本
kind - 要创建什么样的对象?
metadata- 具有唯一标示对象的数据,包括 name(字符串)、UID和Namespace(可选项)
3.K8s Names
Kubernetes REST API中的所有对象都用Name和UID来明确地标识。
对于非唯一用户提供的属性,Kubernetes提供labels和annotations。
1.Name
Name在一个对象中同一时间只能拥有单个Name,如果对象被删除,也可以使用相同Name创建新的对象,Name用于在资源引用URL中的对象,例如/api/v1/pods/some-name。通常情况,Kubernetes资源的Name能有最长到253个字符(包括数字字符、-和.),但某些资源可能有更具体的限制条件.
2.UIDs
UIDs是由Kubernetes生成的,在Kubernetes集群的整个生命周期中创建的每个对象都有不同的UID(即它们在空间和时间上是唯一的)。
4.K8s Labels与selecotrs
Labels选择器
与Name和UID 不同,标签不需要有唯一性。一般来说,我们期望许多对象具有相同的标签。
通过标签选择器(Labels Selectors),客户端/用户 能方便辨识出一组对象。标签选择器是kubernetes中核心的组成部分。
API目前支持两种选择器:equality-based(基于平等)和set-based(基于集合)的。
标签选择器可以由逗号分隔的多个requirements 组成。在多重需求的情况下,必须满足所有要求,因此逗号分隔符作为AND逻辑运算符。
一个为空的标签选择器(即有0个必须条件的选择器)会选择集合中的每一个对象。
一个null型标签选择器(仅对于可选的选择器字段才可能)不会返回任何对象。
注意:两个控制器的标签选择器不能在命名空间中重叠。