1.前言
最近在学习 K8s 相关的知识,在此记录下自己的学习笔记与实验过程。首先来个 K8s 资源间的关系图(极客时间,罗剑锋《Kubernetes 入门实战课》)

2.Namespace
Kubernetes提供的组织机制,用于给集群中的任何对象组进行分类与管理,默认为default。Namespace可以用来进行团队区分、环境区分,便于进行资源、权限等控制。
3.Container(容器)
容器,隔离的进程。
4.Pod
Pod 是对容器的“打包”,包含一组(0个或多个)具有紧密关系Container,这些Container共享磁盘、网络、hostname、防火墙等等。Pod是K8s中的最小调度部署的最小单位,里面的容器是一个整体,总是能够一起调度、一起运行,绝不会出现分离的情况。最简单的理解,可以认为Pod相当于虚拟机,里面包含多个进程(Container)。
5.Node
Node是K8s系统中真正运行Pod的主机,可以使物理机,也可以是虚拟机。Node分为两类:Master节点 和 Worker 节点,狭义上,一般会将Node直接认为是Worker 节点。
5.1.Master节点
控制面节点,一般不会直接运行Pod,仅对集群内的Pod的运行进行调度与控制。主要包含三个组件:
- kube-apiserver:负责 API 服务,并将集群的状态持久化保存在 Etcd 中
- kube-scheduler:负责调度。
- kube-controller-manager:负责容器编排。
5.2.Worker节点
数据面节点,用于承载集群内的Pod的运行,主要包含三个组件:
- 容器运行时:负责拉取、运行容器镜像,常见的有Docker、Containerd。
- Kubelet:kubelet用于和K8s后台服务通信,把我们的命令转发给 Kubernetes,实现容器和集群的管理功能。才外,kubelet还会对Node进行一些监控,上报Node的信息,例如心跳、节点CPU与内存状态等;此外kubelet还会和容器运行时交互,管理和监控当前节点上的Pods和容器。kubelet相当于是Master和Worker及容器运行时的代理。
- kube-proxy:网络代理组件,维护节点上的网络规则,是Service的一部分,使得发往 Service 的流量负载均衡到正确的后端Pod。
当然,这三个组件在Master节点也是存在的。
6.Deployment
Deployment是K8s的核心内容,对Pod进行管理的工具,可以控制Pod的版本、数量。Deployment可以认为是一个虚拟的概念,最终的具体实现都会落实到Pod上面。
那么replicas=1 的 Deployment和一个单独的Pod有什么区别呢?
单独创建一个Pod,如果出了故障,除了自身的健康检查失败会重启的策略外,并不能保证一定会有一个可用的Pod,但是使用Deployment,可以保证无论如何都至少有一个Pod可用。
7.ReplicaSet
ReplicaSet 的目的是维护一组在任何时候都处于运行状态的 Pod 副本的稳定集合。 因此,它通常用来保证给定数量的、完全相同的 Pod 的可用性。
Deployment 是一个更高级的概念,它通过ReplicaSet来管理Pod的数量,保证数量Pod始终具有定义的replicas个副本数。因此在实际中,我们可能永远不需要操作 ReplicaSet 对象。
Deployment 实际上包含两部分:
- 控制 ReplicaSet 的个数来控制应用的版本
- 通过 ReplicaSet 的属性(例如 replicas 的值),来控制 Pod 的副本数量。
8.StatefulSet
Deployment提供的是无状态服务编排,应用之间相互平等独立,并不适用于有状态服务,例如数据库集群。有状态服务编排功能通过StatefulSet支持。
9.DaemonSet
DaemonSet会在 Kubernetes 集群的每个节点上都运行一个 Pod,并且确保每个节点有且仅有一个高可用的Pod,常用于监控应用(Prometheus)、日志应用(LCS、Fluentd)等。
10.ConfigMap & Secret
用于进行明文/私密(秘密、机密)配置。
11.Job & CronJob
用于进行临时任务与定时任务,任务执行完毕,Pod即会删除。
12.Service
在K8s集群中,所有的Pod是一种动态稳定的状态,Pod的经常会因为各种原因被删除重建,随之Pod的IP也会发生变化。K8s为了屏蔽Pod的IP变化对客户端的影响,引用了Service。
Service是K8s内置的一个负载均衡对象,工作在第四层。使用Service管理Pod,K8s会为Service分配一个静态IP,当客户端访问Service时,它会根据某种策略,把流量转发给后面的某个 Pod。
13.EndPoint
Endpoint是状态为running的Pod,它是Service访问的落点,只有Service关联的Pod才可能成为Endpoint。
14.Ingress
Ingress是工作在第七层的负载均衡对象,是K8s对反代的抽象,可以认为是Service的“Service”。Service是K8s集群内部的一个负载均衡对象,并不适合对外公开;此外,由于Service工作在第四层,功能也相对有限(例如无法根据HTTP的Path进行流量的转发)。因此引入了Ingress对象。
与Ingress相关的概念还有Ingress Controller和Ingress Class。
Ingress:Ingress相当于是接口,Ingress Controller则是具体的实现,例如Nginx Ingress Controller、Kong Ingress Controller等。
Ingress Class:Ingress Class是对Ingress规则的业务逻辑分组,Ingress Controller通过绑定Ingress Class来绑定Ingress。
15.Gateway
Gateway API目前已经进入beta阶段。最初被认为是Ingress API 的继任者,工作在第四层、第七层。相较于Ingress,Gateway 更加强大,支持 HTTP 头操作、流量加权和镜像、TCP/UDP 路由等能力,且具备更好的扩展性与移植性。