🌲K8s核心概念 - 图1

基本概念

1. 硬件

Node

🌲K8s核心概念 - 图2
说是「硬件」,其实也可以是虚拟机、云主机。

Cluster

🌲K8s核心概念 - 图3
很多Node拼接成一个Cluster,就好比很多小单元组成蜂巢。

Persistent Volumes

🌲K8s核心概念 - 图4
Cluster只是计算型资源,存储型资源是外置的,可以是云存储或者真硬盘,靠「电线」插拔上去。

2. 软件

Containers

image.png
应用和依赖的环境打包固化在一起,就是容器。

Pods

image.png
一组高内聚的应用进一步打包成Pod,Pod是K8S里面最基础的部署单元,一个Pod配置一个IP。

Ingress

🌲K8s核心概念 - 图7
K8S Cluster是被防火墙保护的,Ingress就是城门。

3. 实际形态

总体图

🌲K8s核心概念 - 图8

  • Cluster中有一个master。
  • 每个Node上都运行着K8S的client-kubelet。
  • kubelet又运行着docker。

    局部图

    🌲K8s核心概念 - 图9

  • Node里面运行着大大小小各个Pod。

    4. 提供服务

    以上所述之「硬件」「软件」只是应用在K8S中的部署,是对内的,只有发布成Service,才可以对外提供服务。服务与部署是应用的不同切面,部署是把能力生产出来,服务是把能力提供出去,通过 Label 可以把「部署」以松耦合的方式组合成一个「服务」对外发布。
    🌲K8s核心概念 - 图10

    对象类型

    | 类别 | 名称 | | —- | —- | | 资源对象 | Pod、ReplicaSet、ReplicationController、Deployment、StatefulSet、DaemonSet、Job CronJob、HorizontalPodAutoscaling | | 配置对象 | Node、Namespace、Service、Secret、ConfigMap、Ingress、Label、ThirdPartyResource、 ServiceAccount | | 存储对象 | Volume、Persistent Volume | | 策略对象 | SecurityContext、ResourceQuota、LimitRange |

资源对象

🌲K8s核心概念 - 图11

Kubernetes的核心技术概念和API对象

🌲K8s核心概念 - 图12

基本对象

API对象 描述
Pod Pod是最小部署单元,一个Pod由一个或多个容器组成,Pod中容器共享存储和网络,在同一台Docker主机上运行。
Service Service一个应用服务抽象,定义了Pod逻辑集合和访问这个Pod集合的策略。Service代理Pod集合对外表现是为一个访问入口,分配一个集群IP地址,来自这个IP的请求将负载均衡转发后端Pod中的容器。Service通过Lable Selector选择一组Pod提供服务。
Volume 数据卷,共享Pod中容器使用的数据。
Namespace 命名空间将对象逻辑上分配到不同Namespace,可以使不同的项目、用户等区分管理,并设定控制策略,从而实现多租户。常见的 pods, services, replication controllers 和 deployments 等都是属于某一个 namespace 的(默认是 default),而 node, persistentVolumes 等则不属于任何 namespace。
命名空间也称为虚拟集群。
Label 标签用于区分对象(比如Pod、Service),键/值对存在;每个对象可以有多个标签,通过标签关联对象。

Pod

pod.jpeg
字面含义是如图所示的豌豆,在 k8s 中用这个名字形象的表示若干个关系紧密的、共享一定资源的容器集合(1个或者多个)。
image.png
关于pod有如下理解:

  • pod是k8s项目的原子调度单位,也就是说k8s的调度器是按照pod而不是容器的资源需求来进行调度的。
  • pod只是一个逻辑概念,并不存在所谓的pod的边界或者隔离环境(虽然在概念上我们可以认为存在)。
  • k8s 引入pod的概念目的是:
    • 通过成“组”的概念能比较好的表达真实世界里的进程之间的亲密关系,并且在这种情况下资源调度也会成“组”调度。
    • 容器设计模式,典型的比如 sidecar 模式(可以在一个 Pod 中,启动一个辅助容器,来完成一些独立于主进程(主容器)之外的工作)。
  • pod里的所有容器,共享同一个Network Namespace,并且可以共享同一个Volume。
  • 在k8s中,pod中会先创建一个Infra容器,而用户定义的其他的容器Join到Infra容器的Network Namepace。

image.png

  • pod里的容器可直接使用 localhost 通信。
  • 一个pod只有一个 IP地址。
  • pod的生命周期只和Infra容器一致,与用户容器无关。
    • 某种角度看,pod实际是类似传统基础设施里“虚拟机”的角色;而容器则是这个虚拟机里运行的用户程序(这种理解对于迁移基于传统虚拟机的应用非常重要,要摒弃同一个容器里放多个进程,仔细分析应用程序的关系,来决定是否/哪些容器放到哪些 pod 里)。
    • pod中的所有Init Container定义的容器会按顺序逐一启动,而直到它们都启动并且退出了,用户容器才会启动。

      高阶对象

      控制器(Controller)

      | API对象 | 描述 | | —- | —- | | Replication Controller | | | ReplicaSet | 下一代Replication Controller。确保任何给定时间指定的Pod副本数量,并提供声明式更新等功能。RC与RS唯一区别就是lable selectore支持不同,RS支持新的基于集合的标签,RC仅支持基于等式的标签。 | | Deployment | Deployment是一个更高层次的API对象,他管理ReplicaSets和Pod,并提供声明式更新等功能。官方建议使用Deployment管理ReplicaSets,而不是直接使用ReplicaSets,这就意味着可能永远不需要直接操作ReplicaSet对象。 | | StatefulSet | StatefulSet适合持久性的应用程序,有唯一的网络标识符(IP),持久存储,有序的部署、扩展、删除和滚动更新。 | | DaemonSet | DaemonSet确保所有(或一些)节点运行同一个Pod。当节点加入kubernetes集群中,Pod会被调度到该节点上运行,当节点从集群中移除时,DaemonSet的Pod会被删除。删除DaemonSet会清理它所有创建的Pod。 | | Job | 一次性任务,运行完成后Pod销毁,不再重新启动新容器。还可以任务定时运行。 | | CronJob | | | RBAC | | | HPA | | | PodDisruptionBudget | | | PodSecurityPolicy | | | limitRange | | | startupProbe | |

Deployment

image.png

持久化存储(PV、PVC)

StorageClass

网络

API对象 描述
Flannel
Calico
NetworkPolicy

参考

运维之美:图解Kubernetes架构
https://www.hi-linux.com/posts/48037.html