多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

DCE容器云平台生产落地要点:部署、纳管与避坑指南

DCE容器云平台生产落地要点:部署、纳管与避坑指南 简介DCEDaoCloud Enterprise容器云平台介绍PPT面向企业IT架构师、运维及开发人员系统讲解基于Docker的企业级应用云平台如何帮助企业构建超大规模容器集群并涵盖微服务改造、DevOps实践、混合云部署等典型场景。资源包内仅包含1个pptx演示文稿压缩包大小5.9MB内容按“新时代需求—平台特点—客户价值—设计理念—核心功能—应用场景”展开重点分析了企业从传统IT架构向容器化、微服务化转型过程中遭遇的开发运维鸿沟、迭代闭环缺失等挑战并配有大量架构图与要点总结适合用于技术分享或方案汇报参考。目前已有128人学习。通过学习可理解DCE在容器编排、服务网格、CI/CD、安全合规及自动化运维等方面的能力以及其如何助力企业实现软件定义数据中心、提升业务敏捷性可作为容器云平台选型与落地的入门概览资料。1. DCE容器云平台是什么先搞懂这是不是你要的容器底座DCEDaoCloud Enterprise容器云平台一句话说清把散落在多个环境里的Kubernetes集群收进一套统一管理界面。许多人第一次接触它是手里拿到一份“DCE容器云平台介绍2.pptx”要做评审或选型。PPT把架构图画得很丰满全局管理、容器管理、可观测性、微服务治理排成一排但真到落地先要回答的是资源够不够、离线包怎么导、旧集群接不接得进来、组件翻车了去哪儿查。这不是拿来看热闹的对象而是会让运维和研发一起改工作习惯的容器底座。如果只有两三个测试集群它反而显得重一旦有多个业务团队共用K8s权限、配额、中间件交付这些事用它能从黑匣子变成可勾选的功能。2. 从PPT到生产DCE架构拆解与部署前置条件选型阶段看PPT看的是“有没有这个功能”部署阶段看手册看的是主机名、磁盘、内核、镜像仓库。DCE的实际架构比一张架构图复杂在“模块多、每个模块都是K8s上的一组工作负载”这件事上部署前不把模块边界想清楚后面每个组件都来抢资源时你根本不知道先让谁让路。2.1 模块那么多落地优先看三条主线DCE在PPT里通常按产品线讲全局管理、容器管理、可观测性、应用工作台、微服务引擎、多云编排。真到部署现场我习惯按“管理面、运行面、监控面”三条主线去拆而不是按PPT的产品线去配资源。主线模块生产中最先影响什么管理面全局管理账号、审计、多集群权限决定谁能碰生产运行面容器管理集群安装、纳管、升级决定Pod跑在哪监控面可观测性指标、日志、链路决定出故障时看得见看不见交付面应用工作台从镜像到发布的流水线决定业务上手速度治理面微服务引擎/服务网格限流熔断、流量治理改造量大通常二期再上选型理由第一条是“别想一次上全”。见过不少团队把PPT里所有模块勾上部署完发现光服务网格的sidecar就把业务集群资源吃掉两成运维还没吃透全局管理就背上了五个新组件。所以第一次落地我建议先把管理面、运行面、监控面这三条主线跑通应用交付用Helm手动发布顶上微服务治理放到二期。优先级搞清楚之后再去看节点规划否则资源预算一定失真这是做容器云最典型的事故前提。2.2 部署前的资源底线管理集群比业务集群更吃资源管理集群承担的不只是控制面还跑了全局管理、监控、日志、制品库、网关等多个子系统所以“管理集群不需要太大”是个误判。以三节点起步的管理集群为例我常用的底线参数如下资源项管理集群单节点底线说明CPU16核低于这个值组件同时调度时卡顿明显内存32GB监控和日志组件是内存大户系统盘100GB SSD至少留20%余量数据盘500GB SSD用于镜像仓库、etcd、Prometheus数据业务集群单节点8核/16GB起步按实际业务负载再扩这个配置不是官方最小安装要求而是按“我部署过之后觉得舒服”的经验值。注意关键词是SSD。管理集群的数据盘如果用了机械盘etcd的fsync延迟会直接导致集群选举抖动现象是节点间歇性NotReady查半天查不到原因最后换盘才好这就是典型的玄学问题。网络方面所有节点要求二层或三层互通千兆起步MTU一致时间和DNS提前同步好。很多离线环境里节点没有内网DNS结果镜像仓库域名解析失败安装报错五花八门。这些前置项如果靠装的时候临时补部署时间会成倍拉长每多一个“装到一半去配网络”的环节出错概率就高一分。2.3 用installer跑通最小集群关键配置与首次安装命令DCE的安装通常是拿一个离线包在管理集群的第一台机器上执行installer。常见做法是三台管理节点先打通免密然后把安装包解压到第一台机器按下面的命令走# 1. 解压离线安装包 tar -zxvf dce5-installer-*.tar.gz cd dce5-installer # 2. 先做环境检查把节点、磁盘、内核版本都验一遍 ./install.sh --check --config cluster.yaml # 3. 正式安装--debug 保留完整日志 ./install.sh --config cluster.yaml --debug 21 | tee install.log第一步解压得到所有组件镜像和安装脚本第二步的检查会把主机名冲突、内核模块缺失、磁盘挂载不正确这类问题一次性暴露出来第三步的日志建议始终落盘首次安装大概率会因为镜像仓库吞吐或网络波动要回看日志没日志就等于盲人摸象。安装过程通常比较长中途不要动节点配置等UI界面出现健康分再确认结束。cluster.yaml里我要重点强调的几个配置项如下# 管理集群三节点入口IP 必须与节点实际网络一致 masters: - hostname: dce-m1 ip: 192.168.10.11 - hostname: dce-m2 ip: 192.168.10.12 - hostname: dce-m3 ip: 192.168.10.13 # 容器运行时新环境一律用 containerd containerRuntime: containerd # 网络插件calico 或 cilium企业内部首选 calico networkPlugin: calico # 管理集群组件镜像优先从内置仓库拉取 registry: internal: truemasters三台是为了控制面高可用别为了省资源只装一台再等扩容DCE很多组件依赖Leader选举单节点在网络抖动时恢复时间会长得多。containerRuntime选containerd除非有老的docker镜像依赖否则docker这个运行时只会增加维护面。networkPlugin选calico原因在于它内核版本要求宽、排障资料多cilium有eBPF优势但对内核5.x有硬性要求内核不达标时翻车概率很高。registry设为internal离线环境部署时最省事组件会自动从内置制品库拉镜像不用额外改每个节点的拉取地址。跑完installer管理集群会有一个全局统一的Web入口但先别急着点功能下一章要做的是把已有的业务集群接进来那才是大部分人买DCE的真实理由不想给每一套集群单独配权限和监控。3. 用DCE接管已有集群三件事填满第一个工作日部署DCE不难难的是把一个已有业务状态的老集群接进来并且让业务方第二天还敢照常发版。这一章按“集群接入、权限配额、中间件交付”三件事讲都是第一个工作日要处理的。3.1 托管与非托管接入前就要决定的事DCE接外部K8s集群有两种主流方式托管与非托管。托管模式下DCE保存集群的完整kubeconfig并安装agent后续可以在平台上做升级、巡检、节点管理等动作非托管模式更像是只读纳管DCE只拿到受限权限做展示和调度业务集群生命周期仍由原来的平台管两种方式对操作边界的规定差别很大。选型上没有绝对对错关键看谁说了算。如果业务集群是用户自己手工搭建、没上任何升级工具建议托管如果已有成熟的集群治理流程比如有独立的运维平台在管节点尽量非托管避免两边抢控制权。接错模式的代价是后续DCE试图做节点操作时被原平台拒绝状态显示异常排查半天最后发现是模式选错了。接入时的操作路径一般是这样# 从业务集群导出当前接入凭证raw 格式会连带证书内容 kubectl config view --rawtrue /tmp/biz-cluster-kubeconfig.yaml # 校验凭证是否能正常列出节点 kubectl --kubeconfig /tmp/biz-cluster-kubeconfig.yaml get nodes -o wide # 在DCE全局管理界面里填写API Server地址并导入该凭证 # 保存后立刻观察agent是否在业务集群内启动 kubectl get pods -n kube-system | grep insight导出raw格式的kubeconfig会把client-certificate-data一并带出DCE导入时要用校验这步提前确认凭证没有被中间设备限流或禁掉。agent启动后DCE与业务集群之间的反向通道建立完毕很多纳管异常见鬼问题都是这一步的网络没有被放行。参数说明导入时注意“API Server地址”不要用内网IP写死除非确定不会变如果业务集群前面有负载均衡建议写负载均衡的域名。同时确认DCE这台管理机到业务集群kubelet端口的连通性通常需要放行6443、10250这两个端口。端口不通时集群列表里节点状态会持续显示异常界面上看起来像是“接入失败”实际上网络根本没通。3.2 命名空间、配额与LimitRange第一天就做的隔离业务集群接进来第一步不是急着部署应用而是把所有业务命名空间规整一遍。踩过的坑是命名空间混乱后期做配额和审计都无从下手。我一般会让业务团队按“业务名-环境”命名例如order-prod、order-test一眼能看出归属。配额这块ResourceQuota和LimitRange要成对出现。单独设quota只是给预算不给上限约束超卖依然发生。下面是一套可以直接抄的配置apiVersion: v1 kind: ResourceQuota metadata: name: order-prod-quota namespace: order-prod spec: hard: requests.cpu: 4 requests.memory: 8Gi limits.cpu: 8 limits.memory: 16Gi --- apiVersion: v1 kind: LimitRange metadata: name: order-prod-limitrange namespace: order-prod spec: limits: - default: memory: 512Mi defaultRequest: memory: 256Mi type: ContainerResourceQuota限制的是“用量预算”LimitRange约束的是“每个容器的最小/最大规格”。配合使用时K8s会根据LimitRange给没写requests的容器自动补一个默认请求值这样quota的requests.cpu、requests.memory才能真正被消耗而不是被绕过去。参数里default是容器的limitdefaultRequest是容器的request数值按业务实际负载设不要照抄示例。这里还要补一个细节命名空间要顺手把imagePullSecret和标签打好否则后面每次发布都要单独配置镜像仓库凭证业务方会反复来问这是自己给自己找麻烦。第一天的规范约定决定后面半年你要不要持续擦屁股。3.3 应用商店中间件交付的快速通道DCE的应用商店相当于一个可视化的Helm仓库Redis、MySQL、MinIO这类常用中间件都有现成模板。不过模板默认参数通常按低配写直接生产使用前要调整三个参数存储类、副本数、资源占位。存储类先确认平台里创建的StorageClass有数据盘支撑不然PVC起来后一直是Pending界面看不出原因只有看事件才知道。副本数方面单点中间件在容器云上基本别碰至少两副本加对应的反亲和规则资源占位要把limits提到业务高峰的1.5倍左右避免Pod因内存超限被反复OOM Kill。改完模板再点安装这是应用商店翻车最少的一种用法。中间件装完以后用底下几条命令做确认# 查看应用商店安装的中间件实例 kubectl get helmrelease -A # 实例异常时先看底层Pod状态 kubectl get pods -n namespace | grep -E redis|mysql|minioHelmRelease名字一般会带上命名空间和后缀Pod异常时先看是OOMKilled还是ImagePullBackOff两种原因的排查方向完全不同前者调资源后者查镜像仓库认证。这里有个经验先看事件再看日志事件能直接告诉你“为什么没起来”日志往往要在进程反复重启时才有价值。3.4 让业务跑起来的最小闭环老集群接入后第一次发布建议走一条最保守的路径用镜像仓库push一个新镜像在DCE界面建Deployment暴露Service再配Ingress。这段不建议上来就搞DevOps流水线先把平台当“升级版kubectl”用业务信任建立后再谈自动化。# 发布后依次确认三个状态 kubectl get deployment -n namespace kubectl get svc -n namespace kubectl get ingress -n namespace # 从管理集群反向访问业务集群Ingress curl -I -H Host: app.example.com http://ingress-ip/返回200说明链路通返回503则多半是后端Pod还没有Ready返回404则看Ingress规则或Service名称。这套检查顺序比在UI上乱点要快得多也容易让业务方建立起“平台是可控的”这个信心。4. 避坑DCE容器云平台生产落地的五个翻车点讲PPT时一切都很顺把平台装出来用一周问题才会浮出水面。下面五个坑按出现频率排了个序每个都按“现象、原因、解决”写方便直接对照排查。4.1 集群接入后一直显示异常现象在DCE界面上导入业务集群集群状态卡在Unknown节点列表一半正常一半红。原因最常见是agent到管理集群的反向gRPC链路不通DCE管理端和业务集群只通了前面反向端口没放行第二种是kubeconfig里的证书过期导入后验证通过但过一阵token失效。解决先在业务集群看agent日志确认报错是connection refused还是certificate error。连接拒绝就去安全组或防火墙放行对应端口常见是7473证书错误就重新导出kubeconfig再导入一次。这个坑每次接入新环境都遇到先测端口再改证书能省掉大量瞎猜时间。4.2 监控图表数据缺一半现象节点CPU、内存有曲线但Pod网络出入流量、文件系统使用率是空的或者Pod列表里指标全部显示“--”。原因采集链路里kubelet的cadvisor指标没有被权限放行。DCE的insight-agent会请求kubelet的/metrics/cadvisor接口这个接口在部分发行版上默认做了认证agent的ServiceAccount权限又不够请求被静默丢弃。解决在业务集群查insight-agent的Pod日志被拒绝会留有401或403痕迹然后给采集器补一个带nodes/metrics权限的角色或者调整kubelet的authentication配置。改完等两轮采集周期指标会自动补上不用重装agent。4.3 离线安装时镜像拉不下来现象离线包导入了制品库平台各组件始终ImagePullBackOff事件里报“manifest unknown”或“connection refused”。原因镜像仓库虽然导进去了但部署配置里的registry地址和节点上实际拉取的地址不一致或者节点/etc/hosts没有把registry域名映射到内网IP。解决先确认制品库里镜像tag是否存在用crictl pull一个测试镜像拉不动就先改hosts和containerd的registry配置再重新跑一轮installer。这里最容易踩的细节是镜像包里的镜像前缀带版本号路径导入后路径变了需要在config里同步修改否则一直拉的是旧地址。4.4 配额设了但业务照样超卖现象明明给命名空间配了ResourceQuota业务方照样能创建一个远超quota限额的Pod节点内存被挤爆。原因Pod声明里没有写requests和limits或者写了limits但没写requestsquota的“requests”维度根本不被消耗还有一种可能特权容器比如DaemonSet类的采集器被单独跳过。解决像3.2里那样Quota和LimitRange必须一起配。LimitRange会给没写资源的容器补默认值quota才有抓手。特权容器单独用一个受控命名空间配额策略不要对它们放行否则超卖永远拦不住。4.5 升级DCE版本后老集群API失效现象平台从旧版本升上来个别老业务集群里Ingress或Deployment开始报“no matches for kind Ingress in version extensions/v1beta1”。原因DCE版本升级会同步升级纳管集群上的Kubernetes版本而Kubernetes在新版本里移除了旧API。老集群里长期不更新的manifest还在引用旧API组。解决升级前先跑kubectl get apirequestcount看哪些旧API还在被高频使用让业务方先改manifest再升级顺序一定是业务集群在前、管理集群在后。这个坑在跨大版本升级时几乎必现别指望平台能自动迁移所有清单提前查一下能少折腾一整晚。5. 把DCE调到顺手参数调整与日常验收清单平台跑顺之后日常还是有三件事要管参数调优、状态检查、验收清单。这章给的是我维护DCE环境时沉淀下来的一套动作不确定的地方先查当前版本支持情况再动手改。5.1 必调的5个参数参数常见默认情况建议原因容器运行时沙箱镜像内置地址改成内网镜像节点扩容时避免跨公网拉取导致长时间PendingnodePort端口范围30000-32767按公司规范调整端口被业务预占时冲突很难排查CoreDNS副本数2按节点数扩容DNS解析抖动会让所有服务跟着抖监控数据保留期平台默认按磁盘容量设7到30天保留期越长Prometheus磁盘增长越快管理端session超时平台默认按安全策略收紧避免运维下班后web界面还挂着沙箱镜像改成内网对节点扩容速度的提升非常明显K8s每个Pod启动前都要有pause容器这个镜像在公网上拉与内网拉时间差了十倍不止nodePort范围如果公司已有服务占用某段端口提前改掉至少少一单故障工单。CoreDNS的副本数建议不低于2且要分散在不同节点这样单节点宕机不会让全集群域名解析中断。监控保留期是大坑默认配置在数据量上来以后会把数据盘占满。大促前可以把重要集群单独拉长保留期其余保持默认管理端session超时很多安全审计没过就是挂在“人走了会话还在”。这些参数改起来都要先确认当前集群版本改完观察组件滚动状态别一次性全改出了事都不知道是哪个参数引起的。5.2 平时盯这几个状态就够了# 平台组件健康概览把非 Running 的挑出来 kubectl get all -n dce-system | grep -v Running # 被纳管集群的异常Pod按命名空间聚合 kubectl get pods -A --field-selectorstatus.phase!Running # 存储类是否只剩默认class kubectl get sc -A # 监控采集目标是否掉线 curl -s http://prometheus-svc:9090/api/v1/targets \ | jq .. | .health? // empty | sort | uniq -c第一条看管理组件有没有不断重启第二条看业务集群全局异常第三条防止存储类被误删导致PVC一直Pending第四条用一条curl把监控目标健康状态聚合出来掉线目标数量一目了然。这套命令五分钟能过一遍比登录UI点半天快得多也更容易被写进值班巡检脚本。5.3 部署上线前的验收清单从全局管理能看到该集群的审计日志agent在目标集群状态为Running部署一个带PVC的测试应用把节点下线再上线数据还在人为制造一个错误告警确认通知渠道能送达离线安装包和备份介质都做了恢复演练审计日志管的是“谁能动生产”agent的Running管的是“平台对集群有持续感知”PVC验证的是存储可靠性错误告警验证的是监控链路恢复演练验证的是后悔药到底能不能吃。这五条都是生产事故前最便宜的投入真出大事再验证就晚了。6. 收尾我在DCE生产环境里保留的四个习惯平台上线只是开始真正让DCE长期不翻车的是几个看起来很小的习惯。第一个习惯改默认口令和证书。DCE部署完成后全局管理的初始管理员密码和平台内置CA都在文档里第一件事就是改掉并集中管理。密码管理做好后还要把平台签发的证书纳入企业内部的证书生命周期不然一年后证书过期所有组件状态会突然集体变红那场面很惊悚。第二个习惯每周备份一次管理集群。DCE的管理面承载账号、审计、集群配置这类数据丢了比业务数据丢失还麻烦。备份介质不要放在同一个平台我是每周把etcd快照和全局管理数据库dump导到独立的存储每季度做一次恢复演练确保备份不是心理安慰。第三个习惯升级之前先啃release note。DCE每个版本都会列已知问题和升级注意点大版本升级前我会对照release note把涉及到的模块标记出来先在测试环境把升级路径走一遍再动生产。曾经跳过这一步直接升结果一个监控组件配置不兼容整个界面打不开那次之后我就老实了。第四个习惯把命名空间和模块名对应的关系写进团队wiki。DCE的组件、命名空间、服务名都有一套命名人员变动后新人没有这张表就只能瞎猜平台对团队来说就成了黑匣子。我花半天整理了一张表组件名称、日志位置、常见告警口径都列在里面之后所有排障都从这张表开始。这四个习惯花不了多少时间但基本能挡掉DCE环境里绝大部分“半夜才爆”的事故。希望帮到你。本文还有配套的精品资源点击获取
返回列表