k8s权威指南笔记:基本概念

Posted by keys961 on March 31, 2022

1. 资源对象描述

包含两类:

  1. 资源对象:Node、Pod、Service、Volume等

    • 通用属性:Name、Label、Annotation

    • Name唯一

    • Label表明资源特征,用于筛选、控制和协作

    • Annotation为特殊标签,用于资源对象属性的自定义扩展

  2. 资源对象相关的事物和动作:Label、Annotation、Namespace、Deployment、PVC等

2. 集群类

k8s集群由Master和Node组成。

2.1. Master

控制k8s集群,需要1个或1组服务器用于Master节点,管理Node集群。

包含下列关键进程:

  • kube-apiserver:提供HTTP API服务接口,用于资源控制

  • kube-controller-manager:资源控制中心

  • kube-scheduler:负责Pod调度

  • etcd:Master集群管理

2.2. Node

工作节点,被Master分配工作负载。需要向Master注册以扩容。

包含下列关键进程:

  • kubelet:负责Pod对应容器的创建、启动、停止等任务,并与Master协调

  • kube-proxy:负责Service等通信与负载均衡

  • 容器运行时:在容器中运行的任务

Namespace:用于集群逻辑上的隔离,在一个物理集群上构造多个虚拟集群,每个资源对象只能属于1个Namespace,默认default

3. 应用类

3.1. Pod

最小调度单位。特点:

  • 包含多个容器,其中一个是Pause根容器

  • IP地址唯一(Pod IP),多容器共享IP

    • 配置containerPort后,形成Endpoint,Pod可对外通信,可配置多个

    • 若配置hostNetwork,直接走宿主机

  • 多容器共享挂载的Volume

  • 任意2 Pod间可TCP/IP直接通信,采用虚拟二层网络

  • 常驻的Pod进程,需要放置到前台运行

3.2. Service

无状态服务。特点:

  • 包含一组Pod,用于提供服务(可用Deployment创建)

  • 拥有一个全局虚拟ClusterIP地址,用于k8s集群内部通信,生命周期内不会改变

    • 可通过DNS(服务名 -> IP映射)隐藏IP地址配置

    • 通过该IP访问服务(需要配置port),Service通过kube-proxy进行负载均衡,路由到具体的Pod上

    • 该IP无法ping通

    • 可配置nodePort,配合Node IP(物理节点IP),将服务暴露给外部网络

  • Headless Service:无ClusterIP,解析DNS获得所有Pod的Endpoint,直接和Pod通信,无需转发

Label:键值对,给Node、Pod、Deployment、Service等上标签。

Label Selector:用于筛选资源对象,可用等式(等号,不等号)或集合操作(in或not in),可用AND关联

  • Pod调度时,可用于选取特定的Node运行

  • Deployment创建时,可用于选取和匹配特定Pod,保证运行时的副本数量

  • Service创建时,可用于选取和匹配特定Pod加入服务中

3.3. Deployment

Pod模板,用于创建指定数量的Pod(类似ReplicaSet),用于无状态服务。特点:

  • 需要指定副本数量(replicas),Pod标签选择器(selector,用于调度到匹配的Node)和Pod创建模板(template

  • 能自动控制,保证存活Pod数量与定义一致

下图是Deployment、Pod、Service的结合:

  • 先Deployment,后Service

  • Deployment创建了3个label为app=backend的Pod

  • Service通过Label Selector将3个Pod纳入服务中

  • 一般,访问Service的ClusterIP,通过负载均衡路由到具体Pod上

图片.png

Ingress:通过虚拟域名,将服务进行路由转发,类似Nginx虚拟主机HTTP代理,

  • 暴露服务到外部时,不需要每个服务占用一个物理nodePort端口了

3.4. StatefulSet

特殊的Deployment,用于有状态服务。额外特征包括:

  • Pod拥有唯一、稳定的ID

  • Pod启动顺序受控

  • 采用持久化存储卷,通过PV或PVC实现,Pod删除时,存储卷不会被删除

  • 需要配合Headless Service使用,为每个Pod创建DNS域名,格式如下

    • $podname.$headless_service_name

但能力有限,因此有Operator框架和众多实现,并未来会以此进行替换。

3.5. Job

批处理应用

3.6. ConfigMap和Secret

配置数据,后者用于敏感数据。特点:

  • 可通过键值对形式传入,也可以通过Volume形式挂载(传入Pod等定义中)

  • 更新后,k8s会重新获取其内容并在目标节点上更新

3.7. HPA与VPA

HPA:横向自动扩缩容(调整Pod数量)

VPA:纵向自动扩缩容(调整Pod使用的系统资源量)

4. 存储类

参考:kubernetes系列(十四) - 存储之PersistentVolume - 宝树呐 - 博客园

4.1. Volume

存储卷,挂载到Pod中,供Pod内多个容器共享,生命周期与Pod相同。

它只能定义在Pod中,不能独立定义,属于静态管理。

类型常见的包含:

  • emptyDir:临时目录

  • hostPath:宿主机

  • 公有云,如GCE、AWS等

  • 其它类型:如iscsi, nfs

4.2. Persistent Volume(PV)

系统动态管理的存储卷,独立定义在Pod外,是k8s集群中的资源。

分为2类:

  • 静态PV:管理员手动创建的PV

  • 动态PV:当静态不满足PVC请求时,通过StorageClass尝试创建新的PV

    • PVC声明有StorageClass

    • StorageClass有被创建

    • 需要启用apiserver上的DefaultStorageClass

4.3. StorageClass

存储类,描述存储卷的特征,包含:

  • provisioner:第三方存储插件

  • parameters:创建PV需要的参数

  • reclaimPolicy:PV回收策略

它会被用于PVC中。

4.4. PVC

表示希望申请PV的规格,类似“申请书”,包含:

  • accessModes:访问模式

  • storageClassName:动态创建PV的存储类,""表示禁用动态创建PV

  • resources:存储资源规格

其优先使用最匹配的静态PV进行绑定。若失败,则通过StorageClass动态创建PV。

PVC可定义在Pod、Deployment、StatefulSet等,创建、使用PV并进行挂载。

5. 安全类

即RBAC角色权限控制。

资源对象包括:Role和ClusterRole。前者作用于某个命名空间,后者作用于整个集群。

6. k8s安装

kubeadm:[安装 kubeadm Kubernetes](https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/install-kubeadm/)