1. 为什么需要离线部署Kubernetes集群在企业生产环境中我们经常会遇到这样的场景服务器完全隔离在内部网络中无法直接访问互联网。这时候传统的在线安装方式就完全行不通了。我去年给一家金融机构做容器化改造时就遇到了这个难题——他们的服务器连外网DNS解析都没有开放。离线部署最大的优势就是安全性。所有组件和镜像都在内网流转避免了从公网下载可能带来的安全风险。同时一次性的离线包制作可以重复使用特别适合需要批量部署多套环境的场景。记得有次给客户部署测试、预发、生产三套环境用同一个离线包半小时就搞定了全部集群搭建。KubeSphere作为企业级Kubernetes管理平台提供了完整的离线部署方案。它通过KubeKey工具把Kubernetes核心组件、KubeSphere平台组件以及依赖的镜像全部打包成一个tar.gz文件还支持集成Harbor私有镜像仓库。这种一站式的解决方案让部署过程变得异常简单。2. 环境准备打造适合K8s的底层系统2.1 系统基础配置在开始之前我们需要确保所有节点都满足Kubernetes的基本要求。首先是关闭swap这个步骤很多新手容易忽略。Kubernetes设计之初就假设节点没有交换空间开启swap会导致kubelet运行异常。执行以下命令永久关闭swapoff -a sed -i / swap / s/^\(.*\)$/#\1/g /etc/fstab防火墙配置也需要特别注意。虽然可以保持防火墙开启并配置相应规则但对于新手我建议先关闭以简化排错systemctl stop firewalld systemctl disable firewalldSELinux最好设置为permissive模式避免权限问题setenforce 0 sed -i s/^SELINUXenforcing$/SELINUXpermissive/ /etc/selinux/config2.2 网络优化配置Kubernetes对网络有些特殊要求我们需要调整几个内核参数。创建一个专门的配置文件是个好习惯cat /etc/sysctl.d/k8s.conf EOF net.bridge.bridge-nf-call-ip6tables 1 net.bridge.bridge-nf-call-iptables 1 net.ipv4.ip_forward 1 EOF加载配置时有个小技巧先执行modprobe加载br_netfilter模块否则可能会报错modprobe br_netfilter sysctl -p /etc/sysctl.d/k8s.conf2.3 主机名与DNS解析在集群中清晰的主机名规划非常重要。建议采用角色序号的命名方式比如master-01、worker-01等。修改主机名后别忘了更新/etc/hosts文件# 主节点 10.55.68.101 master101 # 工作节点 10.55.68.104 node104 10.55.68.105 node105 # 镜像仓库节点 10.55.68.11 k8s-registry11特别提醒镜像仓库最好单独部署不要和Kubernetes节点混用。我遇到过因为docker版本冲突导致仓库服务不可用的情况排查起来相当麻烦。3. 构建离线安装包一次制作多次使用3.1 安装KubeKey工具KubeKey是KubeSphere团队开发的集群部署工具支持在线/离线两种方式。在能上网的机器上执行curl -sSL https://get-kk.kubesphere.io | sh -这个命令会下载最新版的KubeKey生成一个名为kk的可执行文件。我习惯把它放在/usr/local/bin下方便调用。3.2 创建Manifest文件Manifest文件定义了需要打包哪些组件。以下是一个v1.26.12的示例apiVersion: kubekey.kubesphere.io/v1alpha2 kind: Manifest metadata: name: sample spec: arches: - amd64 kubernetesDistributions: - type: kubernetes version: v1.26.12 components: helm: version: v3.14.3 cni: version: v1.2.0 etcd: version: v3.5.13 containerRuntimes: - type: docker version: 24.0.9 - type: containerd version: 1.7.13 harbor: version: v2.10.13.3 导出离线包有了manifest文件后打包就很简单了./kk artifact export -m manifest-sample.yaml -o kubesphere.tar.gz这个过程可能会花费较长时间因为要下载所有指定的组件和镜像。完成后你会得到一个kubesphere.tar.gz文件这就是我们的离线安装宝典。4. 离线环境部署实战4.1 传输文件到内网将以下文件通过U盘或内部文件服务器拷贝到离线环境的主节点kubesphere.tar.gzkk二进制文件ks-core的Helm chart可选4.2 配置Harbor私有仓库如果使用Harbor作为镜像仓库建议先初始化./kk init registry -f config-sample.yaml -a kubesphere.tar.gz然后创建必要的项目。这是我整理的一个项目列表脚本#!/bin/bash harbor_projects( kubesphereio calico coredns jenkins grafana ) for project in ${harbor_projects[]}; do curl -u admin:Harbor12345 -X POST -H Content-Type: application/json \ https://dockerhub.kubekey.local/api/v2.0/projects \ -d { \project_name\: \${project}\, \public\: true} -k done4.3 安装Kubernetes集群执行集群创建命令时有几个关键参数需要注意./kk create cluster -f config-sample.yaml \ -a kubesphere.tar.gz \ --with-local-storage \ --container-manager containerd这里我特别推荐使用containerd作为容器运行时特别是对于Kubernetes 1.24及以上版本。--with-local-storage会自动安装OpenEBS提供本地存储卷。4.4 安装KubeSphere控制台最后一步是安装KubeSphere的核心组件helm upgrade --install -n kubesphere-system --create-namespace ks-core ks-core-1.1.3.tgz \ --set global.imageRegistrydockerhub.kubekey.local/kubesphereio \ --set extension.imageRegistrydockerhub.kubekey.local/kubesphereio \ --wait安装完成后默认控制台访问地址是http://节点IP:30880初始账号admin密码P88w0rd。记得第一时间修改密码5. 常见问题排查指南5.1 镜像拉取失败这是离线环境最常见的问题。检查以下几点确认镜像是否已同步到Harbor检查pod的imagePullSecrets配置查看kubelet日志是否有认证错误5.2 节点NotReady状态通常由网络插件导致# 查看calico pod状态 kubectl get pods -n kube-system -l k8s-appcalico-node # 检查网络连接 kubectl run test-nginx --imagenginx --restartNever kubectl exec test-nginx -- curl 其他pod的IP5.3 KubeSphere组件异常可以尝试重新部署单个组件helm upgrade ks-core -n kubesphere-system --reuse-values或者查看具体pod日志kubectl logs -n kubesphere-system pod-name -c container-name记得在安装过程中保持耐心有些组件的启动可能需要几分钟时间。我在实际部署中发现合理调整资源请求/限制可以显著提高稳定性特别是在资源有限的测试环境中。
KubeSphere离线部署实战:从零构建企业级Kubernetes集群
1. 为什么需要离线部署Kubernetes集群在企业生产环境中我们经常会遇到这样的场景服务器完全隔离在内部网络中无法直接访问互联网。这时候传统的在线安装方式就完全行不通了。我去年给一家金融机构做容器化改造时就遇到了这个难题——他们的服务器连外网DNS解析都没有开放。离线部署最大的优势就是安全性。所有组件和镜像都在内网流转避免了从公网下载可能带来的安全风险。同时一次性的离线包制作可以重复使用特别适合需要批量部署多套环境的场景。记得有次给客户部署测试、预发、生产三套环境用同一个离线包半小时就搞定了全部集群搭建。KubeSphere作为企业级Kubernetes管理平台提供了完整的离线部署方案。它通过KubeKey工具把Kubernetes核心组件、KubeSphere平台组件以及依赖的镜像全部打包成一个tar.gz文件还支持集成Harbor私有镜像仓库。这种一站式的解决方案让部署过程变得异常简单。2. 环境准备打造适合K8s的底层系统2.1 系统基础配置在开始之前我们需要确保所有节点都满足Kubernetes的基本要求。首先是关闭swap这个步骤很多新手容易忽略。Kubernetes设计之初就假设节点没有交换空间开启swap会导致kubelet运行异常。执行以下命令永久关闭swapoff -a sed -i / swap / s/^\(.*\)$/#\1/g /etc/fstab防火墙配置也需要特别注意。虽然可以保持防火墙开启并配置相应规则但对于新手我建议先关闭以简化排错systemctl stop firewalld systemctl disable firewalldSELinux最好设置为permissive模式避免权限问题setenforce 0 sed -i s/^SELINUXenforcing$/SELINUXpermissive/ /etc/selinux/config2.2 网络优化配置Kubernetes对网络有些特殊要求我们需要调整几个内核参数。创建一个专门的配置文件是个好习惯cat /etc/sysctl.d/k8s.conf EOF net.bridge.bridge-nf-call-ip6tables 1 net.bridge.bridge-nf-call-iptables 1 net.ipv4.ip_forward 1 EOF加载配置时有个小技巧先执行modprobe加载br_netfilter模块否则可能会报错modprobe br_netfilter sysctl -p /etc/sysctl.d/k8s.conf2.3 主机名与DNS解析在集群中清晰的主机名规划非常重要。建议采用角色序号的命名方式比如master-01、worker-01等。修改主机名后别忘了更新/etc/hosts文件# 主节点 10.55.68.101 master101 # 工作节点 10.55.68.104 node104 10.55.68.105 node105 # 镜像仓库节点 10.55.68.11 k8s-registry11特别提醒镜像仓库最好单独部署不要和Kubernetes节点混用。我遇到过因为docker版本冲突导致仓库服务不可用的情况排查起来相当麻烦。3. 构建离线安装包一次制作多次使用3.1 安装KubeKey工具KubeKey是KubeSphere团队开发的集群部署工具支持在线/离线两种方式。在能上网的机器上执行curl -sSL https://get-kk.kubesphere.io | sh -这个命令会下载最新版的KubeKey生成一个名为kk的可执行文件。我习惯把它放在/usr/local/bin下方便调用。3.2 创建Manifest文件Manifest文件定义了需要打包哪些组件。以下是一个v1.26.12的示例apiVersion: kubekey.kubesphere.io/v1alpha2 kind: Manifest metadata: name: sample spec: arches: - amd64 kubernetesDistributions: - type: kubernetes version: v1.26.12 components: helm: version: v3.14.3 cni: version: v1.2.0 etcd: version: v3.5.13 containerRuntimes: - type: docker version: 24.0.9 - type: containerd version: 1.7.13 harbor: version: v2.10.13.3 导出离线包有了manifest文件后打包就很简单了./kk artifact export -m manifest-sample.yaml -o kubesphere.tar.gz这个过程可能会花费较长时间因为要下载所有指定的组件和镜像。完成后你会得到一个kubesphere.tar.gz文件这就是我们的离线安装宝典。4. 离线环境部署实战4.1 传输文件到内网将以下文件通过U盘或内部文件服务器拷贝到离线环境的主节点kubesphere.tar.gzkk二进制文件ks-core的Helm chart可选4.2 配置Harbor私有仓库如果使用Harbor作为镜像仓库建议先初始化./kk init registry -f config-sample.yaml -a kubesphere.tar.gz然后创建必要的项目。这是我整理的一个项目列表脚本#!/bin/bash harbor_projects( kubesphereio calico coredns jenkins grafana ) for project in ${harbor_projects[]}; do curl -u admin:Harbor12345 -X POST -H Content-Type: application/json \ https://dockerhub.kubekey.local/api/v2.0/projects \ -d { \project_name\: \${project}\, \public\: true} -k done4.3 安装Kubernetes集群执行集群创建命令时有几个关键参数需要注意./kk create cluster -f config-sample.yaml \ -a kubesphere.tar.gz \ --with-local-storage \ --container-manager containerd这里我特别推荐使用containerd作为容器运行时特别是对于Kubernetes 1.24及以上版本。--with-local-storage会自动安装OpenEBS提供本地存储卷。4.4 安装KubeSphere控制台最后一步是安装KubeSphere的核心组件helm upgrade --install -n kubesphere-system --create-namespace ks-core ks-core-1.1.3.tgz \ --set global.imageRegistrydockerhub.kubekey.local/kubesphereio \ --set extension.imageRegistrydockerhub.kubekey.local/kubesphereio \ --wait安装完成后默认控制台访问地址是http://节点IP:30880初始账号admin密码P88w0rd。记得第一时间修改密码5. 常见问题排查指南5.1 镜像拉取失败这是离线环境最常见的问题。检查以下几点确认镜像是否已同步到Harbor检查pod的imagePullSecrets配置查看kubelet日志是否有认证错误5.2 节点NotReady状态通常由网络插件导致# 查看calico pod状态 kubectl get pods -n kube-system -l k8s-appcalico-node # 检查网络连接 kubectl run test-nginx --imagenginx --restartNever kubectl exec test-nginx -- curl 其他pod的IP5.3 KubeSphere组件异常可以尝试重新部署单个组件helm upgrade ks-core -n kubesphere-system --reuse-values或者查看具体pod日志kubectl logs -n kubesphere-system pod-name -c container-name记得在安装过程中保持耐心有些组件的启动可能需要几分钟时间。我在实际部署中发现合理调整资源请求/限制可以显著提高稳定性特别是在资源有限的测试环境中。