K8s 离线部署手册
k8s离线部署手册
本手册安装1.28.15版本 容器使用containerd启动,跳过docker的配置步骤,使用containerd直接启动容器,稳定性和速度提升巨大。
首先准备搭建k8s环境所需要的依赖,使用kubeadm进行k8s环境的安装(主要是进行master节点的初始化工作) 。
1.准备kubeadm、kubelet、kubectl这三个核心的命令行工具的二进制文件或者rpm包(centos7以及红帽系系统使用)
用户执行: kubectl create deployment nginx –image=nginx
↓
kubectl 发送请求到 API Server
↓
API Server 调度 Pod 到某个节点
↓
该节点的 kubelet(服务)接收指令
↓
kubelet 启动容器
↓
kubelet 报告状态给 API Server
↓
用户执行: kubectl get pods(查看结果)
在有网络的机器下 使用包管理器执行只下载rpm包的命令
配置阿里云镜像源后,不指定版本号默认下载的就是1.28.15版本
1 | yumdownloader kubelet-1.28.15-0 kubeadm-1.28.15-0 kubectl-1.28.15-0 --resolve --destdir . |
在命令执行目录下有了命令行工具本体以及所需的依赖,打包。
2.containerd也使用一致的方法镜像离线包的下载与打包
1 | yumdownloader containerd.io --resolve --destdir . |
3.准备控制平面组件的镜像 推送到内网的镜像仓库
在有网络的机器上,使用docker拉取并tag 推送镜像到10.2.12.4这个仓库
1 | docker pull kube-apiserver:v1.28.15 |
tag后推送到仓库即可。containerd同样支持从私有仓库拉取镜像
还需准备Flannel的另一个组件 说明一下容器中跑的组件与自己还需手动部署的组件的功能:
Flannel 包含两部分,运行方式不同:
Flannel 的两个组件
1. Flannel Daemon(flanneld)- 容器运行
运行方式:通过 Kubernetes DaemonSet 以容器运行
镜像:10.2.12.4/k8s-needs-images/flannel:v0.26.3(示例)
作用:管理网络配置、分配 Pod IP、维护路由规则
位置:每个节点一个 Pod(kube-flannel-ds-xxx)
2. Flannel CNI 插件 - 二进制文件
运行方式:二进制文件,安装在节点上
文件:flannel-amd64 → /opt/cni/bin/flannel (示例)
作用:CNI 接口实现,kubelet 调用它来配置 Pod 网络
位置:每个节点的 /opt/cni/bin/flannel
工作流程
kubelet 创建 Pod 时调用 CNI 插件
CNI 插件(/opt/cni/bin/flannel)被调用
CNI 插件与 Flannel daemon(容器)通信
Flannel daemon 分配 IP 并配置网络
二进制文件去github仓库中下载对应版本即可
除了flannel外 生产环境中一般使用calico来进行节点中的通信,这两个组件在通信的模式上有区别,calico通过将集群中的节点作为单个的路由 ,通过路由来转发数据包,比flannel少了封包解包的过程。
在离线机器上准备环境
关闭交换分区 避免pod被分配到存储中影响性能
1 | swapoff -a |
配置内核参数
1 | cat <<EOF | tee /etc/modules-load.d/k8s.conf |
- 三个参数的具体作用(核心网络配置):
net.bridge.bridge-nf-call-iptables = 1:启用 “桥接网络流量触发 iptables 规则”,让 Linux 的 iptables 防火墙规则能够作用于网桥设备(如 cni0)上的 IPv4 流量,k8s 的 kube-proxy(实现 Service 转发)、CNI 插件(如 Calico/Flannel)依赖该参数实现网络地址转换(NAT)、网络策略管控。net.bridge.bridge-nf-call-ip6tables = 1:与上述参数功能一致,针对 IPv6 流量生效,确保 k8s 集群支持 IPv6 网络时,桥接流量能被 ip6tables 规则管控,保障 IPv6 Pod 的通信正常。net.ipv4.ip_forward = 1:启用 Linux 内核的 IPv4 转发功能,允许节点将来自一个网络接口的 IP 流量转发到另一个网络接口,这是 k8s Pod 跨节点通信、Pod 访问外部网络的核心前提(比如节点上的 Pod 流量需要通过节点网卡转发到外部网络)。这些主要是为了flannel插件能够正常工作,保证节点之间的通信
安装containerd,进入包所在的目录中
1 | rpm -ivh *.rpm --nodeps --force #强制安装 |
如果依赖完整的话 后续编写为systemd服务后运行不会出错
安装控制行命令工具的包,进入所在目录
1 | rpm -ivh *.rpm --nodeps --force #强制安装 |
两个离线包的完整内容如下图:


执行安装完成后 ,对应的systemd服务文件会自动创建完成
之后开始拉取控制平面组件所需的镜像
首先须要配置containerd使用私有仓库
1 | mkdir -p /etc/containerd/certs.d/私有仓库地址加端口号 |
命令示例:拉取镜像验证
1 | ctr -n k8s.io images pull 10.2.12.4/k8s-needs-images/pause:3.9 |
1 | ctr -n k8s.io images #查看拉取的镜像 |
配置私有仓库后 后续执行滚动更新等功能时会用crictl来拉取镜像,如果遇到ctr本身的https的问题可以先放一边
拉取控制平面组件镜像完成后
使用kubeadm执行初始化命令
1 | kubeadm init --apiserver-advertise-address=${MASTER_IP} --image-repository=10.2.12.4/k8s-needs-images --kubernetes-version=v1.28.15 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16 --cri-socket=unix:///var/run/containerd/containerd.sock |
初始化完成之后,继续增加工作节点的操作.
