利用 kubeadm 快速部署 kubernetes(k8s) 集群

news/2025/10/26 22:32:47/文章来源:https://www.cnblogs.com/twinblade-i/p/19167526
  • 环境:ubuntu22.04,kubeadm v1.28.15

节点准备工作(全部)

1. 关闭防火墙
# rootsystemctl stop firewalld
systemctl disable firewalldsystemctl stop ufw
systemctl disable ufw
2. 关闭安全模块 SELinux
# rootsed -i 's/enforcing/disabled/' /etc/selinux/config # 永久关闭
reboot
3. 关闭 swap 分区
# rootsed -ri 's/.*swap.*/#&/' /etc/fstab # 永久关闭
reboot
4. 配置主机名
# roothostnamectl set-hostname <HOSTNAME>
5. 配置集群节点网络地址
  • /etc/hosts 中添加各节点主机名和对应 IP 地址
...
192.168.1.60 node1
192.168.1.61 node2
...
6. 启用网桥过滤和地址转发功能
  • 创建 /etc/sysctl.d/k8s.conf 配置文件,内容如下:
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
  • 加载 br_netfilter 模块
# root# 临时加载 br_netfilter 内核模块
modprobe br_netfilter# 利用 /etc/modules-load.d 设置开机自动加载 br_netfilter
echo br_netfilter | sudo tee /etc/modules-load.d/br_netfilter.conf# k8s.conf 参数生效
sysctl --system
7. 节点时间同步
  • 利用 chrony 进行节点执行时间同步
# rootapt -y install chronysystemctl start chrony
systemctl enable chrony
8. 安装 containerd
  • 使用 containerd 的原因
    • kubernetes v1.24+ 弃用 dockershim/CRI-Docker,而是推荐直接使用 containerd 或 CRI-O
    • containerd 是 Docker 的底层容器组件,是通用容器,完整地实现了 kubernetes CRI
      • 默认 cri-socket 为 unix:///run/containerd/containerd.sock
  • 利用 apt 安装 containerd.io
    • kubernetes 推荐使用官方包 containerd.io,版本领先于 apt 仓库维护的 containerd
#rootapt update
apt install -y ca-certificates curl gnupg lsb-release# 添加 Docker 官方 GPG key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg# 添加 Docker 仓库
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/nullapt update
apt install -y containerd.io# 启用 containerd 服务
systemctl start containerd
# 允许 containerd 自启动
systemctl enable containerd
9. 配置 containerd
  • 利用 containerd 默认配置创建 /etc/containerd/config.toml配置文件
# root
containerd config default > /etc/containerd/config.toml
  • 改写相关配置
    • kubernetes 使用 containerd 时推荐使用 systemd cgroup 驱动
# 推荐启用 systemd cgroup
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]SystemdCgroup = true# 配置 k8s 代理
[plugins."io.containerd.grpc.v1.cri".registry.mirrors][plugins."io.containerd.grpc.v1.cri".registry.mirrors."registry.k8s.io"]endpoint = ["https://k8s.m.daocloud.io"] # 2025.10.16 当前可用

[!warning]

  • 如果存在 disabled_plugins = ["cri"] 选项禁用 CRI 插件,将其注释掉取消 CRI 禁用
  • 重启 containerd.service 以更改相关配置
# root
systemctl restart containerd
10. 安装 kubeadm、kubelet 和 kubectl
  • 利用 apt 安装 kubeadm、kubelet、kubectl
    • 以 v1.28.15 版本为例,其他版本需更改软件源
# root# 添加 GPG key
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg# 添加 kubernetes 仓库
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /' |  tee /etc/apt/sources.list.d/kubernetes.listapt update 
apt install -y kubelet kubeadm kubectl
  • 启用 kubectl
# root# 启用 kubelet 服务
systemctl start kubelet
# 允许 kubelet 自启动
systemctl enable kubelet

Master 节点部署

1. 初始化 Master 节点
# root
kubeadm init \--kubernetes-version $(kubeadm version -o short) \ # 匹配 kubeadm 版本--apiserver-advertise-address=192.168.1.60 \ # Master 节点的 IP 地址--service-cidr=10.96.0.0/12 \ # 集群内部 kubernetes service 虚拟 IP 地址范围,负载均衡相关--pod-network-cidr=10.244.0.0/16 \ # Pod 的 IP 地址范围,必须与后续 CNI 网络插件兼容(给出的 Flannel 默认)--cri-socket=unix:///run/containerd/containerd.sock \ # 要求 kubeadm 使用 containerd 提供的 CRI 启动集群--ignore-preflight-errors=all
2. Master 初始化结果处理
  • 初始化成功得到的输出案例如下,记录最后 kubeadm join ... 部分,用于后续其他节点加入集群
Your Kubernetes control-plane has initialized successfully!To start using your cluster, you need to run the following as a regular user:mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/configAlternatively, if you are the root user, you can run:export KUBECONFIG=/etc/kubernetes/admin.confYou should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:https://kubernetes.io/docs/concepts/cluster-administration/addons/Then you can join any number of worker nodes by running the following on each as root:kubeadm join 192.168.2.1:6443 --token ochspx.15in9qkiu5z8tx2y \--discovery-token-ca-cert-hash sha256:1f31202107af96a07df9fd78c3aa9bb44fd40076ac123e8ff28d6ab691a02a31
  • 手动配置以允许用户以 kubectl 命令访问集群
# user
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
3. 部署 CNI 网络插件
  • 部署 flannel 插件,其他可用的 CNI 网络插件包括 calico、canal 等
# root# 下载官方配置文件
wget https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml# 安装相关组件
kubectl apply -f kube-flannel.yml

其他节点部署

1. 节点预备条件
  • 待加入集群的节点要求已经执行完 [[#节点准备工作(全部)]] 部分的预备工作
2. 加入集群
  • 执行 Master 初始化完成后记录的 kubeadm join ... 命令
# root
kubeadm join 192.168.2.1:6443 --token ochspx.15in9qkiu5z8tx2y \--discovery-token-ca-cert-hash sha256:1f31202107af96a07df9fd78c3aa9bb44fd40076ac123e8ff28d6ab691a02a31

正确部署结果

  • 部署集群:1 master + 1 worker
  • 正确部署时 master 的状态截图
    Pasted image 20251026211857

部署过程中问题排查

  • 常用命令
    • 系统服务状态检查 sudo systemctl status
    • 系统服务日志实时跟踪 sudo journalctl -u <SERVICE_NAME> -f
    • kubernetes pods 状态检查 kubectl get pods -A
    • 读取 pod 日志 kubectl logs -n <NAMESPACE> <NAME>
    • 读取 daemonset 详情 kubectl describe daemonset -n <NAMESPACE> <DAEMONSET_NAME>

containerd 服务问题

  • sudo systemctl status containerd 检查 containerd 运行状态,正常为 active (running)
  • sudo crictl --runtime-endpoint unix:///run/containerd/containerd.sock info 测试端点是否可用,正常情况返回 containerd 的版本和状态信息
  • sudo crictl --runtime-endpoint unix:///run/containerd/containerd.sock pull registry.k8s.io/pause:3.8 预先拉取镜像检查是否存在源/镜像网络连接问题

kubeadm 初始化问题

  • sudo systemctl status kubelet 检查 kubelet 当前状态
  • sudo journalctl -u kubelet -f 检查 kubelet 实时日志
  • kubectl get pods -A 结合各 pods 的 STATUS 判断问题

CNI 部署问题

  • 常见存在问题情况:长时间部署过程,如 coredns-5dd5756b68-bccfr 0/1 ContainerCreating 0 23m
    • 检查 br_netfilter 模块状态、检查源/代理的网络连接问题

Notes

  1. kubeadm 初始化时可以在 /etc/containerd/config.toml 中配置代理,或在执行 kubeadm init 时利用 --image-repository 参数配置代理,原理如下:
    • kubeadm 在初始化集群时,在生成相关组件镜像名称时,将 --image-repositiry 指定的参数值作为前缀
      • 如默认 kubeadm 生成镜像名称 k8s.gcr.io/kube-apiserver:v1.28.15,此时如果指定 --image-repository registry.aliyuncs.com/google_containers,则最终该镜像的路径为 registry.aliyuncs.com/google_containers/kube-apiserver:v1.28.15
    • kubeadm 将生成的镜像路径通过 CRI (Container Runtime Interface) 交付 containerd,containerd利用自身配置的镜像源做代理或加速来获取该镜像
  2. 容器运行时接口(Container Runtime Interface, CRI):让 kubernetes 核心组件 kubelet 以统一方式与底层 containerd、CRI-O、docker 等容器进行通信
  3. 重置集群命令 kubeadm reset,根据执行结果提示做后处理
  4. 启用 IPVS(IP Virtual Server) (可选):负载均衡,大规模服务负载下降低延迟
    • 安装 ipset 和 ipvsadm
    • 执行kubeadm init时提供 --feature-gates=SupportIPVSProxyMode=true 参数
    • 启用时需确保 Linux 内核启用了 IPVS 功能同时相关模块已经加载
      • 检查是否支持 IPVS:lsmod | grep ip_vs
      • 相关模块:ip_vsip_vs_rrip_vs_wrrip_vs_shnf_conntrack_ipv4

参考

  1. 从零开始:Kubernetes 集群的搭建与配置指南,超详细,保姆级教程_kubernetes菜鸟教程-CSDN博客
  2. kubernetes(k8s)集群超级详细超全安装部署手册 - 知乎
  3. 在 Kubernetes 环境下部署 OpenWhisk 服务 - 知乎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/947110.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第七周物理实验:分光仪调节及三棱镜折射率测量

分光仪调节及三棱镜折射率测量 时间: 实验目的 掌握分光仪调节和使用 测量三棱镜顶角 测量最小偏向角&玻璃折射率 实验仪器 JJY型分光仪、双平面反射镜、玻璃三棱镜、汞灯 实验原理 分光仪主要组成部分:自由准直…

联发科技 Genio 物联网高效的平台,引领 IoT 智能新时代

联发科技 Genio 物联网高效的平台,引领 IoT 智能新时代pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&…

20232324 2025-2026-1 《网络与系统攻防技术》实验三实验报告

20232324 2025-2026-1 《网络与系统攻防技术》实验三实验报告1.实验内容 1.1实验目标理解恶意代码免杀原理,掌握 msf 编码器、Veil-Evasion 工具、C+Shellcode 编程等免杀技术,生成能规避杀毒软件的恶意程序,并通过…

密码学学习

对称加密: 加密和解密使用的是同一把钥匙 对称加密:分成流加密和块加密 流加密:例如123456,先加密1,再加密2 块加密:相当于分组加密 1234 5678 主要是DES和AES(高级加密)数字签名:用发送方的私钥对该哈希值加密,…

电脑文件系统整理概要

文件夹分类原则: 57原则:同层最多7个文件夹、最多5层 应用处理原则: 应用安装时按照优先安装D盘(如果磁盘未分区则忽略),无法设置时再安装C盘 应用以创建快捷方式后进行管理 应用应分为以下几类:常用,主选,备…

Boost.asio中的协程队列库

目录简介简单使用 简介 本文主要记录一下自己在使用Boost.asio时发现的一个协程队列库boost::asio::experimental::concurrent_channel。发现的路径也很搞笑,我当时需要一个队列库,因为使用的asio,所以想让AI帮忙使…

为自己读书

学习的目的不是为了获取更高的学位,也不仅仅是为了获取知识,而是为了能在生活中能够运用知识,方便生活。举个简单的例子,84消毒水不能和洁厕灵混在一起使用,容易产生氯气导致中毒。所以,学习不是为了他人,而是为…

代码大全阅读笔记

在软件开发的浩瀚书海中,有一部著作历经时间洗礼,依然被誉为“程序员必读经典”,这就是史蒂夫麦克康奈尔的《代码大全2》。它远非一本简单的代码语法手册,而是一部关于如何“构筑”高质量软件的工程思想大全。 初读…

第6天(简单题中等题 不定长滑动窗口)

打卡第六天 1道简单题+2道中等题计数还能如此计数,我还在if判断... if(nums[right] == 0){cnt0++;} //计0的个数-> cnt0 += 1 - nums[right]; // 维护窗口中的 0 的个数贴上题题目class Solution { public:int long…

博客园od

博客园odhttps://bbrownn.dpdns.org/ https://blog.csdn.net/jockerboss/article/details/153194489

详细介绍:深入理解 Scikit-learn:Python 中最常用的机器学习库

详细介绍:深入理解 Scikit-learn:Python 中最常用的机器学习库2025-10-26 22:06 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !imp…

[AI] Gemini-Cli 安装和使用教程

[AI] Gemini-Cli 安装和使用教程$(".postTitle2").removeClass("postTitle2").addClass("singleposttitle");Gemini生成(2025年10月26日20:58:40)gemini-cli 是一个命令行界面工具,它…

主动求索:大学生应掌控学习与时间

读完这几篇文章我深有感触,因为大学没有高中管得严,手机的自由度高了起来,像是要把以前的全补回来,基本整天都在和手机接触,在上课时即使手机没有任何消息,放在手边,也总想去打开看那么一眼再关上。当我开始管控…

2025.10.25 测试 广二 + 梦熊

2025.10.25 测试 广二 + 梦熊上午广二 1. P3293 [SCOI2016] 美味 考虑 + x 就是循环位移 然后直接二分每一位可不可以为 1 ,用主席树维护区间个数,用当前区间减去 x 得到真实区间 复杂度 \(O(n \log V \log n)\) 所以…

CSP-S模拟392025多校冲刺CSP模拟赛8

前言: 嘻嘻,虽迟但到(其实没啥意义)的改题 T1:最小生成树(tree) 据说养鸡大户蛙蛙说原始数据暴力可过请看显然不是我的码风的code #include<bits/stdc++.h>//骇死我力假了inf版线段树!!! using names…

关于莫队算法

莫队算法,优雅的暴力~ 先来一道例题 P3901 数列找不同引入:如何解决?\(O\)(\(n^2\)) 每次读入询问区间\(l至r\)暴力判定!如何优化? 已经知道区间l至r,可以\(O(1)\)扩展至区间l+1至r~询问无序,如何解决步子过大,…

Serilog 日志库的简介

本文主要介绍了 Serilog 的几个核心特点,并简单列了下适用场景,供参考。〇、前言 相较于 log4net,Serilog 则是新项目的首选,现代化、高性能、易用,是 .NET 日志的未来方向。如需了解 log4net 详见往期博文:http…

2025东莞环评公司/环评手续/环评报告/环评验收推荐:广东三洁环保,专业高效,合规保障

2025东莞环评公司/环评手续/环评报告/环评验收推荐:专业高效,合规保障 当前东莞环评领域的技术挑战与数据现状 随着东莞市制造业的持续发展和环保政策的日益严格,环评行业面临着前所未有的技术挑战。根据相关统计数…

word文档使用技巧----一键插入题注

这个学期某课程word文档报告需要图片有题注才给较高的分数,一张张图片打题注非常麻烦,网上搜到用脚本插入题注的方法,修改了一下,方便下次直接复制。 在word的开发工具选择Visual Basic-->插入-->模块-->…