使用C4模型绘制K8s架构图

前文介绍了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
      }
    }
  }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容