文章目录

  • 1. 什么是k8s(Kubernetes)
  • 2. k8s的结构
  • 3. 细节
  • 3.1 对象与pod
  • 3.2 用来管理pod的对象
  • 3.3 Restart policy
  • 3.4 master节点
  • 3.5 Node节点
  • 参考文章


1. 什么是k8s(Kubernetes)

一个用来管理容器的程序。Kubernetes中所有节点的集合体被称为Kubernetes集群,每个节点都是一台机器,这些节点上运行着Kubernetes 所管理的容器化应用,集群具有至少一个工作节点。

Kubernetes 通过将容器放入在节点(Node)上运行的 Pod 中来执行你的工作负载。

2. k8s的结构

k8s 三Master 集群架构图 k8s集群概念_Pod

k8s 由众多组件组成,组件间通过 API 互相通信,归纳起来主要分为三个部分:

  • Controller Manager,即控制平面,用于调度程序以及节点状态检测,一般存在于master节点上,master节点也是一台机器。
  • Nodes,构成了Kubernetes集群的集体计算能力,实际部署容器运行的地方,一般是物理机或者虚拟机。
  • Pod,Kubernetes集群中资源的最小单位,里面可能有一个或者多个容器。是Nodes的一部分。对象就是各种各样的pod。pod中的所有资源共享ip于存储空间。

3. 细节

3.1 对象与pod

对象就是一种容器的运行环境,node节点会使用kubelet服务来周期性地从 master节点上的API Server 接受新的或者修改的 Pod 规范并且保证节点上的 Pod 和其中容器的正常运行,还会保证节点会向目标状态迁移。

一旦对象被创建,那么k8s就会保证这个对象的存在,并且对象所定一个环境也一定会存在。

pod就是一种最基础的没有任何控制器的对象,它代表一种运行环境,用户可根据yaml文件对其进行定义,例如定义成永远在执行出现问题自动重启,或者定义这个Pod在每一台Node都运行一个副本等。pod中可以放多个docker镜像。

可以通过定义yaml文件中的kind字段来定义pod的种类。

#字段含义
apiVersion: 使用哪个版本的Kubernetes API来创建此对象
kind:要创建的对象类型,例如Pod,Deployment等
metadata:用于唯一区分对象的元数据,包括:name,UID和namespace
labels:是一个个的key/value对,定义这样的label到Pod后,其他控制器对象可以通过这样的label来定位到此Pod,从而对Pod进行管理。(参见Deployment等控制器对象)
spec: 其它描述信息,包含Pod中运行的容器,容器中运行的应用等等。

pod的yaml配置文件:

k8s 三Master 集群架构图 k8s集群概念_Pod_02

创建这个pods所定义的对象,也可以理解成创建这个环境,只是k8s中被叫做对象:

kubectl apply -f https://k8s.io/examples/pods/simple-pod.yaml

#通过创建 Deployment 对象来运行 nginx 容器的实例:
kubectl create deployment nginx --image nginx

3.2 用来管理pod的对象

根据kind值的不同,会产生具有不同控制器的对象,这些对象可以管理selecter所指向的pod。

因为Pod本身不具备容错性,这意味着如果Pod运行的Node宕机了,那么该Pod无法恢复。因此推荐使用Deployment等控制器来创建Pod并管理。例如:

Job。通常用于管理一定会结束的Pod。如果希望Pod被Job controller管理,那么restartPolicy必须指定为OnFailure或Never。
ReplicationController,ReplicaSet和Deployment。用于管理永远处于运行状态的Pod。如果希望Pod被此类controller管理,那么restartPolicy必须指定为Always。
DaemonSet。它能够保证你的Pod在每一台Node都运行一个副本。

k8s 三Master 集群架构图 k8s集群概念_k8s 三Master 集群架构图_03

3.3 Restart policy

定义Pod时,可以指定restartPolicy字段,表明此Pod中的容器在何种条件下会重启。restartPolicy拥有三个候选值:

Always:只要退出就重启
OnFailure:失败退出时(exit code不为0)才重启
Never:永远不重启

3.4 master节点

k8s 三Master 集群架构图 k8s集群概念_Pod_04


可以通过直接请求master节点提供的api或者使用kubectl命令去与master节点进行通信来执行指令。

Master 节点内部由三个组件构成:

API Server 负责处理来自用户的请求,其主要作用就是对外提供 RESTful 的接口,包括用于查看集群状态的读请求以及改变集群状态的写请求,也是唯一一个与 etcd 集群通信的组件。

而 Controller 管理器运行了一系列的控制器进程,这些进程会按照用户的期望状态在后台不断地调节整个集群中的对象,当服务的状态发生了改变,控制器就会发现这个改变并且开始向目标状态迁移。

最后的 Scheduler 调度器其实为 Kubernetes 中运行的 Pod 选择部署的 Worker(Node) 节点,它会根据用户的需要选择最能满足请求的节点来运行 Pod,它会在每次需要调度 Pod 时执行。

3.5 Node节点

k8s 三Master 集群架构图 k8s集群概念_Pod_05


kubelet 是一个节点上的主要服务,它周期性地从 API Server 接受新的或者修改的 Pod 规范并且保证节点上的 Pod 和其中容器的正常运行,还会保证节点会向目标状态迁移,该节点仍然会向 Master 节点发送宿主机的健康状况。

另一个运行在各个节点上的代理服务 kube-proxy 负责宿主机的子网管理,同时也能将服务暴露给外部,其原理就是在多个隔离的网络中把请求转发给正确的 Pod 或者容器。

参考文章

k8s官方文档https://cloud.51cto.com/art/202012/637679.htmKubernetes对象之Pod运行第一个k8s应用Kubernetes对象之Service