前文介绍了C4模型,它主要用于可视化软件系统的抽象架构。
那么我们就用K8s的架构来进行一次C4模型的实践。
System层
以官方文档Kubernetes 架构页提供的概念为基础进行绘制。
System层要体现本系统和周围系统的关系,因此应该有开发者、管理员、基础设施、镜像仓库、应用程序等概念。
K8s-System-Context
Container层
进入Container层内部,应该体现Control Plane和Node。我们了解到K8s是一个主从架构。
K8s-Containers
Component层
进入各Component内部,应该体现主要的K8s集群组件。api-server、kubelet、pod等概念均应该出现。
图3 K8s-ControlPlaneComponents
图4. K8s-WorkerNodeComponents
总结
编辑DSL不比编辑图形容易多少,绘制过程也是开发过程(编码、预览、调整),缺少了可见即所得的那种直接获得感。
图形源码使用VSCode编辑,当成一般文件文件,没有使用插件。 使用Copilot Claude 4 辅助对话,总共进行了16次对话。 使用structurizr预览效果。
渲染得到的图形不能调整,需要打印、美化的场合可能还需要转换成中间格式进行二次加工。
Structurizr提供的分层预览功能不错,可以有的放矢地去查看架构。
源文件(可以粘贴到Structurizr中渲染成图)
workspace "Kubernetes Architecture" "Kubernetes集群架构描述" {
model {
# 外部用户和系统
developer = person "开发者" "使用kubectl部署和管理应用"
sysadmin = person "系统管理员" "管理Kubernetes集群"
externalApp = softwareSystem "B/S软件" "打包成image,通过k8s集群运行在基础设施上"
infrastructure = softwareSystem "基础设施" "提供计算、存储、网络资源"
imageRegistry = softwareSystem "镜像仓库" "注册和存储容器镜像,为集群提供镜像拉取服务" "Docker Hub/Harbor/ECR"
# Kubernetes 集群系统
k8sCluster = softwareSystem "Kubernetes集群" "容器编排和管理平台" {
# 控制平面容器
controlPlane = container "控制平面" "做出全局决策,检测和响应集群事件" "Kubernetes Control Plane" {
apiServer = component "API Server" "控制平面前端,公开Kubernetes API,处理请求" "kube-apiserver"
scheduler = component "调度器" "监视新创建的未指定节点的Pod,选择节点运行" "kube-scheduler"
controllerManager = component "控制器管理器" "运行控制器进程,包含Node、Job、EndpointSlice、ServiceAccount等控制器" "kube-controller-manager"
cloudController = component "云控制器管理器" "嵌入特定云平台控制逻辑,包含Node、Route、Service控制器" "cloud-controller-manager"
etcdInstance = component "ETCD" "一致且高可用的键值存储,用作Kubernetes所有集群数据的后台数据库" "etcd"
}
# 工作节点
workerNodes = container "工作节点" "维护运行的Pod并提供Kubernetes运行时环境" "Kubernetes Worker Nodes" {
kubelet = component "Kubelet" "保证容器都运行在Pod中,接收PodSpec确保容器运行状态健康" "kubelet"
kubeProxy = component "Kube-proxy" "网络代理,维护网络规则,实现Service概念的一部分" "kube-proxy"
containerRuntime = component "容器运行时" "负责管理Kubernetes环境中容器的执行和生命周期" "containerd/CRI-O"
pods = component "Pods" "最小调度和部署单位,包含一个或多个容器" "Pod instances"
}
# 插件系统 - 使用Kubernetes资源实现集群功能
addonsLayer = container "插件层" "使用Kubernetes资源实现集群功能,提供集群级别功能" "Kubernetes Addons" {
clusterDNS = component "集群DNS" "为Kubernetes服务提供DNS记录,几乎所有集群都必需" "CoreDNS"
dashboard = component "Web界面" "通用的基于Web的用户界面,管理集群和应用" "Kubernetes Dashboard"
monitoring = component "容器资源监控" "保存容器时序度量值到集中数据库,提供浏览界面" "Prometheus/Metrics Server"
logging = component "集群层面日志" "将容器日志保存到集中日志存储,提供搜索浏览接口" "Fluentd/Fluent Bit"
cni = component "网络插件" "实现容器网络接口规范,为Pod分配IP地址,实现Pod间通信" "Calico/Flannel"
ingressController = component "Ingress控制器" "管理外部访问集群服务,通常是HTTP" "Nginx/Traefik"
csi = component "存储插件" "实现容器存储接口规范,提供存储卷管理" "AWS EBS/GCE PD CSI"
}
}
# 关系定义
developer -> k8sCluster "使用kubectl管理" "HTTPS/REST API"
sysadmin -> k8sCluster "监控和维护集群" "HTTPS/SSH"
k8sCluster -> infrastructure "运行在" "虚拟化/容器化"
k8sCluster -> externalApp "部署和运行" "容器编排"
externalApp -> infrastructure "运行在" "容器化部署"
# 镜像仓库相关关系
developer -> imageRegistry "推送应用镜像" "HTTPS/Docker CLI"
externalApp -> imageRegistry "打包并存储镜像" "Docker Build/Push"
k8sCluster -> imageRegistry "拉取容器镜像" "HTTPS/Docker Pull"
# 控制平面内部关系
apiServer -> etcdInstance "读写集群状态" "gRPC"
scheduler -> apiServer "获取调度信息,绑定Pod到节点" "gRPC"
controllerManager -> apiServer "监控资源状态,执行控制循环" "gRPC"
cloudController -> apiServer "同步云资源状态" "gRPC"
# 节点组件关系
kubelet -> apiServer "注册节点,上报状态,获取Pod规范" "HTTPS"
kubelet -> containerRuntime "管理容器生命周期" "CRI"
kubelet -> pods "创建和管理Pod,确保容器运行" "Local API"
kubeProxy -> apiServer "获取Service和Endpoints信息" "HTTPS"
kubeProxy -> pods "配置网络规则,实现Service负载均衡" "iptables/IPVS"
# 应用与Pod关系
externalApp -> pods "作为Pod实例运行" "容器化运行时"
# 插件层关系
clusterDNS -> apiServer "监听Service和Endpoints变化" "HTTPS"
clusterDNS -> pods "提供DNS解析服务" "DNS/UDP"
dashboard -> apiServer "获取集群资源信息" "HTTPS"
monitoring -> apiServer "收集集群指标" "HTTPS"
monitoring -> kubelet "收集节点和Pod指标" "HTTPS"
logging -> pods "收集容器日志" "日志流"
cni -> pods "配置Pod网络,分配IP地址" "CNI API"
ingressController -> apiServer "监听Ingress资源" "HTTPS"
ingressController -> kubeProxy "路由外部流量到Service" "HTTP/TCP"
csi -> apiServer "监听PV/PVC资源" "HTTPS"
csi -> pods "提供持久存储卷" "挂载点"
}
views {
# 系统上下文视图
systemContext k8sCluster "SystemContext" {
include *
autoLayout
}
# 容器视图
container k8sCluster "Containers" {
include *
autoLayout
}
# 控制平面组件视图
component controlPlane "ControlPlaneComponents" {
include *
autoLayout
}
# 工作节点组件视图
component workerNodes "WorkerNodeComponents" {
include *
autoLayout
}
# 插件层组件视图
component addonsLayer "AddonsComponents" {
include *
autoLayout
}
# 样式定义
styles {
element "Person" {
color #ffffff
fontSize 22
shape Person
}
element "Software System" {
background #1168bd
color #ffffff
}
element "Container" {
background #438dd5
color #ffffff
}
element "Component" {
background #85bbf0
color #000000
}
}
}
}