蛮子哥 蛮子哥
首页
  • linux
  • windows
  • 中间件
  • 监控
  • 网络
  • 存储
  • 安全
  • 防火墙
  • 数据库
  • 系统
  • docker
  • 运维工具
  • other
  • elk
  • K8S
  • ansible
  • Jenkins
  • GitLabCI_CD
  • ArgoCD
  • 随笔
  • 面试
  • 工具
  • 收藏夹
  • Shell
  • python
  • golang
友链
  • 索引

    • 分类
    • 标签
    • 归档
    • 首页 (opens new window)
    • 关于我 (opens new window)
    • 图床 (opens new window)
    • 评论 (opens new window)
    • 导航栏 (opens new window)
周刊
GitHub (opens new window)

蛮子哥

业精于勤,荒于嬉
首页
  • linux
  • windows
  • 中间件
  • 监控
  • 网络
  • 存储
  • 安全
  • 防火墙
  • 数据库
  • 系统
  • docker
  • 运维工具
  • other
  • elk
  • K8S
  • ansible
  • Jenkins
  • GitLabCI_CD
  • ArgoCD
  • 随笔
  • 面试
  • 工具
  • 收藏夹
  • Shell
  • python
  • golang
友链
  • 索引

    • 分类
    • 标签
    • 归档
    • 首页 (opens new window)
    • 关于我 (opens new window)
    • 图床 (opens new window)
    • 评论 (opens new window)
    • 导航栏 (opens new window)
周刊
GitHub (opens new window)
  • ansible系列文章

  • Kubernetes笔记

    • 安装篇-kubeadm
    • k8s入门
    • k8s安装篇二进制
    • k8s面试题
    • kubernetes(k8s)yaml文件详解
    • k8s报错小结
    • Kubernetes 安装配置ingress controller
    • cka考试真题
    • ingress配置证书
    • cka考试作业
    • k8s部署java项目
    • jenkins脚本式流水线部署k8s项目实例一
    • helm v3安装并创建例子
    • 使用helm将本地部署文件上传到harbor chart上
    • helm公共仓库创建
    • helm适应minio作为私有仓库
    • helm release使用说明
    • kubernetes核心概念
      • kubectl使用技巧
      • kubernetes卷的几种类型
      • kubernetes安全框架
      • 云原生-什么是HPA和PDB、VPA
      • k8s部署php项目示例
      • 配置kubeconfig 文件访问 Kubernetes 集群
      • configmap配置的几种方式
      • k8s配置go服务
      • k8s部署java项目
      • kubernetes部署prometheus监控
      • kubernetes部署elk日志系统
      • kubernetes环境devops流水线
      • kubernetes高阶技能必备的工具
      • deployment中使用configmap、secret的方式
      • 业务pod 飘移pending排查分析
      • debian 12安装kubernetes
      • istio入门
      • kubernetes证书续签到100年
      • kubernetes网络模式
      • etcd的备份和还原
      • Kubernetes 安装和配置 NFS 存储卷
      • VictoriaLogs集群采集Kubernetes Pod日志
      • 解决容器时区问题
      • 日志采集操作示例
      • operator 部署 VictoriaMetrics
      • grafana高可用部署
    • elk

    • jenkins

    • GitLabCI_CD

    • AI编程

    • 提示词

    • ArgoCD

    • 专题
    • Kubernetes笔记
    蛮子哥
    2023-06-13
    目录

    kubernetes核心概念

    # 一、Pod

    Pod是一组紧密关联的容器集合,支持多个容器在一个Pod中共享网络和文件系统,可以通过进程间通信和文件共享这种简单高效的方式完成服务,是Kubernetes调度的基本单位。Pod的设计理念是每个Pod都有一个唯一的IP。

    Pod具有如下特征:

    • 包含多个共享IPC、Network和UTC namespace的容器,可直接通过localhost通信
    • 所有Pod内容器都可以访问共享的Volume,可以访问共享数据
    • 优雅终止:Pod删除的时候先给其内的进程发送SIGTERM,等待一段时间(grace period)后才强制停止依然还在运行的进程
    • 特权容器(通过SecurityContext配置)具有改变系统配置的权限(在网络插件中大量应用)
    • 支持三种重启策略(restartPolicy),分别是:Always、OnFailure、Never
    • 支持三种镜像拉取策略(imagePullPolicy),分别是:Always、Never、IfNotPresent
    • 资源限制,Kubernetes通过CGroup限制容器的CPU以及内存等资源,可以设置request以及limit值
    • 健康检查,提供两种健康检查探针,分别是livenessProbe和redinessProbe,前者用于探测容器是否存活,如果探测失败,则根据重启策略进行重启操作,后者用于检查容器状态是否正常,如果检查容器状态不正常,则请求不会到达该Pod
    • Init container在所有容器运行之前执行,常用来初始化配置
    • 容器生命周期钩子函数,用于监听容器生命周期的特定事件,并在事件发生时执行已注册的回调函数,支持两种钩子函数:postStart和preStop,前者是在容器启动后执行,后者是在容器停止前执行

    # 二、Namespace

    Namespace(命名空间)是对一组资源和对象的抽象集合,比如可以用来将系统内部的对象划分为不同的项目组或者用户组。常见的pod、service、replicaSet和deployment等都是属于某一个namespace的(默认是default),而node, persistentVolumes等则不属于任何namespace。

    常用namespace操作:

    • kubectl get namespace, 查询所有namespace
    • kubectl create namespace ns-name,创建namespace
    • kubectl delete namespace ns-name, 删除namespace

    删除命名空间时,需注意以下几点:

    1. 删除一个namespace会自动删除所有属于该namespace的资源。
    2. default 和 kube-system 命名空间不可删除。
    3. PersistentVolumes是不属于任何namespace的,但PersistentVolumeClaim是属于某个特定namespace的。
    4. Events是否属于namespace取决于产生events的对象。

    # 三、Node

    Node是Pod真正运行的主机,可以是物理机也可以是虚拟机。Node本质上不是Kubernetes来创建的, Kubernetes只是管理Node上的资源。为了管理Pod,每个Node节点上至少需要运行container runtime(Docker)、kubelet和kube-proxy服务。

    常用node操作:

    • kubectl get nodes,查询所有node
    • kubectl cordon $nodename, 将node标志为不可调度
    • kubectl uncordon $nodename, 将node标志为可调度

    taint(污点)

    使用kubectl taint命令可以给某个Node节点设置污点,Node被设置上污点之后就和Pod之间存在了一种相斥的关系,可以让Node拒绝Pod的调度执行,甚至将Node已经存在的Pod驱逐出去。每个污点的组成:key=value:effect,当前taint effect支持如下三个选项:

    • NoSchedule:表示k8s将不会将Pod调度到具有该污点的Node上
    • PreferNoSchedule:表示k8s将尽量避免将Pod调度到具有该污点的Node上
    • NoExecute:表示k8s将不会将Pod调度到具有该污点的Node上,同时会将Node上已经存在的Pod驱逐出去

    常用命令如下:

    • kubectl taint node node0 key1=value1:NoShedule,为node0设置不可调度污点
    • kubectl taint node node0 key-,将node0上key值为key1的污点移除
    • kubectl taint node node1 node-role.kubernetes.io/master=:NoSchedule,为kube-master节点设置不可调度污点
    • kubectl taint node node1 node-role.kubernetes.io/master=PreferNoSchedule,为kube-master节点设置尽量不可调度污点

    容忍(Tolerations)

    设置了污点的Node将根据taint的effect:NoSchedule、PreferNoSchedule、NoExecute和Pod之间产生互斥的关系,Pod将在一定程度上不会被调度到Node上。 但我们可以在Pod上设置容忍(Toleration),意思是设置了容忍的Pod将可以容忍污点的存在,可以被调度到存在污点的Node上。

    # 四、Service

    Service是对一组提供相同功能的Pods的抽象,并为他们提供一个统一的入口,借助 Service 应用可以方便的实现服务发现与负载均衡,并实现应用的零宕机升级。Service通过标签(label)来选取后端Pod,一般配合ReplicaSet或者Deployment来保证后端容器的正常运行。

    service 有如下四种类型,默认是ClusterIP:

    • ClusterIP: 默认类型,自动分配一个仅集群内部可以访问的虚拟IP
    • NodePort: 在ClusterIP基础上为Service在每台机器上绑定一个端口,这样就可以通过 NodeIP:NodePort 来访问该服务
    • LoadBalancer: 在NodePort的基础上,借助cloud provider创建一个外部的负载均衡器,并将请求转发到 NodeIP:NodePort
    • ExternalName: 将服务通过DNS CNAME记录方式转发到指定的域名

    另外,也可以将已有的服务以Service的形式加入到Kubernetes集群中来,只需要在创建 Service 的时候不指定Label selector,而是在Service创建好后手动为其添加endpoint。

    # 五、Volume 存储卷

    默认情况下容器的数据是非持久化的,容器消亡以后数据也会跟着丢失,所以Docker提供了Volume机制以便将数据持久化存储。Kubernetes提供了更强大的Volume机制和插件,解决了容器数据持久化以及容器间共享数据的问题。

    Kubernetes存储卷的生命周期与Pod绑定

    • 容器挂掉后Kubelet再次重启容器时,Volume的数据依然还在
    • Pod删除时,Volume才会清理。数据是否丢失取决于具体的Volume类型,比如emptyDir的数据会丢失,而PV的数据则不会丢

    目前Kubernetes主要支持以下Volume类型:

    • emptyDir:Pod存在,emptyDir就会存在,容器挂掉不会引起emptyDir目录下的数据丢失,但是pod被删除或者迁移,emptyDir也会被删除
    • hostPath:hostPath允许挂载Node上的文件系统到Pod里面去
    • NFS(Network File System):网络文件系统,Kubernetes中通过简单地配置就可以挂载NFS到Pod中,而NFS中的数据是可以永久保存的,同时NFS支持同时写操作。
    • glusterfs:同NFS一样是一种网络文件系统,Kubernetes可以将glusterfs挂载到Pod中,并进行永久保存
    • cephfs:一种分布式网络文件系统,可以挂载到Pod中,并进行永久保存
    • subpath:Pod的多个容器使用同一个Volume时,会经常用到
    • secret:密钥管理,可以将敏感信息进行加密之后保存并挂载到Pod中
    • persistentVolumeClaim:用于将持久化存储(PersistentVolume)挂载到Pod中

    # 六、PersistentVolume(PV) 持久化存储卷

    PersistentVolume(PV)是集群之中的一块网络存储。跟 Node 一样,也是集群的资源。PersistentVolume (PV)和PersistentVolumeClaim (PVC)提供了方便的持久化卷: PV提供网络存储资源,而PVC请求存储资源并将其挂载到Pod中。

    PV的访问模式(accessModes)有三种:

    • ReadWriteOnce(RWO): 是最基本的方式,可读可写,但只支持被单个Pod挂载。
    • ReadOnlyMany(ROX): 可以以只读的方式被多个Pod挂载。
    • ReadWriteMany(RWX): 这种存储可以以读写的方式被多个Pod共享。

    不是每一种存储都支持这三种方式,像共享方式,目前支持的还比较少,比较常用的是 NFS。在PVC绑定PV时通常根据两个条件来绑定,一个是存储的大小,另一个就是 访问模式。

    PV的回收策略(persistentVolumeReclaimPolicy)也有三种:

    • Retain,不清理保留Volume(需要手动清理)
    • Recycle,删除数据,即 rm -rf /thevolume/* (只有NFS和HostPath支持)
    • Delete,删除存储资源

    # 七、Deployment 无状态应用

    一般情况下我们不需要手动创建Pod实例,而是采用更高一层的抽象或定义来管理Pod,针对无状态类型的应用,Kubernetes使用Deloyment的Controller对象与之对应。其典型的应用场景包括:

    • 定义Deployment来创建Pod和ReplicaSet
    • 滚动升级和回滚应用
    • 扩容和缩容
    • 暂停和继续Deployment

    常用的操作命令如下:

    • kubectl run www --image=10.0.0.183:5000/hanker/www:0.0.1 --port=8080 生成一个Deployment对象
    • kubectl get deployment --all-namespaces 查找Deployment
    • kubectl describe deployment www 查看某个Deployment
    • kubectl edit deployment www 编辑Deployment定义
    • kubectl delete deployment www 删除某Deployment
    • kubectl scale deployment/www--replicas=2 扩缩容操作,即修改Deployment下的Pod实例个数
    • kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1更新镜像
    • kubectl rollout undo deployment/nginx-deployment 回滚操作
    • kubectl rollout status deployment/nginx-deployment 查看回滚进度
    • kubectl autoscale deployment nginx-deployment --min=10 --max=15 --cpu-percent=80 启用水平伸缩(HPA - horizontal pod autoscaling),设置最小、最大实例数量以及目标cpu使用率
    • kubectl rollout pause deployment/nginx-deployment 暂停更新Deployment
    • kubectl rollout resume deploy nginx 恢复更新Deployment

    更新策略:

    .spec.strategy 指新的Pod替换旧的Pod的策略,有以下两种类型

    • RollingUpdate 滚动升级,可以保证应用在升级期间,对外正常提供服务。
    • Recreate 重建策略,在创建出新的Pod之前会先杀掉所有已存在的Pod。

    Deployment和ReplicaSet两者之间的关系:

    • 使用Deployment来创建ReplicaSet。ReplicaSet在后台创建pod,检查启动状态,看它是成功还是失败。
    • 当执行更新操作时,会创建一个新的ReplicaSet,Deployment会按照控制的速率将pod从旧的ReplicaSet移 动到新的ReplicaSet中

    # 八、StatefulSet 有状态应用

    Deployments和ReplicaSets是为无状态服务设计的,那么StatefulSet则是为了有状态服务而设计,其应用场景包括:

    • 稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据,基于PVC来实现
    • 稳定的网络标志,即Pod重新调度后其PodName和HostName不变,基于Headless Service(即没有Cluster IP的Service)来实现
    • 有序部署,有序扩展,即Pod是有顺序的,在部署或者扩展的时候要依据定义的顺序依次进行操作(即从0到N-1,在下一个Pod运行之前所有之前的Pod必须都是Running和Ready状态),基于init containers来实现
    • 有序收缩,有序删除(即从N-1到0)

    支持两种更新策略:

    • OnDelete: 当 .spec.template更新时,并不立即删除旧的Pod,而是等待用户手动删除这些旧Pod后自动创建新Pod。这是默认的更新策略,兼容v1.6版本的行为
    • RollingUpdate: 当 .spec.template 更新时,自动删除旧的Pod并创建新Pod替换。在更新时这些Pod是按逆序的方式进行,依次删除、创建并等待Pod变成Ready状态才进行下一个Pod的更新。

    # 九、DaemonSet 守护进程集

    DaemonSet保证在特定或所有Node节点上都运行一个Pod实例,常用来部署一些集群的日志采集、监控或者其他系统管理应用。典型的应用包括:

    • 日志收集,比如fluentd,logstash等
    • 系统监控,比如Prometheus Node Exporter,collectd等
    • 系统程序,比如kube-proxy, kube-dns, glusterd, ceph,ingress-controller等

    指定Node节点:

    DaemonSet会忽略Node的unschedulable状态,有两种方式来指定Pod只运行在指定的Node节点上:

    • nodeSelector: 只调度到匹配指定label的Node上
    • nodeAffinity: 功能更丰富的Node选择器,比如支持集合操作
    • podAffinity: 调度到满足条件的Pod所在的Node上

    目前支持两种策略:

    • OnDelete: 默认策略,更新模板后,只有手动删除了旧的Pod后才会创建新的Pod
    • RollingUpdate: 更新DaemonSet模版后,自动删除旧的Pod并创建新的Pod

    # 十、Ingress

    Kubernetes中的负载均衡我们主要用到了以下两种机制:

    • Service:使用Service提供集群内部的负载均衡,Kube-proxy负责将service请求负载均衡到后端的Pod中
    • Ingress Controller:使用Ingress提供集群外部的负载均衡

    Service和Pod的IP仅可在集群内部访问。集群外部的请求需要通过负载均衡转发到service所在节点暴露的端口上,然后再由kube-proxy通过边缘路由器将其转发到相关的Pod,Ingress可以给service提供集群外部访问的URL、负载均衡、HTTP路由等,为了配置这些Ingress规则,集群管理员需要部署一个Ingress Controller,它监听Ingress和service的变化,并根据规则配置负载均衡并提供访问入口。

    常用的ingress controller:

    • nginx
    • traefik
    • Kong
    • Openresty

    # 十一、Job & CronJob 任务和定时任务

    Job负责批量处理短暂的一次性任务 (short lived>CronJob即定时任务,就类似于Linux系统的crontab,在指定的时间周期运行指定的任务。

    # 十二、HPA(Horizontal Pod Autoscaling) 水平伸缩

    Horizontal Pod Autoscaling可以根据CPU、内存使用率或应用自定义metrics自动扩展Pod数量 (支持replication controller、deployment和replica set)。

    • 控制管理器默认每隔30s查询metrics的资源使用情况(可以通过 --horizontal-pod-autoscaler-sync-period 修改)

    • 支持三种metrics类型

      • 预定义metrics(比如Pod的CPU)以利用率的方式计算
      • 自定义的Pod metrics,以原始值(raw value)的方式计算
      • 自定义的object metrics
    • 支持两种metrics查询方式:Heapster和自定义的REST API

    • 支持多metrics

    可以通过如下命令创建HPA:kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10

    # 十三、Service Account

    Service account是为了方便Pod里面的进程调用Kubernetes API或其他外部服务而设计的!

    授权

    Service Account为服务提供了一种方便的认证机制,但它不关心授权的问题。可以配合RBAC(Role Based Access Control)来为Service Account鉴权,通过定义Role、RoleBinding、ClusterRole、ClusterRoleBinding来对sa进行授权。

    # 十四、Secret 密钥

    Sercert-密钥解决了密码、token、密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者Pod Spec中。Secret可以以Volume或者环境变量的方式使用。有如下三种类型:

    • Service Account: 用来访问Kubernetes API,由Kubernetes自动创建,并且会自动挂载到Pod的 /run/secrets/kubernetes.io/serviceaccount 目录中;
    • Opaque: base64编码格式的Secret,用来存储密码、密钥等;
    • kubernetes.io/dockerconfigjson: 用来存储私有docker registry的认证信息。

    # 十五、ConfigMap 配置中心

    ConfigMap用于保存配置数据的键值对,可以用来保存单个属性,也可以用来保存配置文件。ConfigMap跟secret很类似,但它可以更方便地处理不包含敏感信息的字符串。ConfigMap可以通过三种方式在Pod中使用,三种分别方式为:设置环境变量、设置容器命令行参数以及在Volume中直接挂载文件或目录。

    可以使用 kubectl create configmap从文件、目录或者key-value字符串创建等创建 ConfigMap。也可以通过 kubectl create-f value.yaml 创建。

    # 十六、Resource Quotas 资源配额

    资源配额(Resource Quotas)是用来限制用户资源用量的一种机制。

    资源配额有如下类型:

    • 计算资源,包括cpu和memory

      • cpu, limits.cpu, requests.cpu
      • memory, limits.memory, requests.memory
    • 存储资源,包括存储资源的总量以及指定storage class的总量

      • requests.storage:存储资源总量,如500Gi
      • persistentvolumeclaims:pvc的个数
      • storageclass.storage.k8s.io/requests.storage
      • storageclass.storage.k8s.io/persistentvolumeclaims
    • 对象数,即可创建的对象的个数

      • pods, replicationcontrollers, configmaps, secrets
      • resourcequotas, persistentvolumeclaims
      • services, services.loadbalancers, services.nodeports

    它的工作原理为:

    • 资源配额应用在Namespace上,并且每个Namespace最多只能有一个 ResourceQuota 对象
    • 开启计算资源配额后,创建容器时必须配置计算资源请求或限制(也可以 用LimitRange设置默认值),用户超额后禁止创建新的资源

    # kubernetes名词理解

    你现在的阶段,其实不是“不会 Kubernetes”,而是进入了 Kubernetes 一个典型瓶颈:

    名词太多,而且很多概念长得像、功能又有关联。

    尤其像:

    • taint
    • toleration
    • cordon
    • drain
    • eviction
    • affinity
    • selector
    • scheduler

    这些都围绕:

    “Pod 到底怎么被调度、怎么被驱逐、怎么迁移”

    所以容易混。

    我帮你用「运维视角 + 真实场景」彻底串起来。

    一、先建立 Kubernetes 最核心思想

    Kubernetes 本质上只有两件事:

    1. Pod 放到哪台机器
    2. Pod 出问题怎么恢复

    你现在混乱的这些概念,90% 都属于:

    “Pod 和 Node 的关系管理”

    也就是:

    • 能不能调度
    • 能不能运行
    • 要不要驱逐
    • 要不要迁移

    二、先理解 Node 的四种状态管理

    这是最关键的。

    你可以把 Node 理解成:

    “酒店房间”

    Pod 是:

    “住客”

    Kubernetes 调度器是:

    “前台”


    三、最容易混淆的一组:taint / toleration

    这是:

    “禁止入住机制”


    1. taint(污点)

    作用:

    给 Node 打标签:

    “普通 Pod 不允许来这里”

    例如:

    kubectl taint node node1 gpu=true:NoSchedule
    
    1

    意思:

    node1:
    你没有 GPU 通行证就别来
    
    1
    2

    2. toleration(容忍)

    Pod 上声明:

    “虽然这里有污点,但我允许进去”

    Pod YAML:

    tolerations:
    - key: "gpu"
      operator: "Equal"
      value: "true"
      effect: "NoSchedule"
    
    1
    2
    3
    4
    5

    意思:

    我有 GPU 通行证
    允许调度到这个节点
    
    1
    2

    四、真实项目场景(你面试一定会被问)


    场景1:GPU 节点隔离

    公司有:

    • 普通节点
    • GPU 节点

    不希望普通业务乱跑 GPU 节点。

    所以:

    GPU 节点:

    kubectl taint node gpu-node gpu=true:NoSchedule
    
    1

    AI 业务 Pod:

    tolerations:
    
    1

    这样:

    • 普通 Pod 上不去
    • AI Pod 可以上去

    这是企业最常见用法。


    五、再理解 cordon(不可调度)

    cordon 和 taint 完全不是一类。


    cordon(封锁节点)

    作用:

    不允许新 Pod 调度进来

    但:

    已经运行的 Pod 不受影响

    命令:

    kubectl cordon node1
    
    1

    效果:

    状态 结果
    旧 Pod 继续运行
    新 Pod 不再调度

    六、drain 是什么(重点)

    很多人最混乱的地方。


    drain = cordon + 驱逐 Pod

    命令:

    kubectl drain node1 --ignore-daemonsets
    
    1

    它会:

    第一步

    先 cordon:

    不再接受新 Pod
    
    1

    第二步

    驱逐已有 Pod:

    请所有 Pod 离开这台机器
    
    1

    调度器会:

    把 Pod 调度到其它节点
    
    1

    七、真实运维场景

    比如:

    你要升级 node 节点内核

    你不可能:

    直接 reboot
    
    1

    否则:

    • 业务中断
    • Pod 强制消失
    • 用户访问异常

    正确流程:


    第一步

    kubectl drain node1 --ignore-daemonsets
    
    1

    Pod 自动迁移。


    第二步

    升级系统:

    reboot
    
    1

    第三步

    恢复调度:

    kubectl uncordon node1
    
    1

    节点重新接收 Pod。


    八、drain 和 delete pod 的区别

    很多面试会问。


    delete pod

    只是:

    删除 Pod
    
    1

    但:

    • 节点还能继续调度
    • Pod 可能又回到原节点

    drain

    是:

    整个节点进入维护模式
    
    1

    包括:

    • 禁止调度
    • 驱逐 Pod
    • 迁移业务

    这是运维动作。


    九、NoSchedule / PreferNoSchedule / NoExecute

    这是 taint 最容易混的。


    1. NoSchedule

    最常用。

    意思:

    不允许新 Pod 调度
    
    1

    但:

    已有 Pod 不受影响
    
    1

    2. PreferNoSchedule

    软限制:

    尽量别来
    
    1

    但不是强制。

    类似:

    最好别坐这里
    
    1

    3. NoExecute(重点)

    最狠。

    意思:

    不仅不让新 Pod 来
    还要把已有 Pod 赶走
    
    1
    2

    这就涉及:

    eviction(驱逐)


    十、eviction(驱逐)

    驱逐是:

    Kubernetes 主动把 Pod 从节点赶走

    比如:

    • 内存不足
    • 节点 NotReady
    • NoExecute
    • drain

    都会触发 eviction。


    十一、把这些概念串成一张图


    调度类

    概念 作用
    nodeSelector 指定去哪
    affinity 倾向去哪
    taint 不让谁来
    toleration 我允许来

    节点维护类

    概念 作用
    cordon 禁止新 Pod
    drain 清空节点
    uncordon 恢复调度

    驱逐类

    概念 作用
    eviction 驱逐 Pod
    NoExecute 强制驱逐
    OOMKill 内存不足杀 Pod

    十二、你应该这样记(非常重要)

    别背概念。

    你要记:

    Kubernetes 本质在解决:

    Pod 能不能来
    Pod 要不要走
    
    1
    2

    然后:

    问题 Kubernetes机制
    不让 Pod 来 taint / cordon
    允许特殊 Pod 来 toleration
    把 Pod 赶走 drain / eviction
    指定 Pod 去哪 affinity

    十三、面试级理解(你一定要会说)

    如果面试官问:

    “drain 和 taint 区别是什么?”

    你可以这样回答:

    taint 是节点调度限制机制,用于控制哪些 Pod 可以调度到节点。

    drain 是节点维护机制,会先 cordon 节点,再安全驱逐 Pod,实现业务迁移,常用于节点升级和维护。

    这就是高级运维回答。


    十四、最后给你一个真正的学习建议

    你现在不要:

    按名词学 Kubernetes
    
    1

    而要:

    按“生命周期”学

    例如:

    Pod 如何创建

    学习:

    • Deployment
    • ReplicaSet
    • Scheduler

    Pod 如何调度

    学习:

    • taint
    • toleration
    • affinity
    • selector

    Pod 如何下线

    学习:

    • drain
    • eviction
    • PDB
    • graceful shutdown

    这样你会突然全通。


    原文链接 (opens new window)

    微信 支付宝
    上次更新: 2026/05/20, 22:15:04

    ← helm release使用说明 kubectl使用技巧→

    最近更新
    01
    grafana高可用部署
    05-26
    02
    VictoriaLogs集群采集Kubernetes Pod日志
    05-24
    03
    kubernetes证书续签到100年
    05-04
    更多文章>
    Theme by Vdoing | Copyright © 2019-2026 | 点击查看十年之约 | 鄂ICP备2024072800号
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式