1. 为什么需要离线部署Kubernetes集群
在企业级生产环境中,我们经常会遇到一些特殊场景:比如金融行业的合规要求、军工单位的保密规定、实验室的封闭网络环境等。这些场景下,服务器往往被部署在完全隔离的内网中,无法直接访问互联网。这时候传统的在线安装Kubernetes的方式就行不通了。
我去年给某银行做私有云改造时就遇到过这种情况。他们的服务器机房连DNS解析都被禁用了,更别说访问k8s.gcr.io这种境外镜像仓库。当时我们花了整整两周时间才摸索出一套可靠的离线部署方案,期间踩过的坑现在想起来都头疼。
离线部署的核心挑战主要有三个:
- 依赖包管理:系统基础依赖、容器运行时、Kubernetes组件等都需要提前下载好
- 镜像分发:所有容器镜像要预先打包并导入到内网镜像仓库
- 配置复杂度:没有网络的情况下,所有配置都需要手动调整
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与系统配置
2.1 硬件规划建议
根据我的经验,生产环境的Kubernetes集群至少需要3个节点(1个master+2个worker)才能保证基本的高可用性。下面是一个典型的资源配置方案:
| 节点类型 | CPU | 内存 | 磁盘 | 数量 |
|---|---|---|---|---|
| Master | 4核 | 8GB | 100GB | 1-3 |
| Worker | 8核 | 16GB | 200GB | 2-N |
重要提示:所有节点必须保证时间同步!在内网环境中建议部署自己的NTP服务器,否则证书会出问题。
2.2 系统基础配置
这些配置在所有节点上都需要执行:
bash复制# 1. 关闭Swap
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab
# 2. 关闭SELinux
setenforce 0
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
# 3. 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
# 4. 加载内核模块
cat > /etc/modules-load.d/k8s.conf <<EOF
br_netfilter
EOF
# 5. 修改内核参数
cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
3. 离线安装Docker容器运行时
3.1 手动安装Docker
在内网环境中,我们需要先下载好Docker的二进制包。以20.10.9版本为例:
bash复制# 解压安装包
tar -xzf docker-20.10.9.tgz
cp docker/* /usr/bin/
# 创建systemd服务
cat > /etc/systemd/system/docker.service <<'EOF'
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
EOF
3.2 关键配置优化
为了让Docker更好地配合Kubernetes工作,需要调整几个关键参数:
json复制{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
},
"storage-driver": "overlay2"
}
配置完成后记得重启服务:
bash复制systemctl daemon-reload
systemctl enable docker
systemctl start docker
4. Kubernetes组件离线安装
4.1 准备离线安装包
我们需要提前下载好以下RPM包:
- kubeadm、kubelet、kubectl(版本要一致)
- kubernetes-cni
- cri-tools
- 系统依赖包(socat、conntrack等)
安装命令示例:
bash复制rpm -ivh kubelet-1.21.10-0.x86_64.rpm \
kubernetes-cni-0.8.7-0.x86_64.rpm \
kubectl-1.21.10-0.x86_64.rpm \
kubeadm-1.21.10-0.x86_64.rpm
4.2 镜像预处理技巧
Kubernetes需要的基础镜像包括:
- kube-apiserver
- kube-controller-manager
- kube-scheduler
- kube-proxy
- etcd
- coredns
- pause
我通常会在能上网的机器上先拉取镜像,然后导出:
bash复制docker save -o kube-apiserver.tar k8s.gcr.io/kube-apiserver:v1.21.10
在内网机器上导入:
bash复制docker load -i kube-apiserver.tar
5. 集群初始化与网络配置
5.1 使用kubeadm初始化
bash复制kubeadm init \
--apiserver-advertise-address=192.168.100.100 \
--kubernetes-version v1.21.10 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
初始化完成后会输出join命令,一定要保存好!
5.2 安装Flannel网络插件
先下载flannel的yaml文件:
bash复制wget https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
然后修改其中的net-conf.json部分,确保网段与初始化时一致:
yaml复制net-conf.json: |
{
"Network": "10.244.0.0/16",
"Backend": {
"Type": "vxlan"
}
}
最后应用配置:
bash复制kubectl apply -f kube-flannel.yml
6. 节点加入与验证
6.1 worker节点加入集群
在worker节点上执行master初始化时输出的join命令:
bash复制kubeadm join 192.168.100.100:6443 \
--token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:xxxxxx
6.2 常见问题排查
如果节点加入后状态为NotReady,可以检查:
- 网络插件是否安装成功
- 节点间网络是否互通
- 防火墙规则是否放行
- 系统时间是否同步
查看节点状态:
bash复制kubectl get nodes -o wide
7. 部署Dashboard可视化界面
7.1 离线安装Dashboard
先下载dashboard的yaml文件:
bash复制wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.6.0/aio/deploy/recommended.yaml
修改Service类型为NodePort:
yaml复制spec:
ports:
- port: 443
targetPort: 8443
selector:
k8s-app: kubernetes-dashboard
type: NodePort
7.2 访问控制配置
创建管理员账号:
yaml复制apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
绑定集群管理员角色:
yaml复制apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
获取访问令牌:
bash复制kubectl -n kubernetes-dashboard create token admin-user
8. 生产环境优化建议
在实际项目中,我总结了几个提升离线集群稳定性的技巧:
- 镜像仓库:在内网搭建Harbor私有仓库,避免每次都手动load镜像
- 包管理:使用Ansible批量安装依赖包,减少人工操作
- 监控告警:提前部署Prometheus+Alertmanager监控体系
- 备份恢复:定期备份etcd数据,测试恢复流程
- 文档记录:详细记录每个组件的版本和配置变更
离线环境最大的挑战其实是后续的升级维护。建议在测试环境充分验证后,再在生产环境实施变更。每次升级前,都要确保所有依赖包和镜像的新版本都已准备就绪。
