1. 背景
当前,公司内部存在不同的容器产品:KUN、UK8S(及 Cube)、UEC 容器等,各个容器产品在技术栈的选择、产品形态上存在着一些差异,不同产品之间没有很好的协同性。同时,公有云容器产品获客过度依赖 IaaS 本身,缺少独立获客的特性和能力。
新的容器平台,一方面需要打通 KUN、UK8S、UEC 容器等内部及公有云容器产品,统一管理、统一规划,另一方面需要结合内部技术积累及外部技术需求,丰富开发、部署周边工具,降低用户接入门槛、增加用户粘性。
2. 产品目标
2.1 目标用户需求
外部用户
- 中大型客户:1. 能够简单、快速地搭建一套测试环境,快速切入;2. 提供一套 CI/CD 工具,能够对接客户现有、或者帮助客户对接主流的代码仓库、CI 工具(如 GitLab、Jenkins、Rancher)等,简化客户在 UCloud 的业务部署流程,降低业务容器化的门槛。
- 小型客户:能够进一步降低容器产品的使用门槛,扩大容器产品用户池。
内部用户
- 继续完善现有的容器平台,提供更完善的发布、灰度工具。
- 容器产品的预研 / 实验平台。
2.2 整体架构
一套技术栈,两套底层环境。根据不同的接入渠道(公有云 / 内部网)对接不同的底层资源环境,及不同的核心服务模块。3. 项目整体规划
功能项 | 优先 | 目标 | UK8S 现状 | KUN 现状 |
---|---|---|---|---|
集群管理 | P0 | - 公有云和 KUN 底层架构的统一 - 接入层界面尽量做到统一,针对不同的接入渠道,展示不同的模块 |
- 专有 / 托管版集群 - VK + Cube 容器实例已上线 - VK + 边缘容器对接中 |
- 多租户共享集群 - 租户 / 项目间通过 NS 隔离 |
监控告警 | P0 | - 容器平台资源及应用监控数据的采集 - 对接公司监控产品 |
- Prometheus 插件 |
- 平台级别:Prometheus:节点、网关等监控信息 - 用户级别:Prometheus:节点、Pod 等 Metrics 信息 - 可以通过 Prometheus 接入天梁 |
日志管理 | P0 | - 容器内资源及应用日志的采集 - 对接公司日志产品 |
- ELK + ES 插件 |
- 平台级:filebeat + logstash 统一收集到 ES - 单独分 top 日志:Kafka 收集 |
容器安全 | P1 | - 镜像安全 - 容器运行时安全 |
x | x |
CI 流水线 | P1 | - 对接主流的代码仓库和 CI 工具(如 GitLab、Jenkins、Rancher 等) - 提供 CI 中间产物(文件、镜像)的管理(UHub) |
x | ○ 对接 GitLab |
CD 部署 | P1 | - 应用自动部署 - 不同环境(开发、预发、测试、生产)的管理 - 发布回滚、配置变更 |
x | √ 对接 GitLab,实现 KUN 集群的持续部署 |
应用商店 | P2 | - Helm 应用商店,及主流的容器 Operator - 后期需要耗费至少 1 个人力,进行迭代、适配等维护工作 |
x 曾经有 Helm,因为缺少人维护下线 | √ Helm 应用商店 |
权限管理 | P2 | - 在 K8S 集群中对控制台权限的继承 - 针对不同账号,分配集群中各个 NS 下资源对象的增/删/改/查权限 |
x | √ 租户 / 项目间通过 NS 隔离 |
流量治理 灰度发布 |
P2 | - 按照地域进行灰度发布 - 同一集群中的蓝绿发布 |
x | ○ 基于 Istio 实现 |
4. UK8S & KUN 当前技术栈整理
集群管理功能整理 | |||||
---|---|---|---|---|---|
功能部分 | 功能详细描述 | kun实现方式 | uk8s实现方式 | 通用实现方式 | 备注 |
管理层 | master部署+ 认证 | openssl每个组件都签发不同证书, 其中APIserver带有节点信息 | cfssl生成证书不同组件证书 | ||
etcd存储 | 3节点或5节点集群(http或https) | etcd部署到3台master节点组成集群 | |||
高可用 | keepalive, 每个node上配置ipvs | ULB4 | |||
节点 | kubelet节点认证 | openssl每个节点签发不同的证书 | 所有的节点共用admin权限的证书 | ||
kubelet部署 | systemd 启动 kubelet | systemd 启动 kubelet | |||
运行时 | docker(18.9.9) | docker(<1.19), containerd(>=1.19) | k8s 1.21 废弃docker,使用containerd | ||
其他节点类型vk | 支持Cube的VK | ||||
POD网络 | 固定IP功能 | 自定义annotation + libcalico | 自定义annotation+sdn网络 | ||
双站功能 | 自定义cni(2个网卡)+ annotaion | ||||
CNI插件主要做 | 网桥 / 路由 会创建2个网卡实现双站 | 配置节点网络(路由) | |||
IPAM,IP管理 | libcaclio(ippool+ipblock+iphandle) | sdn网络(虚拟网api申请) | |||
路由 | BGP(bataman+gobgp) | sdn网络 | |||
存储CSI | 块存储 | udsk + ceph (CSI + agent)ceph使用ustore部署方式 | UDisk | ||
文件存储 | UFS(CSI + 自定义ULB) | UFS和自建nfs | |||
对象存储 | S3 (CSI) | UFile | |||
服务访问 | 集群内service | kube-proxy(VIP + iptables) | ULB+集群svc(iptables) | ||
双站service | 自实现 kun-proxy(VIP + ipvs) | ||||
网络联通性 | 集群外(内网) | 互通, 网关(proxy + bgp宣告全网) | VPC直通 | ||
公网 | 只允许从内到外,网关(dns+ nat64) | ULB对外暴露 | |||
用户网 | 互通 (网关静态flow + ip映射+ uxr + custom-route) | ||||
域名解析 | service域名解析 | coredns + 插件+ 公司内dns | coredns | ||
跨集群域名解析 | coredns + 插件 + 所有集群dns | ||||
双站dns解析 | coredns + 插件 | ||||
多集群管理 | 部署方式 | ansible脚本 | 脚本 | ||
服务管理 | 单独控制台 | 控制台页面+webterminal | |||
集群升级 | 控制台 | ||||
运维管理平台 | 如何获取整个集群信息 | 命令行 + prometheus + 邮件 | 控制台页面+webterminal |