k8s核心知识点总结(超详细版)
k8s核心知识点总结(超详细版)
Kubernetes(简称k8s)是云原生时代的核心容器编排平台,几乎成为现代应用部署和管理的标准工具。本文系统梳理k8s的核心知识点,涵盖架构、核心概念、关键组件及实战技巧,帮助开发者快速掌握其核心逻辑。
一、k8s介绍
1.容器编排
1.1 容器编排概念
支持Docker在各个宿主机节点自动部署、自动扩容、负载均衡、滚动升级等等这些操作是通过编排工具去完成,支持这些功能的工具,称为容器编排。流行的开源容器编排工具包括Kubernetes、Docker Swarm以及Mesos等。
1.2 为什么需要容器编排
- 应用程序如何使用透明化发布。比如我们发布100个容器到10个节点,那么这10个节点应该怎样分布这100个容器呢。
- 已经部署的容器,怎样实现快速的扩容。比如某个服务已经运行10个容器,但是目前用户量突增,系统访问变慢,怎样实现快速的扩容,甚至秒级扩容。
- 一个应用运行了100个容器,怎样做到从客户端的请求能够根据某个算法均匀分布到容器中。
2.k8s基本介绍
2.1 概念
k8s是一个开源的容器化编排工具,用于容器的自动化部署、扩展和管理。
k8s的本质就是一组服务器集群,它可以在每个节点运行特定的程序,来对节点中的容器进行管理,实现资源管理的自动化。
2.2 特点
- 自我修复:一旦某个容器崩溃,可以在短时间内迅速启动新的容器。
- 弹性伸缩:根据需要自动调整集群中容器的数量。
- 负载均衡:根据负载均衡策略给不同的pod分发请求。
- 服务发现:服务通过自动发现找到所依赖的服务,通过DNS解析实现服务发现。
- 版本回退:新版本有问题,可以立即回退到上一个版本。
- 存储编排:根据需求自动创建存储卷。
3. k8s中的开放接口CRI、CNI、CSI
3.1 CRI (Container Runtime Interface)
容器运行时接口,提供计算资源,是 Kubernetes 的核心组件之一,用于解耦 K8s 与底层容器运行时,使得 K8s 能够灵活支持多种容器实现。
将 Kubernetes 与具体容器运行时(如 Docker、containerd、CRI-O)解耦,允许用户根据需要选择运行时,而无需修改 Kubernetes 核心代码。
Docker是k8s最初推广的容器运行时;containerd是行业标准运行时,被 Docker 和 k8s广泛采用,通过 cri-plugin 支持 CRI;CRI-O是专为k8s 设计的轻量级运行时,仅实现 CRI 功能,资源占用更低。
3.2 CNI (Container Network Interface)
容器网络接口,提供网络资源,是 K8s 及其他容器平台中用于管理容器网络的标准接口,它定义了容器在创建和销毁时如何连接到网络、分配 IP 地址以及配置网络策略的通用规范,kubelet 通过 --cni-bin-dir 和 --cni-conf-dir 参数指定 CNI 插件路径和配置文件目录。
常见CNI插件有Calico、Flannel。Calico基于BGP的路由方案,支持高性能网络和细粒度网络策略(NetworkPolicy);Flannel是简单易用的覆盖网络(VXLAN),适合中小规模集群。
3.3 CSI (Container Storage Interface)
容器存储接口,提供存储资源,是 K8s 及其他容器编排平台中用于管理持久化存储的标准接口,其核心目标是解耦存储系统与容器平台,使存储供应商能够通过统一接口接入容器生态,支持动态卷配置、快照、克隆等高级功能。允许存储提供商无需修改容器平台代码即可接入,支持动态卷生命周期管理(创建、挂载、扩容、快照等)。
CSI 的核心功能是按需自动创建存储卷、支持在线扩容、同一集群可接入多个存储系统、支持共享存储(如 NFS、CephFS)。
CSI 与 Kubernetes 资源对象:
- PersistentVolume (PV):集群中的存储资源实例(如一块云盘);
- PersistentVolumeClaim (PVC):用户对存储资源的请求(如容量、访问模式);
- StorageClass:定义动态卷配置的模板(指定 CSI 驱动及参数)。
以nfs为例创建动态存储类
[root@master-1 nfs]# cat nfs-class.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: managed-nfs-storage
provisioner: fuseim.pri/ifs # or choose another name, must match deployment's env PROVISIONER_NAME'
parameters:
archiveOnDelete: "true"
[root@master-1 nfs]# cat pvc.yaml
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: demo-data
namespace: default
spec:
accessModes:
- ReadWriteMany
storageClassName: managed-nfs-storage
resources:
requests:
storage: 1Gi
[root@master-1 nfs]# cat nfs-rabc.yaml
kind: ServiceAccount
apiVersion: v1
metadata:
name: nfs-client-provisioner
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: nfs-client-provisioner-runner
rules:
- apiGroups: [""]
resources: ["persistentvolumes"]
verbs: ["get", "list", "watch", "create", "delete"]
- apiGroups: [""]
resources: ["persistentvolumeclaims"]
verbs: ["get", "list", "watch", "update"]
- apiGroups: ["storage.k8s.io"]
resources: ["storageclasses"]
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources: ["events"]
verbs: ["create", "update", "patch"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: run-nfs-client-provisioner
subjects:
- kind: ServiceAccount
name: nfs-client-provisioner
namespace: default
roleRef:
kind: ClusterRole
name: nfs-client-provisioner-runner
apiGroup: rbac.authorization.k8s.io
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: leader-locking-nfs-client-provisioner
rules:
- apiGroups: [""]
resources: ["endpoints"]
verbs: ["get", "list", "watch", "create", "update", "patch"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: leader-locking-nfs-client-provisioner
subjects:
- kind: ServiceAccount
name: nfs-client-provisioner
# replace with namespace where provisioner is deployed
namespace: default
roleRef:
kind: Role
name: leader-locking-nfs-client-provisioner
apiGroup: rbac.authorization.k8s.io
[root@master-1 nfs]# cat nfs-deployment.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: nfs-client-provisioner
---
kind: Deployment
apiVersion: apps/v1
metadata:
name: nfs-client-provisioner
spec:
selector:
matchLabels:
app: nfs-client-provisioner
replicas: 1
strategy:
type: Recreate
template:
metadata:
labels:
app: nfs-client-provisioner
spec:
serviceAccountName: nfs-client-provisioner
containers:
- name: nfs-client-provisioner
imagePullPolicy: IfNotPresent
image: quay.io/external_storage/nfs-client-provisioner:latest
volumeMounts:
- name: nfs-client-root
mountPath: /persistentvolumes
env:
- name: PROVISIONER_NAME
value: fuseim.pri/ifs
- name: NFS_SERVER
value: 192.168.91.19
- name: NFS_PATH
value: /ifs/kubernetes
volumes:
- name: nfs-client-root
nfs:
server: 192.168.91.19
path: /ifs/kubernetes
4.k8s的编排流程
- 用户使用kubectl向api-server发起创建pod资源对象的请求;
- api-server验证请求并将其保存在etcd集群中,并基于watch机制通知kube-scheduler调度器;
- kube-scheduler调度器根据预选和优选调度算法为pod选择最优的节点并通知api-server;
- api-server将选择的节点保存在etcd中,并通知kubelet组件;
- kubelet去对应节点创建和管理pod对象,与容器交互管理pod的生命周期,并实时上报容器的状态给api-server;
- api-server将容器状态持久保存在etcd中。
二、k8s核心架构
Kubernetes采用 Master-Node 架构,分为控制平面(Control Plane)和工作节点(Worker Node)。Master 节点负责集群的调度、管理和运维,Node 节点是集群中的工作负载节点。
1.控制面板(Master)
1.1 API Server
集群的统一入口,负责接收、处理k8s的所有REST请求,然后提交给etcd存储,是唯一与etcd交互的组件。
1.2 etcd
分布式键值存储数据库,用于保存集群状态和配置数据
1.3 Scheduler
调度器,负责将Pod调度到合适的Node上(基于资源需求、亲和性等策略)
1.4 Controller Manager
集群内部的管理控制中心,负责管理和运行不同的控制器(如Deployment、Node、Job控制器),负责维护集群的状态,包括节点管理和副本管理。节点宕机或副本异常时会执行自动化修复流程。实现对集群内的node、pod等所有资源的管理。当node节点运行的pod对象或者node自身发生意外或故障时,controller manager会及时发现并处理,确保整个集群处于正常工作状态。
2.工作节点(Node)
2.1 kubelet
node节点的监视器,与master节点的api-server通信,上报node节点的服务状态,管理Pod生命周期。并根据master的指令创建、启动、监控和终止pod。
2.2 kube-proxy
实现service的服务发现和负载均衡,Kube-proxy配置网络规则(如:iptables或IPVS),以实现服务的负载均衡和路由。
2.3 Container Runtime
容器运行时(Docker、containerd、CRI-O):通过CRI(容器运行时接口)与Kubelet进行通信。负责实际运行容器,它根据 kubelet 的指令拉取容器镜像、创建和启动容器,并提供容器运行的环境和资源管理
3.架构图
本章节在此告一段落了,下一章节我们将为大家介绍k8s的各个资源对象,文字介绍+案例讲解