资讯详情

Kubernetes-单节点部署k8s环境

📅 2026/10/24 1:59:02 | 华诺云谱 👁 阅读
Kubernetes-单节点部署k8s环境
背景描述作为学习环境和非生产环境搭建k8s集群的时候可以不考虑高可用性。特别是工作中有时要求搭建一个k8s环境仅仅是为了完成一些训练任务。提供的资源是一台或者两台昇腾服务器。服务器上CPU和内存资源都很大而且还带有NPU卡。如果搭建k8s集群的时候其中一台服务器单纯作为master节点的话造成很大的资源浪费。因此就可以考虑单个服务器搭建一个k8s环境。实现方式方式1、初始化时添加--control-plane参数在k8s中有两种类型的节点一类是Control Plane Nodemaster节点用于部署k8s的重要组件默认是不支持运行用户pod的。另一类是Worker Nodeworker用于运行用户pod。默认情况下master节点为啥不能运行用户pod呢核心的原因是Taint污点机制当你执行kubeadm init不带--control-plane时kubeadm init --pod-network-cidr10.244.0.0/16Kubernetes 自动给 Master 节点添加了Taint污点节点污点 ├── key: node-role.kubernetes.io/master │ ├── effect: NoSchedule # 不允许调度新的Pod │ └── effect: NoExecute # 驱逐不兼容的PodTaint 的作用原理# 当调度器尝试将Pod调度到节点时会检查 # 1. Pod是否有对应的Toleration # 2. 如果没有调度器就会拒绝调度 # Master节点默认的Taint node-role.kubernetes.io/master:NoSchedule │ │ ┌──────────────────────────────┐ │ │ 调度器决策过程 │ ├───►│ │ │ │ 1. Pod要调度到Master │ │ │ 2. 检查Taint: NoSchedule │ │ │ 3. Pod没有Toleration │ │ │ 4. ❌ 拒绝调度 │ │ └──────────────────────────────┘ │ └───► 原因保护Master节点资源 确保控制平面组件稳定运行--control-plane 参数做了什么# 不带 --control-plane 的结果 kubeadm init --pod-network-cidr10.244.0.0/16 # 执行后 ┌────────────────────────────────────────┐ │ Master 节点 │ ├────────────────────────────────────────┤ │ 污点: node-role.kubernetes.io/master │ │ ├── NoSchedule ✓ │ │ └── NoExecute ✓ │ │ │ │ 标签: node-role.kubernetes.io/master │ │ │ │ 角色: control-plane │ └────────────────────────────────────────┘# 带 --control-plane 的结果 kubeadm init --control-plane --pod-network-cidr10.244.0.0/16 # 执行后 ┌────────────────────────────────────────┐ │ Master 节点 │ ├────────────────────────────────────────┤ │ 污点: 无 或仅保留 NoExecute │ │ │ │ 标签: node-role.kubernetes.io/master │ │ node-role.kubernetes.io/control-plane │ │ │ 角色: control-plane worker │ └────────────────────────────────────────┘方式2、去除污点首先理解 Kubernetes 的 Taint污点机制Effect含义NoSchedule新的不支持该污点的 Pod 不会被调度到该节点NoExecute现有的不支持该污点的 Pod 会被驱逐驱逐到其他节点两种方式的区别如下1、移除所有污点配置# 移除所有节点的污点配置 kubectl taint nodes --all node-role.kubernetes.io/master- # 这个方式执行后返回中会有error。原因是因为会遍历删除所有的节点包括工作节点。 # 一般情况下工作节点上没有污点配置所以移除报错了。 # 推荐使用下面的方式 # 只对 master 节点移除污点配置 kubectl taint nodes k8s-master01 node-role.kubernetes.io/master-特性说明作用范围集群中所有节点移除内容同时移除NoSchedule和NoExecute效果✅ 完全解除限制所有 Pod 都可以调度到 Masterbr✅ 现有 Pod 不会被驱逐节点污点状态 ┌─────────────────────────────────────┐ │ NoSchedule ──► ✅ 已移除 │ │ NoExecute ──► ✅ 已移除 │ │ 允许调度 ──► ✅ 允许 │ └─────────────────────────────────────┘2、仅移除 NoSchedule 污点kubectl taint nodes master-node-name node-role.kubernetes.io/master:NoSchedule-特性说明作用范围指定节点需要知道节点名移除内容仅移除No保留ScheduleNoExecute效果✅ 新的 Pod 可以调度到 Masterbr⚠️ 现有 Pod仍可能被驱逐节点污点状态 ┌─────────────────────────────────────┐ │ NoSchedule ──► ✅ 已移除 │ │ NoExecute ──► ⚠️ 仍然存在 │ │ 允许调度 ──► ✅ 允许 │ └─────────────────────────────────────┘所以个人觉得还是使用--all参数去除所有污点机制毕竟也只是一个学习环境或者测试环境。FAQ1、如何查看污点配置信息# 查看节点污点 kubectl get nodes -o jsonpath{range .items[*]}{.metadata.name}{\n}{range .spec.taints[*]}{\t}{.key}:{.effect}{\n}{end}{end} # 回显信息如下 k8s-master01 node-role.kubernetes.io/master:NoSchedule k8s-worker01 # 或 kubectl describe nodes node-name | grep -A 10 Taints # 回显信息如下 [rootk8s-master01 ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master01 Ready control-plane,master 5d21h v1.22.12 k8s-worker01 Ready none 5d20h v1.22.12 [rootk8s-master01 ~]# kubectl describe node k8s-master01 | grep -A 10 Taints Taints: node-role.kubernetes.io/master:NoSchedule Unschedulable: false Lease: HolderIdentity: k8s-master01 AcquireTime: unset RenewTime: Thu, 04 Jun 2026 11:39:07 0800 Conditions: Type Status LastHeartbeatTime LastTransitionTime Reason Message ---- ------ ----------------- ------------------ ------ ------- NetworkUnavailable False Wed, 03 Jun 2026 19:14:45 0800 Wed, 03 Jun 2026 19:14:45 0800 CalicoIsUp Calico is running on this node MemoryPressure False Thu, 04 Jun 2026 11:37:36 0800 Fri, 29 May 2026 14:21:47 0800 KubeletHasSufficientMemory kubelet has sufficient memory available [rootk8s-master01 ~]#
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑