ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

内网环境用Sealos 15分钟部署K8s私有云平台实操

内网环境用Sealos 15分钟部署K8s私有云平台实操 内网环境里自建一套K8s云平台过去是真要脱一层皮的。我最近刚完成一次基于 Sealos 的私有化部署把内网裸服务器变成带桌面门户、应用商店、数据库服务的云平台整个流程压到15分钟左右。这篇文章记录的就是这次实操从选型逻辑、环境准备、部署命令到踩过的坑尽量把可以直接抄的步骤写清楚。不管你是搞运维、做研发环境治理还是准备在企业内部落地私有云这篇文章的思路和命令都值得参考。1. 为什么选 Sealos 做内网私有化部署1.1 内网部署的四座大山私网环境部署K8s第一个拦路虎就是镜像拉取。集群运行要用的kube-apiserver、kube-controller-manager、etcd、coredns、calico这些容器镜像全都存在公共镜像仓库里内网机器往往没有稳定的网络访问通道。手动一台台灌镜像依赖关系又乱稍不留神就是ImagePullBackOff连续告警。第二个痛点是组件太多联动复杂。一套高可用K8s集群至少涉及负载均衡、etcd、containerd、CNI、CoreDNS、Dashboard再加上可选的监控、日志、Ingress、存储每个组件都要装要配。用裸kubeadm手工初始化光证书路径、kubeconfig分发、token续期就能耗掉大半天出错后人容易麻。第三个问题是应用层没人管。集群起来了团队要用数据库、缓存、对象存储又得自己配存储类、写Helm、手工维护PV/PVC内网环境缺这少那踩坑成本极高。第四个问题是隔离环境下的版本升级。内网不能随时在线拉新版本升级时要先规划镜像、导包、再做集群升级顺序不对容易回滚困难。这些痛点叠加在一起就导致很多团队宁可继续用最初的单机Docker方案也不愿意碰完整K8s平台。直到我把Sealos的离线包搬进内网跑通一轮才确实感觉到这条路是可以走通的。1.2 Sealos 是怎么把复杂度压下来的Sealos是一个面向云原生场景的开源平台它解决的不是单点组件而是从操作系统到云平台的全套交付。我第一次用Sealos时印象很深一条sealos run kubernetes:v1.30.0命令就能把高可用K8s集群建起来证书、kubeconfig、负载均衡、容器运行时全部自动化。对我这种希望减少重复劳动的人来说这种体验很友好。它把复杂度压下来的方式可以拆成几点封装了kubeadm、etcd、containerd等底层细节复用成熟组件但不让你直接面对它们。支持离线包与镜像打包内网环境可以先把完整资源包下载好再导入到目标集群。自带应用商店和桌面门户可以像手机装App一样部署Redis、MySQL、MinIO等中间件。所有组件都以容器方式运行在K8s上后续升级、回滚都走镜像版本控制不需要直接在宿主机上手工改配置文件。我在这轮内网部署中用到的核心链路是sealos run kubernetes建集群再运行sealos-cloud包拉起云平台门户最后通过内置应用商店部署业务中间件。这套链路对于大多数私有化内网场景来说很够用。1.3 哪些场景适合用 Sealos不是所有场景都适合Sealos但以下几类很合适企业内网开发测试环境需要快速给研发团队提供一套能自助申请Redis、MySQL、应用发布环境的云平台。IDC机房私有化交付客户环境无法访问公网镜像仓库需要一个能整体离线导入的K8s平台。中小规模生产集群节点规模在几十台以内追求开箱即用和统一门户不想花大量精力维护手工组件。边缘节点或分支机构CPU、内存受限需要轻量但又相对完整的云底座。如果你遇到的是几千节点的大规模超定制集群或者需要在裸金属上深度调优网络、存储那Sealos可能不够灵活更适合结合原生K8s组件二次开发。明确这个边界后面踩坑会少很多。2. 部署前的环境准备与设计2.1 服务器、系统与磁盘规划Sealos底层是K8s集群所以节点规划还是要按K8s的套路来。我推荐生产环境至少准备3台master和2台node管理面和数据面分开。如果只是内网测试可以先用单台All-in-One跑通流程但后续做高可用时还是要重新规划和初始化。硬件方面我的参考配置如下角色数量CPU内存系统盘数据盘Master38核16GB100GB SSD至少200GBNode216核32GB100GB SSD至少1TB测试单机14核8GB100GB200GB系统我推荐Rocky Linux 9.x或Ubuntu 22.04 LTS。CentOS 7虽然能跑K8s早期版本但很多内核模块和containerd兼容性处理起来麻烦内网环境本来就缺资料能省事就省事。磁盘分区上/var/lib/containerd和/var/lib/docker占空间最多如果数据盘独立挂载可以把这两个目录迁过去避免镜像一多系统盘爆掉。另外所有节点务必配置静态IP别用DHCP。K8s集群内部通信对IP稳定性要求很高DHCP地址一变apiserver证书里签发的IP和实际节点IP对不上那排查起来相当难受。2.2 网络规划、DNS与时间同步内网部署最容易被忽略的就是网络规划。我的建议是在部署前画一张简单的拓扑表记清楚节点IP、主机名、角色、VIP地址。Sealos如果要启用高可用通常需要一个VIP作为apiserver入口比如Keepalived或Sealos内置的VIP组件。这个VIP不能和现有网段冲突也建议使用固定保留地址。DNS方面所有节点都要在/etc/hosts里写全集群主机信息172.16.10.10 k8s-master01 172.16.10.11 k8s-master02 172.16.10.12 k8s-master03 172.16.10.13 k8s-node01 172.16.10.14 k8s-node02 172.16.10.20 k8s-vip别偷懒只写当前节点。etcd和kubelet经常按主机名互相访问hosts不全会造成节点之间握手中断。时间同步也特别关键K8s和etcd对时间偏差敏感偏差过大证书校验直接失败。内网环境大概率没有NTP互联网源要自己起一个内网NTP服务或者让所有节点指向一台能对时的内部服务器。我在部署前把所有节点统一配置到内网NTP地址然后确认timedatectl显示同步状态正常再开始后面的安装。2.3 内网离线安装包的获取与校验内网环境没办法在线拉镜像所以要在能联网的“下载环境”里先把Sealos完整资源包准备好再用移动介质或内网传输通道拷进目标服务器。我这次用到的核心资源包括sealos命令行二进制文件对应具体版本。kubernetes离线镜像包比如kubernetes:v1.30.0。sealos-cloud云平台镜像包比如sealos-cloud:v4.x.x。如果要用应用商店里的中间件可以单独准备对应镜像离线包。拿到包之后一定要校验SHA256。我在实操中遇到过拷贝过程损坏的情况刚开始没校验解压到一半报错还找不到原因。后来养成习惯下载完先算一次校验值传到内网再算一次一模一样再解压使用。sha256sum sealos-4.5.0-linux-amd64.tar.gz3. 15 分钟快速部署实操3.1 主机基础配置与内核调整正式开始前先把所有节点的基础环境统一。我在每台机器上都做了这几步关闭Swap、加载必要内核模块、设置转发参数。关闭Swapswapoff -a sed -i / swap / s/^/#/ /etc/fstab加载内核模块cat EOF | tee /etc/modules-load.d/k8s.conf overlay br_netfilter EOF modprobe overlay modprobe br_netfilter设置转发与iptables参数cat EOF | tee /etc/sysctl.d/k8s.conf net.ipv4.ip_forward 1 net.bridge.bridge-nf-call-iptables 1 net.bridge.bridge-nf-call-ip6tables 1 EOF sysctl --system这几步是K8s部署前的常规动作Sealos虽然封装了初始化逻辑但宿主机的基础内核参数还是提前准备好更稳妥否则跑到一半因为转发没开导致Pod之间不通排查起来很费时间。如果机器之间需要免密登录也可以用ssh-copy-id提前配置好后面Sealos访问所有节点时不用逐台输密码。3.2 用 Sealos CLI 创建 K8s 集群环境准备好后把sealos二进制放到/usr/local/bin并赋予执行权限tar -zxvf sealos-4.5.0-linux-amd64.tar.gz mv sealos /usr/local/bin/ chmod x /usr/local/bin/sealos sealos version执行创建集群命令。这里以3台master、2台node为例sealos run kubernetes:v1.30.0 \ --masters 172.16.10.10,172.16.10.11,172.16.10.12 \ --nodes 172.16.10.13,172.16.10.14 \ --vip 172.16.10.20 \ -p 你的root密码如果你用SSH私钥则把-p换成--pk /root/.ssh/id_rsa。这条命令执行后Sealos会依次完成SSH到所有节点、分发二进制、安装containerd、生成证书与kubeconfig、初始化高可用控制面、加入node节点。整个过程视网络和机器性能不同大概10分钟左右。执行完成后用自带kubectl检查节点状态export KUBECONFIG/root/.kube/config kubectl get nodes看到所有master和node都是Ready状态说明集群主体已经起来了。如果有些节点没Ready先看容器运行时是否启动再检查网络插件是否安装。sealos run kubernetes通常会带上默认CNI如果你的版本包没有需要单独运行网络插件包。3.3 接入内网云平台桌面集群就绪后接下来就是把Sealos云平台门户部署上去。这里我用的是sealos-cloud的离线包执行命令sealos run labring/sealos-cloud:v4.5.0这个会创建一批控制器和服务部署完成后通过kubectl查看入口服务kubectl get svc -A | grep -E ingress|desktop|cloud默认情况下一套桌面门户会暴露在某个NodePort端口比如30889。内网浏览器访问https://172.16.10.13:30889就能看到Sealos登录页。首次登录需要初始化一个管理员密码这就是私有云的管理员入口。需要注意浏览器访问时如果提示证书风险是因为默认使用自签证书。内网测试可以暂时放行生产环境建议在后面配置内部CA或受信任证书这个我在4.2节会详细说。3.4 部署结果验证云平台门户能登录后我习惯先做一轮基础验证确认集群不是“表面Ready”kubectl get pod -A重点观察kube-system、sealos命名空间里的Pod是否全部Running。如果存在CrashLoopBackOff优先看日志kubectl logs -n namespace pod-name --tail50然后在桌面门户里创建一个测试应用选择一个内置应用比如Nginx或Redis看能否正常发布和访问。这一步能同时验证调度器、CNI、存储类、应用商店是否都工作正常。我遇到过集群组件全Running但创建PVC时StorageClass没配导致应用一直Pending的情况所以在门户里跑一个需要存储的应用相当有必要。4. 内网云平台的扩展与日常维护4.1 应用商店部署中间件Sealos云平台内置了应用商店内网团队最常用的Redis、MySQL、MinIO、Nginx等都可以通过界面点选部署。这个体验非常像装手机App选择版本、配置资源、设置密码剩下交给平台。我在内网环境通过应用商店部署了一个Redis 7实例和一个MinIO对象存储。界面操作完成后会看到对应的Deployment和StatefulSet创建出来。如果应用状态迟迟不Ready第一反应是看存储。应用商店的中间件普遍依赖动态PVC。如果集群没配置默认StorageClassPVC会一直Pending。可以用如下命令查看kubectl get storageclass kubectl get pvc -A如果没看到StorageClass需要先部署一个内网可用的存储方案。Sealos环境里比较常用的是OpenEBS或NFS。我这边部署了OpenEBS作为本地动态存储配置好默认StorageClass后应用商店的中间件就能正常创建PVC。4.2 配置内网域名与 HTTPS 证书内网访问如果老用IP加端口体验不专业也不利于团队记住入口。我在部署完成后马上把Sealos门户配置成内网域名。做法是先在内网DNS里增加一条A记录把平台域名解析到Sealos的Ingress入口节点或VIP。然后在Sealos或者Ingress配置里设置host规则。把默认的https://集群IP:端口改成https://cloud.internal.example。这一步不同版本入口名称有区别但核心逻辑都一样指定hostname、关联到对应服务、启用TLS。证书方面如果是纯内网企业环境可以搭建内部CA也可以直接使用平台默认自动生成证书。我更推荐搭建内部CA这样各业务组申请证书都统一走一套流程。Sealos默认入口使用的是TLS证书如果域名变了旧证书会提示不匹配一定要重新签发或配置SAN包含新域名。自签证书可以用openssl快速生成但要注意有效期设置。我给内部CA配置了10年有效期给具体服务域名签发时设置了2年然后在平台中热更新证书。这样团队浏览器访问时把内部CA根证书加入信任链即可不会出现红色警告。4.3 常用备份、升级与回滚流程内网私有化部署最怕一升级就起不来。我的做法是把备份和升级作为固定流程。专门的备份主要包括两个层面etcd快照和平台配置。etcd是K8s集群状态的核心备份命令可以参考ETCDCTL_API3 etcdctl \ --endpointshttps://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 /var/backups/etcd-snapshot-$(date %Y%m%d).db直接在任意master节点执行都可以备份到本地。建议每天定时备份并同步到独立存储或另一台机器。同时Sealos平台自身的关键配置可以通过kubectl导出相关secret和configmap比如kubectl get secret -n sealos -o yaml sealos-secrets.yaml kubectl get configmap -n sealos -o yaml sealos-configmaps.yaml升级时我的步骤是先备份etcd再把新版本的镜像包导入内网然后执行Sealos升级命令。例如sealos upgrade --image labring/sealos-cloud:v4.6.0如果升级后发现异常首选回滚策略是恢复etcd快照再重新部署原版本镜像。按这个顺序操作我还没在内网升级时翻过车。5. 避坑记录与问题排查实录5.1 初始化失败swap 与内核参数第一次在内网环境跑Sealos时我遇到集群初始化到一半节点状态一直NotReady。排查到最后发现是我在一台新节点上忘了关闭Swap。K8s的kubelet默认要求Swap必须关闭否则会一直报错。所以我的建议是初始化前在所有节点上反复检查free -m cat /proc/sys/vm/swappiness如果swap还处于开启状态内核参数那个net.ipv4.ip_forward没设置也会导致网络通信异常两个问题经常一起出现。顺手把所有sysctl参数重新加载一遍再执行sealos reset重新初始化基本能解。5.2 镜像导入慢或磁盘空间不足内网导入镜像包的耗时经常被低估。我导入一套sealos-cloud包时发现数据盘空间只剩不到30GB最终导致镜像仓库写入失败。排查时看到containerd目录不断增长才意识到问题所在。建议部署前把数据盘空间余量留得充足特别是镜像包加应用商店的中间件整体占用很容易超过50GB。如果已经出现空间不足先清理磁盘比如未使用的镜像crictl rmi --prune再扩大 /var/lib/containerd 所在的磁盘容量并重启containerd。导入镜像用SSD盘会比机械盘快很多内网环境如果能用NVMe盘15分钟目标更容易达成。5.3 页面打不开或证书报错Sealos桌面门户部署完成浏览器却访问不了通常有几个原因防火墙没放行NodePort、Ingress服务没起来、域名解析错误。先确认端口在节点上能访问ss -tlnp | grep 30889如果在节点本机访问正常但局域网内其他机器打不开检查云平台入口所在节点的防火墙规则和安全组策略放行对应端口。证书报错则重点看Ingress使用的证书SAN里是否包含你访问的域名或IP内网IP变化也会导致这个问题。5.4 升级顺序颠倒导致 ImagePullBackOff我有一次在升级时先执行了sealos upgrade然后才导新镜像包结果新的Pod一直ImagePullBackOff。原因很简单集群已经开始滚动更新但容器运行时在本地仓库找不到新版本镜像。内网环境没有外部仓库兜底必须先import后upgrade。这类问题排查起来相对简单kubectl describe pod pod-name -n namespace确认Events里明确写着Failed to pull image那就把对应镜像重新导入再重启相关Deployment。升级顺序这种低级错误在在线环境不容易暴露但在内网离线环境里特别容易踩建议把“先导镜像、再升级”写进操作标准里。5.5 常见问题速查表现象可能原因解决方案参考章节节点NotReadySwap未关闭、内核参数缺失关闭Swap、加载模块和sysctl、sealos reset3.1Pod一直Pending没有StorageClass部署OpenEBS/NFS并设为默认4.1页面无法访问防火墙未放行、Ingress异常检查端口和入口服务状态5.3证书出现红色警告域名IP和证书SAN不匹配重新签发包含域名或IP的证书4.2升级后镜像拉取失败新镜像未提前导入先导入镜像后执行升级5.4etcd备份失败证书路径不正确确认/etc/kubernetes/pki/etcd下证书存在4.3集群时间不同步NTP未配置配置内网NTP并验证timedatectl2.2做完整套内网私有化部署我最大的体会是把准备工作做扎实比命令本身更重要。时间同步、hosts解析、离线包校验、磁盘预留这四关前面多花十分钟后面能省几小时。最后再分享一个小技巧部署前把节点主机名、IP、VIP、域名写在一个便签文件里放到所有节点的/root目录下排查问题时会少很多不必要的来回切换。
返回列表