k8s离线部署手册

本手册安装1.28.15版本 容器使用containerd启动,跳过docker的配置步骤,使用containerd直接启动容器,稳定性和速度提升巨大。

首先准备搭建k8s环境所需要的依赖,使用kubeadm进行k8s环境的安装(主要是进行master节点的初始化工作) 。

1.准备kubeadmkubeletkubectl这三个核心的命令行工具的二进制文件或者rpm包(centos7以及红帽系系统使用)4e50275dfd795240b8bee3a4fe3cde55

用户执行: 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
2
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
2
3
4
5
6
7
8
docker pull kube-apiserver:v1.28.15
docker pull kube-controller-manager:v1.28.15
docker pull kube-scheduler:v1.28.15
docker pull kube-proxy:v1.28.15
docker pull pause:3.9
docker pull etcd:3.5.15-0
docker pull coredns:v1.10.1
docker pull flannel:v0.26.3

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

工作流程

  1. kubelet 创建 Pod 时调用 CNI 插件

  2. CNI 插件(/opt/cni/bin/flannel)被调用

  3. CNI 插件与 Flannel daemon(容器)通信

  4. Flannel daemon 分配 IP 并配置网络

二进制文件去github仓库中下载对应版本即可

除了flannel外 生产环境中一般使用calico来进行节点中的通信,这两个组件在通信的模式上有区别,calico通过将集群中的节点作为单个的路由 ,通过路由来转发数据包,比flannel少了封包解包的过程。

在离线机器上准备环境

关闭交换分区 避免pod被分配到存储中影响性能

1
2
swapoff -a
sed -i '/ swap / s/^/#/' /etc/fstab

配置内核参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
cat <<EOF | tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
modprobe overlay
modprobe br_netfilter

cat <<EOF | tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF

sysctl --system
  • 三个参数的具体作用(核心网络配置):
    1. net.bridge.bridge-nf-call-iptables = 1:启用 “桥接网络流量触发 iptables 规则”,让 Linux 的 iptables 防火墙规则能够作用于网桥设备(如 cni0)上的 IPv4 流量,k8s 的 kube-proxy(实现 Service 转发)、CNI 插件(如 Calico/Flannel)依赖该参数实现网络地址转换(NAT)、网络策略管控。

    2. net.bridge.bridge-nf-call-ip6tables = 1:与上述参数功能一致,针对 IPv6 流量生效,确保 k8s 集群支持 IPv6 网络时,桥接流量能被 ip6tables 规则管控,保障 IPv6 Pod 的通信正常。

    3. 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 #强制安装

两个离线包的完整内容如下图:

6f76a8b3ead99d59521c71027a7bd433

6f76a8b3ead99d59521c71027a7bd433

执行安装完成后 ,对应的systemd服务文件会自动创建完成

之后开始拉取控制平面组件所需的镜像

首先须要配置containerd使用私有仓库

1
2
3
4
5
6
7
8
9
10
11
12
mkdir -p /etc/containerd/certs.d/私有仓库地址加端口号
tee /etc/containerd/certs.d/192.168.11.20:80/hosts.toml << 'EOF'
server = "http://192.168.11.20:80"

[host."http://192.168.11.20:80"]
capabilities = ["pull", "resolve", "push"]
skip_verify = true
EOF
# 继续创建配置文件

systemctl restart containerd.service

命令示例:拉取镜像验证

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

初始化完成之后,继续增加工作节点的操作.