unbuntu离线部署K8S集群
环境准备和服务器规划部署前提已知条件:
环境准备与服务器规划总表
类别 |
配置项 |
详细信息 |
操作系统 |
版本 |
Ubuntu 25.04(所有节点) |
容器运行时 |
Docker 版本 |
Docker 24.0.6(所有节点) |
Kubernetes |
版本 |
Kubernetes 1.23(所有节点) |
服务器角色 |
节点名称与IP |
- Master: k8s-master1 (192.168.100.10) |
网络规划 |
Pod 子网 |
10.244.0.0/16 |
Service 子网 |
10.96.0.0/12 (默认) |
|
防火墙 |
需开放端口 |
- Master: 6443, 2379-2380, 10250-10255 |
系统配置 |
禁用 Swap |
所有节点需关闭 Swap 并永久禁用 |
主机名与 hosts 解析 |
所有节点需配置 /etc/hosts 包含各节点 IP 与主机名映射 |
|
离线仓库 |
本地 APT 仓库 |
所有节点通过 /opt/local-apt-repo 安装依赖包 |
私有镜像仓库地址 |
192.168.100.10:5000(运行在 Master 节点) |
服务器节点明细表
节点名称 |
角色 |
IP 地址 |
核心组件 |
k8s-master1 |
Master |
192.168.100.10 |
kube-apiserver, kube-controller-manager, kube-scheduler, etcd, Docker, kubeadm, kubelet, kubectl, 私有镜像仓库 |
k8s-node1 |
Worker |
192.168.100.11 |
Docker, kubeadm, kubelet |
k8s-node2 |
Worker |
192.168.100.12 |
Docker, kubeadm, kubelet |
依赖资源说明
- 外网机器
- 需临时连接外网以下载所有依赖包和镜像(仅需一台机器操作,后续离线使用)。
- 文件传输
- 离线包 offline-k8s.tar.gz 需通过 U盘/SCP 分发到所有节点。
- 系统一致性
- 所有节点需保持时间同步(建议安装 chrony 或 ntp)。
此表格可作为部署前的检查清单,确保所有环境和规划符合要求后再执行后续步骤。
以下是Ubuntu 25.04离线部署Kubernetes 1.23集群的详细步骤:
一、外网环境准备(需连接外网的机器k8s-master1)
1. 下载所有依赖包及镜像
bash
# 创建缓存目录
mkdir -p /opt/offline/{debs,docker,images,k8s}
cd /opt/offline
# 添加Kubernetes APT仓库(Ubuntu 25.04可能需要调整版本代号)
cat <<EOF > /etc/apt/sources.list.d/kubernetes.list
deb [arch=amd64] https://apt.kubernetes.io/ kubernetes-xenial main
EOF
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
# 更新并下载kubeadm/kubelet/kubectl 1.23.x
apt-get update
apt-get download kubeadm=1.23.* kubelet=1.23.* kubectl=1.23.*
# 递归下载依赖
apt-get install -y --download-only docker.io=24.0.6* kubeadm=1.23.*
cp /var/cache/apt/archives/*.deb ./debs/
# 下载Docker镜像
docker pull registry:2
docker save registry:2 -o ./images/registry.tar
# 下载Kubernetes镜像
kubeadm config images list --kubernetes-version 1.23.0 > ./k8s-images.txt
while read img; do
docker pull $img
docker save $img -o ./images/$(basename $img | sed 's/:/_/').tar
done < ./k8s-images.txt
2. 打包文件并传输到离线环境
bash
tar czvf offline-k8s.tar.gz /opt/offline
# 使用U盘或SCP将offline-k8s.tar.gz复制到各节点
二、离线环境配置(所有节点执行)
1. 解压离线包并创建本地APT仓库
bash
# 解压到各节点
tar xzvf offline-k8s.tar.gz -C /opt
# 创建本地APT源
apt-get install -y dpkg-dev
mkdir -p /opt/local-apt-repo
cp /opt/offline/debs/*.deb /opt/local-apt-repo/
cd /opt/local-apt-repo
dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz
# 配置APT源
cat <<EOF > /etc/apt/sources.list.d/local-apt.list
deb [trusted=yes] file:/opt/local-apt-repo ./
EOF
apt-get update
2. 安装Docker和Kubernetes工具
bash
# 安装Docker
apt-get install -y docker.io=24.0.6*
# 安装kubeadm/kubelet/kubectl
apt-get install -y kubeadm=1.23.* kubelet=1.23.* kubectl=1.23.*
# 启动服务
systemctl enable docker kubelet
systemctl start docker
3. 配置私有镜像仓库
bash
# 导入Registry镜像
docker load -i /opt/offline/images/registry.tar
docker run -d -p 5000:5000 --restart=always --name registry registry:2
# 配置Docker信任私有仓库
cat <<EOF > /etc/docker/daemon.json
{
"insecure-registries": ["192.168.100.10:5000"]
}
EOF
systemctl restart docker
# 导入Kubernetes镜像到仓库
for img in /opt/offline/images/k8s/*.tar; do
docker load -i $img
image_name=$(docker inspect --format='{{.RepoTags}}' $(tar xO $img manifest.json | jq -r '.[0].Config') | sed 's/[\[\]"]//g')
new_tag="192.168.100.10:5000/$(basename $image_name | sed 's|/|_|g')"
docker tag $image_name $new_tag
docker push $new_tag
done
三、Kubernetes集群初始化
1. Master节点配置
bash
# 生成kubeadm配置文件
cat <<EOF > kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1beta3
kind: InitConfiguration
nodeRegistration:
kubeletExtraArgs:
pod-infra-container-image: "192.168.100.10:5000/pause:3.6"
---
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
imageRepository: "192.168.100.10:5000"
kubernetesVersion: "1.23.0"
networking:
podSubnet: "10.244.0.0/16"
EOF
# 初始化Master
kubeadm init --config=kubeadm-config.yaml
# 配置kubectl
mkdir -p $HOME/.kube
cp /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
# 安装网络插件(Flannel)
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
2. Node节点加入集群
bash
# 在Master节点查看加入命令
kubeadm token create --print-join-command
# 在Node节点执行加入命令(示例)
kubeadm join 192.168.100.10:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>
四、验证集群状态
bash
# 在Master节点执行
kubectl get nodes
kubectl get pods -A
关键说明
- 网络规划:确保所有节点间网络互通,防火墙开放6443、2379-2380、10250-10255等端口。
- 镜像替换:所有Kubernetes组件镜像会自动从私有仓库192.168.100.10:5000拉取。
- 离线维护:后续新增镜像需在外网环境下载后,通过相同流程导入私有仓库。
- 系统配置:所有节点需关闭swap并设置正确的hosts解析:
bash
echo "192.168.100.10 k8s-master1
192.168.100.11 k8s-node1
192.168.100.12 k8s-node2" >> /etc/hosts
swapoff -a
sed -i '/ swap / s/^/#/' /etc/fstab
此方案通过本地APT仓库和私有镜像仓库实现完全离线部署,适用于严格的内网环境。