问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

k8s核心知识点总结(超详细版)

创作时间:
作者:
@小白创作中心

k8s核心知识点总结(超详细版)

引用
CSDN
1.
https://blog.csdn.net/qq_37182070/article/details/146976115

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的各个资源对象,文字介绍+案例讲解

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号