1. 离线环境部署Kubernetes集群的核心挑战
在企业级IT基础设施中,离线环境部署Kubernetes集群是许多传统行业数字化转型过程中必须面对的硬骨头。与常规部署相比,这种特殊场景需要解决三大核心难题:
首先是镜像资源的获取与分发问题。在完全隔离的网络环境中,所有容器镜像、系统依赖包、二进制文件都需要预先下载并打包传输。以Kubernetes 1.28版本为例,仅核心组件就包含kube-apiserver、kube-controller-manager等20余个镜像,每个镜像又有不同架构的变体。更棘手的是,这些镜像之间存在严格的版本匹配要求。
其次是证书与认证体系的构建。离线环境下无法使用公共CA机构颁发的证书,需要自建完整的PKI体系。这包括:
- 集群根证书(CA)
- etcd节点通信证书
- API Server服务端证书
- 各组件客户端证书
- kubelet节点证书
最后是持续维护的复杂度。在没有互联网连接的情况下,后续的版本升级、安全补丁应用都需要通过人工介质传递,任何操作失误都可能导致集群不可用。根据实际运维经验,离线环境的问题排查时间通常是线上环境的3-5倍。
2. 离线部署方案设计与工具选型
2.1 主流离线部署方案对比
当前业界主要有三种主流离线部署方案,各有其适用场景:
| 方案类型 | 代表工具 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| 全手动部署 | kubeadm + 脚本 | 完全可控,资源占用最小 | 操作复杂,易出错 | 小规模集群,有严格审计要求 |
| 半自动化工具体系 | Kubespray | 支持多种CNI插件,文档完善 | 需要较多定制,对Ansible有要求 | 中等规模集群,需要灵活配置 |
| 全封装解决方案 | Rancher K3s | 单二进制部署,依赖极少 | 功能有一定裁剪 | 边缘计算场景,资源受限环境 |
2.2 关键组件离线包准备
无论选择哪种方案,都需要预先准备以下核心资源:
-
容器镜像仓库:
- 推荐使用Harbor搭建私有仓库
- 必须包含:
bash复制k8s.gcr.io/pause:3.6 k8s.gcr.io/kube-apiserver:v1.28.2 k8s.gcr.io/kube-controller-manager:v1.28.2 # 其他核心组件镜像... - 镜像同步技巧:
bash复制
docker pull k8s.gcr.io/kube-apiserver:v1.28.2 docker tag k8s.gcr.io/kube-apiserver:v1.28.2 myharbor.com/kube-apiserver:v1.28.2 docker push myharbor.com/kube-apiserver:v1.28.2
-
系统依赖包:
- 针对CentOS/RHEL系统需要准备的RPM包示例:
code复制conntrack-tools-1.4.4-7.el7.x86_64.rpm socat-1.7.3.2-2.el7.x86_64.rpm ebtables-2.0.10-16.el7.x86_64.rpm
- 针对CentOS/RHEL系统需要准备的RPM包示例:
-
Kubernetes二进制文件:
- 需要下载对应架构的:
- kubeadm
- kubelet
- kubectl
- cri-tools
- 需要下载对应架构的:
3. 分阶段实施指南
3.1 环境预配置阶段
-
节点基础检查:
bash复制# 检查swap是否关闭 swapoff -a sed -i '/ swap / s/^/#/' /etc/fstab # 检查防火墙规则 iptables -F iptables -t nat -F -
容器运行时配置:
- Containerd配置示例(/etc/containerd/config.toml):
toml复制[plugins."io.containerd.grpc.v1.cri".registry.mirrors] [plugins."io.containerd.grpc.v1.cri".registry.mirrors."myharbor.com"] endpoint = ["https://myharbor.com"]
- Containerd配置示例(/etc/containerd/config.toml):
3.2 证书体系构建
离线环境需要手动生成全套证书,关键步骤如下:
-
生成CA根证书:
bash复制openssl genrsa -out ca.key 2048 openssl req -x509 -new -nodes -key ca.key \ -subj "/CN=kubernetes-ca" -days 3650 -out ca.crt -
为API Server生成证书:
bash复制cat > apiserver-csr.json <<EOF { "CN": "kube-apiserver", "hosts": [ "10.96.0.1", "127.0.0.1", "kubernetes", "kubernetes.default", "kubernetes.default.svc" ], "key": { "algo": "rsa", "size": 2048 } } EOF
3.3 集群初始化实战
使用kubeadm的离线初始化命令示例:
bash复制kubeadm init \
--image-repository myharbor.com \
--apiserver-advertise-address=192.168.1.100 \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \
--upload-certs \
--cert-dir /etc/kubernetes/pki
关键参数说明:
--image-repository:指向私有镜像仓库--cert-dir:指定预生成的证书目录--upload-certs:将证书上传到集群以便后续节点加入
4. 运维陷阱与解决方案
4.1 常见故障排查表
| 故障现象 | 可能原因 | 解决方案 |
|---|---|---|
| kubelet持续CrashLoopBackOff | 证书过期或配置错误 | 检查/var/lib/kubelet/config.yaml |
| Pod网络不通 | CNI插件未正确安装 | 检查calico/node镜像版本匹配 |
| API Server无法启动 | etcd证书不匹配 | 验证/etc/kubernetes/manifests/etcd.yaml |
4.2 版本升级策略
离线环境升级需要特殊处理流程:
-
在新环境准备升级包:
bash复制
kubeadm upgrade plan --config=kubeadm-config.yaml -
分节点滚动升级步骤:
bash复制
kubectl drain <node> --ignore-daemonsets yum upgrade -y kubeadm-1.28.2 kubelet-1.28.2 kubectl-1.28.2 kubeadm upgrade node systemctl restart kubelet kubectl uncordon <node>
5. 性能优化专项
5.1 资源限制配置
在离线环境中资源更为宝贵,需要精细控制:
-
Kubelet配置示例(/var/lib/kubelet/config.yaml):
yaml复制systemReserved: cpu: "500m" memory: "512Mi" kubeReserved: cpu: "1000m" memory: "1Gi" -
Pod QoS策略:
yaml复制apiVersion: v1 kind: Pod metadata: name: nginx spec: containers: - name: nginx resources: limits: cpu: "2" memory: "2Gi" requests: cpu: "1" memory: "1Gi"
5.2 存储优化方案
针对离线环境推荐使用本地存储方案:
- Local PV配置示例:
yaml复制apiVersion: v1 kind: PersistentVolume metadata: name: local-pv spec: capacity: storage: 100Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: local-storage local: path: /mnt/disks/ssd1
6. 安全加固实践
6.1 关键安全配置
-
API Server安全参数:
yaml复制apiVersion: kubeadm.k8s.io/v1beta3 kind: ClusterConfiguration apiServer: extraArgs: anonymous-auth: "false" authorization-mode: "Node,RBAC" enable-admission-plugins: "NodeRestriction,PodSecurity" -
Pod安全策略示例:
yaml复制apiVersion: policy/v1beta1 kind: PodSecurityPolicy metadata: name: restricted spec: privileged: false allowPrivilegeEscalation: false requiredDropCapabilities: - ALL
6.2 审计日志配置
离线环境更需要完善的审计跟踪:
yaml复制apiVersion: audit.k8s.io/v1
kind: Policy
rules:
- level: Metadata
resources:
- group: ""
resources: ["secrets", "configmaps"]
7. 高可用方案实现
7.1 控制平面高可用
离线环境推荐使用堆叠式etcd方案:
-
初始化第一个控制节点:
bash复制kubeadm init --control-plane-endpoint "cluster-endpoint:6443" \ --upload-certs -
添加额外控制节点:
bash复制kubeadm join cluster-endpoint:6443 \ --token <token> \ --discovery-token-ca-cert-hash <hash> \ --control-plane \ --certificate-key <key>
7.2 负载均衡配置
使用Keepalived + HAProxy方案示例:
bash复制global_defs {
router_id LVS_DEVEL
}
vrrp_script chk_haproxy {
script "killall -0 haproxy"
interval 2
weight 2
}
8. 监控与日志方案
8.1 基础监控部署
推荐使用Prometheus Operator离线安装:
-
准备监控镜像:
bash复制
docker pull prom/prometheus:v2.37.0 docker pull grafana/grafana:9.1.5 -
自定义资源定义:
yaml复制apiVersion: monitoring.coreos.com/v1 kind: Prometheus metadata: name: k8s spec: serviceMonitorSelector: matchLabels: team: frontend
8.2 日志收集方案
使用Fluentd+Elasticsearch的离线部署技巧:
- 配置Fluentd收集容器日志:
xml复制<source> @type tail path /var/log/containers/*.log pos_file /var/log/fluentd-containers.log.pos tag raw.kubernetes.* </source>
9. 持续交付管道建设
9.1 离线CI/CD架构
推荐使用Argo CD的airgap部署模式:
-
准备应用仓库镜像:
bash复制
docker pull argoproj/argocd:v2.5.0 -
配置仓库访问:
yaml复制apiVersion: v1 kind: Secret metadata: name: private-repo namespace: argocd stringData: url: ssh://git@mygitserver.com/repo.git sshPrivateKey: | -----BEGIN RSA PRIVATE KEY----- ...
9.2 镜像更新策略
采用定时同步机制:
yaml复制apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: image-sync
spec:
schedule: "0 3 * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: sync
image: myharbor.com/sync-tool:v1
10. 灾备与恢复方案
10.1 集群状态备份
使用etcdctl进行定期备份:
bash复制ETCDCTL_API=3 etcdctl \
--endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
snapshot save snapshot.db
10.2 灾难恢复流程
-
恢复etcd数据:
bash复制
ETCDCTL_API=3 etcdctl snapshot restore snapshot.db \ --data-dir /var/lib/etcd-restore -
重建控制平面:
bash复制
kubeadm init --ignore-preflight-errors=DirAvailable--var-lib-etcd
