资讯详情

资讯详情

国产化K8s运维实战:银河麒麟V10上部署Kuboard可视化平台

1. 内容整体设计与思路拆解1.1 国产化环境下K8s运维到底难在哪先别急着聊部署我想先还原一下真实场景。最近公司在做信创适配机房那边清一色的银河麒麟V10x86架构的还好说arm架构的机器也混了几台。业务那边新老项目都要容器化K8s集群倒是用kubeadm搭起来了但是日常运维成了问题——开发看pod状态要看半天命令行测试要查日志得先学一遍kubectl领导想看资源占用率还得我远程截图发过去。说白了K8s本身不复杂复杂的是让团队里每个人都愿意用、用得明白。命令行工具的天然门槛摆在那里不是每个人都有动力去背那几十个常用命令的。为什么标题里会写“太难管”我在国产系统上实测的体感是三个字不够顺。官方文档大多以Ubuntu、CentOS为示例环境银河麒麟V10虽然底层兼容CentOS生态但软件源的包版本、内核参数、默认防火墙策略都有差异。最典型的是有些依赖包在麒麟的默认源里版本偏旧直接照搬文档命令大概率遇到版本不兼容。另外国产化环境通常处于内网外网的helm仓库、镜像仓库经常访问不通需要提前规划离线方案。再加上很多国产化平台对容器运行时还有自己的合规要求不能随便装个Docker就当完事了。这些因素叠加起来K8s集群的日常运维比在公有云标准环境里吃力不少。所以当我决定把集群管理“可视化”这条路走通之后第一个想法就是找一款足够轻、足够贴近K8s原生生态、最好还是中文界面且能在离线环境跑起来的工具。试来试去最终锁定了Kuboard。这篇文章不是我写的官方教程搬运而是我踩完坑之后整理出的一套30分钟可复现的部署流程包括为什么这么配、参数怎么选、出了事怎么查。如果你手头正好是银河麒麟或者其他国产Linux发行版这套流程大概率能直接照搬。1.2 为什么最终选择Kuboard而不是其他方案我在选型的时候其实比较过几条路线。第一条是装原生的Kubernetes Dashboard但它的权限模型设计得比较粗糙想做到多租户隔离基本得自己二次开发而且它的界面风格偏极客向业务团队的人看了仍然一头雾水。第二条是用Rancher功能确实全面但Rancher本身对资源占用不小控制面还需要额外的数据库支撑。在国产化环境里我见过好几台低配机器被Rancher拖到下不去手的案例要是集群节点本来就只有4C8G真不建议往里面再塞一个重型管理平台。第三条是用KubeSphere功能很强大但它带来的组件太多默认集成的模块对网络和存储的要求比较高在精简环境里反倒成了负担。Kuboard的优势恰好就在这几条路线的痛点处。首先它部署极简就是一组容器加一个Agent代理不需要额外的数据库、不需要单独的认证服务资源占用控制在几百兆以内。其次它的界面是纯中文而且信息密度设计得很合理我拿给一个只会用docker run的同事看他大概十分钟就能找到自己业务的所有工作负载状态。再者它直接复用K8s原生的ServiceAccount和RBAC体系不需要在集群里引入额外的用户系统安全模型不会因为多了一层管理工具而被削弱。最后也是最重要的一点Kuboard在离线/内网场景下非常友好镜像可以提前准备好整个部署过程不依赖任何外网资源。还有一点要专门提一下Kuboard不接管集群的控制面。它只是通过kubeconfig或者Agent跟API Server通信你本身用的kubectl、helm、其他运维脚本都可以继续正常工作。这一点和其他“全家桶”式的平台有本质区别——它更像一个观察和操作的入口而不是一个绑架运维流程的集权者。1.3 部署前后需要想清楚的规划在动手之前有几个前置的规划问题必须先想明白否则后面一定会返工。第一K8s集群本身的版本选型。目前Kuboard对K8s各版本的兼容跨度比较大但我不建议为了追求新版而盲目升级集群。国产化环境里的很多镜像、网络插件、存储插件都还没有跟上K8s的最新版本节奏所以我建议优先选择社区验证比较充分的中级版本比如1.24到1.28之间。我这次用的集群是1.24版本原因就是这个版本在银河麒麟V10上的兼容性实测最好containerd运行时也没有遇到什么幺蛾子。第二网络与存储方案。国产化环境最常见的是内网部署所以容器网络插件CNI尽量选择不依赖外部服务的方案。我在多个项目里用过Flannel的VXLAN模式麒麟的内核配置默认支持不需要额外编译模块。存储方面如果内网已经有NFS、Ceph或者商业存储建议提前准备好StorageClass如果暂时没有可以先不装存储插件Kuboard本身只是展示和操作层不会因为没有StorageClass就崩溃。第三访问入口。Kuboard本身通过web页面访问那内网用户怎么访问、是否做HTTPS、是否需要SSO统一登录这些问题最好在部署前定下来。我的建议是先做HTTP加内网域名访问把端口映射做到一台固定的跳板机上后续有条件再挂证书和统一认证。别一开始就纠结高可用、多副本、外部认证那些事先把“能用起来”跑通再谈优化。2. 核心细节解析与实操要点2.1 银河麒麟V10的系统准备细节银河麒麟V10有几种版本常见的是桌面版和服务器版我这次用的是服务器版。拿到机器之后有几个细节很多人会忽略但它们直接影响K8s集群能不能稳定运行。主机名K8s集群节点的主机名不能重复不能包含下划线而且最好不要包含大写字母。很多第一次搭集群的人会在主机名上翻车kubeadm初始化时就报错。建议提前规划好三台机器的主机名k8s-master01、k8s-node01、k8s-node02。hosts解析每台节点都要把集群所有机器的IP和主机名写进/etc/hosts否则节点之间通信会经常超时kubelet注册节点时也会失败。时区统一银河麒麟默认时区可能是CST但有的机器会变成UTC容器日志时间对不上的时候排查起来极其痛苦。建议在部署前统一执行timedatectl set-timezone Asia/Shanghai。内核参数K8s要求关闭swap并且要加载br_netfilter模块、设置iptables相关参数。这些在部署文档里都有但麒麟系统默认可能没有加载这些模块需要手动确认一下。防火墙银河麒麟自带的防火墙是firewalld很多K8s端口需要放行或者干脆在交付初期把防火墙停掉只靠安全组把端口限制在可信网段。对于内网环境来说简单直接更省心。2.2 容器运行时与镜像源的选择逻辑K8s从1.24版本开始已经彻底移除对Docker的依赖直接使用CRI。我这里选择的是containerd版本是1.6.x和K8s 1.24官方支持列表完全兼容。为什么不用Docker除了免去dockershim适配的麻烦之外还有一个原因在国产化内网环境containerd的配置管理比Docker更直接尤其是镜像加速和私有仓库配置改一个config.toml就行不需要额外管理daemon.json。镜像源的选择是整个部署里最关键的一个坑。集群要拉取kube-apiserver、kube-controller-manager、kube-proxy这一系列官方镜像但默认源或者某些公共源在国内网络环境下经常超时。我的做法是提前准备一个内网私有仓库比如用Harbor或者简单点的Registry在能访问外部网络的机器上把镜像拉下来打好tag推到内网仓库里然后每台节点都配置好containerd指向内网仓库。这样等真正部署的时候就完全不受外网波动影响这也是能在30分钟内跑完整个流程的核心原因之一。2.3 Kuboard部署模型的核心要点Kuboard v3的部署模型值得拆开讲一下。它由两个关键部分组成Kuboard本身的服务端容器以及需要部署在目标K8s集群中的Agent。服务端容器本身不必须运行在K8s集群里可以单独跑在一台任意装有Docker的机器上这对我来说反而方便——我可以把Kuboard服务端装在一台独立的运维机器上然后让它连接多个K8s集群。Agent则由Kuboard通过kubeconfig对集群完成初始化后自动注入到集群中负责建立从Kuboard到集群API Server的通信隧道。这种模型解决了两个问题。一来是权限收敛Kuboard服务端本身不需要直接持有了不起的大权限所有对集群的敏感操作都是通过在集群里创建专门的ServiceAccount来完成二来是网络穿透当Kuboard和K8s集群不在同一个网络环境时只需要集群节点能主动访问到Kuboard的Agent端口即可不需要在防火墙上开一大堆入方向规则。还有一点值得注意Kuboard服务端的数据默认存放在容器的持久化目录里所有用户导入的kubeconfig、集群配置都保存在这里。如果将来要迁移直接把整个数据目录打包带走就行。这一点比那些依赖数据库的管理平台简单太多。3. 实操过程与核心环节实现3.1 快速准备三节点集群的完整流程先说结论我用这套流程在麒麟系统上从零到集群就绪只花了不到15分钟。下面把关键步骤展开写。节点规划节点角色主机名配置系统版本Masterk8s-master014C8G银河麒麟V10 SP1Worker1k8s-node014C16G银河麒麟V10 SP1Worker2k8s-node024C16G银河麒麟V10 SP1软件版本K8s1.24.9Containerd1.6.21Kuboardv3.5.xCNIFlannel VXLAN在每台机器上执行基础初始化脚本# 关闭swap swapoff -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 # 设置内核参数 cat EOF | tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-iptables 1 net.bridge.bridge-nf-call-ip6tables 1 net.ipv4.ip_forward 1 EOF sysctl --system然后配置containerd。这里有一个很大的坑默认安装完的containerd配置文件里的pause镜像地址是registry.k8s.io/pause:3.6但国内环境根本拉不动要手动把它改成内网或者可访问仓库的地址。如果不改最典型的现象就是pod一直处于ContainerCreating状态describe看事件会发现一直报“Failed to pull image ...”。# 生成默认配置并修改 mkdir -p /etc/containerd containerd config default | tee /etc/containerd/config.toml # 找到并替换sandbox_image sed -i s#sandbox_image registry.k8s.io/pause:3.6#sandbox_image 内网仓库地址/pause:3.6#g /etc/containerd/config.toml # 配置镜像加速如适用 # [plugins.io.containerd.grpc.v1.cri.registry] # [plugins.io.containerd.grpc.v1.cri.registry.mirrors] # [plugins.io.containerd.grpc.v1.cri.registry.mirrors.docker.io] # endpoint [内网仓库地址] systemctl restart containerd systemctl enable containerd接下来用kubeadm初始化Master节点。我采用的初始化参数是这样的kubeadm init \ --image-repository内网仓库地址/k8s \ --kubernetes-versionv1.24.9 \ --apiserver-advertise-address192.168.x.x \ --pod-network-cidr10.244.0.0/16 \ --service-cidr10.96.0.0/12这里有一个不容忽视的点--image-repository指向内网仓库。kubeadm会从这个地址拼接出所有需要拉取的镜像列表例如包名为kube-apiserver、kube-scheduler等。如果仓库路径组织是一致的这一步就能彻底摆脱外网限制。--pod-network-cidr这里我习惯留成Flannel默认的10.244.0.0网段后面装Flannel就不用改配置。初始化完成后按照输出提示把kubeconfig复制到工作目录然后在Master上安装Flannel。这里我用的是一个简单的方式先通过内网仓库拉到flannel镜像的tar包然后导入到containerd里再使用离线manifest文件通过kubectl apply安装。注意不要直接使用外网直链因为在内网环境大概率失败。3.2 让Kuboard服务端在镜像受限环境中跑起来Kuboard v3的部署方式在它的官方文档里写得很简单装Docker和docker-compose然后写一个compose文件跑起来就行。但在国产化环境里Docker的安装反而成了第一道坎因为麒麟系统默认源的Docker版本非常老好几个核心参数都不支持。我的经验是不要用默认源装Docker直接从Docker官方提供的静态二进制包安装或者如果有软包仓库的话手动下载社区版rpm包再本地安装这样才能确保版本足够新支持Kuboard v3所需要的所有Docker特性。装好Docker之后写docker-compose.yml。这个文件是Kuboard部署的核心关键参数如下version: 3.8 services: kuboard: image: 内网仓库地址/kuboard:v3.5.x restart: unless-stopped ports: - 80:80/tcp - 10080:10080/tcp environment: KUBOARD_ENDPOINT: http://内网访问地址:80 KUBOARD_AGENT_SERVER_PORT: 10080 TZ: Asia/Shanghai volumes: - /opt/kuboard-data:/dataKUBOARD_ENDPOINT这个环境变量是浏览器访问Kuboard时最终会用的地址在集群的Agent回调Kuboard时也会用到。这里配HTTP还是HTTPS要看实际部署条件如果后面打算挂SSL证书这里必须一开始就填HTTPS的地址否则Agent建立的方向可能不对导致集群接进来之后工作负载页面一直打不开。KUBOARD_AGENT_SERVER_PORT是Kuboard用来跟集群内Agent建立反向通道的端口一定确保这个端口在Kuboard所在机器上是放行的。如果内网有防火墙规则这条线要提前确认好。3.3 将集群导入Kuboard的完整路径启动Kuboard服务端之后浏览器打开管理页首次登录需要设置管理员密码。登录后进入“集群管理”页面选择添加集群这个时候界面会提示两种方式一个是提供集群的kubeconfig文件来让Kuboard直接连接一种是使用Agent方式也就是在集群中安装Kuboard提供的Agent组件。我强烈建议在大多数内网场景使用Agent方式因为这样Kuboard和集群之间的连接不要求Kuboard所在机器能直接访问API Server的6443端口只要集群节点能访问到Kuboard的10080端口即可。Agent安装其实也是一个kubectl apply。由于集群节点需要访问Kuboard的Agent端口所以如果Kuboard和K8s集群是跨网段的要确保路由和防火墙规则对集群节点放开10080出方向和入方向。Agent部署完成后Kuboard页面会自动检测到连接状态然后进入集群的基本信息配置。我一般在导入之后的第一件事是检查节点列表是否都显示为Ready再检查有没有自动创建的存储类信息。确认这两项之后集群导入就算完成了。3.4 初始化基础资源的避坑清单集群接入Kuboard成功后我还会再做一些填充工作让界面上的信息更完整、平时排查问题更方便。先创建命名空间Namespace建议按环境、业务线来划分比如finance-prod、marketing-test。Kuboard支持直接在界面上创建后面分配工作负载时选择对应命名空间即可这比所有人都挤在default里清爽太多。再梳理一遍服务账号和权限。Kuboard本身用的是集群内创建的ClusterRole但我个人实践下来建议不要给所有使用者一个管理员的权限。可以按照团队角色创建多个Kubernetes ServiceAccount然后在Kuboard的“授权”页面进行绑定开发给查看权限、运维给编辑权限。如果有持久化需求可以在存储类页面提前把现有的NFS或者本地存储类配置好。Kuboard的工作负载编辑页面里对PVC的创建支持比较完善提前配好存储类之后开发人员自助申请PVC会顺畅很多。4. 常见问题与排查技巧实录4.1 集群节点能ping通但Kuboard代理连接超时我在实际部署中遇到过一个非常典型的“假通”问题三台节点相互ping没问题kubectl执行也没问题但通过Kuboard安装Agent之后页面一直显示“Agent未连接”或者“连接不稳定”。这种情况十有八九出在Kuboard的Agent端口上。排查思路先在Kuboard服务端所在机器上直接查看10080端口是否在监听再在集群节点上telnet一下Kuboard的10080端口。如果端口通继续查节点到Kuboard之间是否有NAT或防火墙对连接发起端的IP做了限制。Agent默认情况下是用节点的出口IP与Kuboard建立长连接如果是经过NAT出去Kuboard侧看到的来源IP可能是同一个地址对于Agent连接管理来说通常不会有问题但如果有防火墙状态检测规则长连接容易被异常断开。我最终的处理方法是在Kuboard所在机器上加了一条允许来自集群网段访问10080的规则并把TCP长连接的保活参数调低思路就是让连接先建立起来再保持稳定。4.2 容器日志时间与系统时间不一致Kuboard能直接看容器日志但如果发现容器日志的时间和节点本地时间差了8小时那问题不在Kuboard而在容器运行时和宿主机时区设置不一致。虽然前面已经提到过设置TZ时区的环境变量但容器内部的日志是由应用的输出决定的应用在打包时如果没有显式指定时区通常会用UTC默认时区。我的建议是双管齐下第一在部署工作负载的时候给Deployment环境变量里加上TZAsia/Shanghai第二如果应用用的是Java务必在启动参数里加上-Duser.timezoneAsia/Shanghai。Kuboard支持在界面上直接编辑工作负载的环境变量模板里提前配置好后续新应用部署就不容易踩时间坑。这个问题很小但到了排查问题时却能让人疯掉因为日志时间和监控图时间对不上怎么找线索都像是断层的。4.3 工作负载页面一直显示“加载中”或“连接中断”这个问题的排查要先分清是全局现象还是单个集群现象。如果是单个集群那大概率是Agent通道出了问题可以卸载Agent重新安装。如果全局都加载不出来则可能是Kuboard服务端进程资源不足导致的假死看看容器的内存使用率是不是已经逼近上限。我遇到过一种特殊情况集群里恰好有一个命名空间被误删了但后台没有清理干净导致Kuboard在读取某些资源列表时遇到了空指针页面就像卡住一样。这种情况下重启Kuboard容器没有太大用处把那个命名空间彻底重建或者清理掉异常资源就能恢复正常。总体而言Kuboard的稳定性是不错的大多数异常都能通过刷新页面、重新安装Agent或重启Kuboard容器这三板斧解决。4.4 kubeconfig权限过大的安全隐患很多人在导入已有集群时图省事直接拷贝/etc/kubernetes/admin.conf当作kubeconfig用。这个文件确实全权限但这不是一个好的做法因为Kuboard的管理员账号如果被他人拿到等于直接控制了整个集群。更稳妥的做法是创建一个专用的服务账号把权限限定到需要的范围内。步骤是这样的先创建ServiceAccount再创建ClusterRoleBinding或者RoleBinding最后拿到该ServiceAccount的Token作为kubeconfig使用。Kuboard的导入界面支持直接粘贴kubeconfig内容无需生成单独文件。这样即便Kuboard所在机器被攻破攻击者能操作的范围也可控。这个细节很值得养成习惯。4.5 离线环境缺少helm和常用工具的替代方案国产化内网环境常常没有helm、kustomize这些工具Kuboard虽然支持直接通过页面创建资源但有些时候我需要批量部署一组应用没有工具就不方便。我的做法是准备一个U盘工具箱里面放着helm二进制、kubectl、kustomize还有常用chart包。用的时候直接传到运维跳板机上不用安装依赖纯二进制文件即可运行。Kuboard本身的资源编排能力覆盖了大部分日常运维场景但批量更新多个镜像tag、滚动升级一批关联服务还是用helm或脚本更方便。我在Kuboard管理界面以外保留了这些CLI工具来应对批量操作。两者互补并不冲突。5. 使用体验复盘与后续扩展建议其实我真正想把Kuboard推广到团队日常靠的不只是部署一次就完事。它接进来之后的这几个月我逐渐把它变成了团队内部的一个“作战指挥台”。开发人员看自己的应用状态测试人员查日志和事件运维人员做发布回滚都在这一个页面上完成。原来每周要花半天时间教新人用kubectl现在新人只要会用浏览器基本零成本上手。比较惊艳的还有Kuboard对Ingress的可视化管理。原来写Ingress规则总是要在YAML里来回比对现在直接界面上选服务、填路径、配域名生成之后还能直接查看生效状态。这对于非专业运维背景的同事来说非常友好。过程中最大的教训是不要一上来就想把所有功能都铺开先把最核心的“看状态、看日志、重启、改环境变量”这四件事跑顺。Kuboard能做到的事情远不止这些但如果一开始就一股脑把所有权限、所有功能全开放出去用户反而会无所适从。我是先从一个小团队试运行的大家用顺手了之后才逐步扩大范围。国产化环境下的K8s运维原本就像在泥地里开车工具选对了至少能让轮子转起来。Kuboard这套组合拳打下来我的体感是“终于可以在浏览器里睡个安稳觉了”。后续我还打算做两件事一件是把Kuboard自带的数据目录做异地备份提高容灾能力另一件是在Kuboard前再挂一层统一认证网关让登录方式跟公司现有的账号体系完全打通。另外我还在测试Kuboard对多个集群的混合管理能力——把测试集群和生产集群放进同一个管理面在界面上用标签区分。这样一来后续就算要纳管更多国产化集群运维侧的压力也不会线性增长。如果你也在搞麒麟加K8s建议找一个空闲的下午按这篇流程先搭一套试用环境你大概率会发现原来国产化运维也没有想象中那么折腾。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →