1. 资源对象描述
包含两类:
-
资源对象:Node、Pod、Service、Volume等
-
通用属性:Name、Label、Annotation
-
Name唯一
-
Label表明资源特征,用于筛选、控制和协作
-
Annotation为特殊标签,用于资源对象属性的自定义扩展
-
-
资源对象相关的事物和动作: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上
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/) |