Kubernetes 架构原理与集群环境部署

目录

[一、Kubernetes 的核心优势](#一、Kubernetes 的核心优势)

[二、Kubernetes 的主要挑战](#二、Kubernetes 的主要挑战)

[三:Kubernetes 架构解析](#三:Kubernetes 架构解析)

[1:master 节点的组件](#1:master 节点的组件)

[2:Node 节点包含的组件](#2:Node 节点包含的组件)

[3:kubernetes 网络插件](#3:kubernetes 网络插件)

[四:Kubeadm 快速安装 Kubernetes 集群](#四:Kubeadm 快速安装 Kubernetes 集群)

[1:部署 Kubernetes 集群(注意命令执行的节点)](#1:部署 Kubernetes 集群(注意命令执行的节点))

[五:Metrics-server 部署](#五:Metrics-server 部署)

[六:Kuboard 部署](#六:Kuboard 部署)

[七:安装 helm 客户端](#七:安装 helm 客户端)

八:测试


一、Kubernetes 的核心优势

简化开发与测试流程

  • 日志管理:通过 Kubernetes Dashboard 快速查看多环境日志,无需手动定位容器。
  • 发布与回滚:支持蓝绿发布、金丝雀发布等,结合 Jenkins/Git 实现自动化,提升迭代速度。
  • 服务网格(Service Mesh):解耦网络逻辑(如负载均衡、限流),开发者专注业务代码。
  • 环境隔离:通过不同配置(参数、变量、文件)实现一次构建多环境部署,测试环境一键创建。

运维效率提升

  • 自动化运维

健康检查与自愈:自动处理节点故障,减少人工干预。

弹性扩缩容:一键调整资源,避免传统服务器采购和部署的繁琐流程。

  • 标准化与高可用

容器镜像确保环境一致性,减少依赖冲突。

Ingress 替代复杂 Nginx 配置,Service 自动管理负载均衡。

  • 中间件与端口管理:秒级部署高可用中间件集群(如 Redis),统一端口配置避免冲突。
  • 成本与资源优化

多环境共享集群资源,按需分配,提高利用率。

减少重复性运维工作,降低人力成本。

二、Kubernetes 的主要挑战

  • 学习曲线陡峭

概念复杂(如 Pod、Service、Ingress),需掌握广泛知识(网络、存储、安全)。

初期部署和调试困难,可能需数月才能熟练。

  • 运维角色转型

从传统运维转向 DevOps,需了解业务代码、CI/CD 流程,甚至参与开发规范制定。

需持续跟进新技术(如服务网格、Operator 框架)。

  • 技术生态整合

与现有工具链(监控、日志收集)的兼容性需额外配置。按an

三:Kubernetes 架构解析

1:master 节点的组件

组件 核心功能 关键特性 与其他组件的交互
API Server 集群网关,提供 REST API 入口,管理资源对象的增删改查 唯一直接操作 etcd 的组件,支持水平扩展,负责认证、授权、请求校验 接收所有客户端请求(kubectl/Dashboard),其他控制平面组件均通过 API Server 通信
Scheduler 将未调度的 Pod 分配到合适的工作节点 基于资源需求(CPU/内存)、亲和性规则调度,支持自定义调度器 监听 API Server 的新 Pod 事件,调度后更新 Pod 的节点绑定信息
Controller Manager 运行各类控制器(如 Deployment、Node Controller),确保集群状态符合预期 包含多个逻辑独立的控制器,自动修复异常(如重启 Pod、扩缩容) 通过 API Server 监听资源状态,驱动实际状态向期望状态收敛
etcd 分布式键值存储,持久化保存集群所有状态和配置数据 高可用需部署奇数节点,数据一致性要求高(Raft 协议),集群的"唯一真相来源" 仅由 API Server 直接读写,其他组件通过 API Server 间接访问 etcd
节点数量 容错能力(允许故障节点数) 说明 推荐场景
1 0 单节点无容错,故障即集群不可用 仅测试环境
3 1 半数以上(≥2)节点存活即可正常工作,最优性价比 生产环境最小部署
5 2 更高容错能力,但写入性能略有下降(需更多节点确认) 超大规模或高可用要求严格场景
偶数(如4) 1(与3节点相同) 不推荐,选举或网络分区时可能脑裂,资源浪费(容错能力与3节点相同,但需维护更多节点) 避免使用

2:Node 节点包含的组件

组件 核心功能 关键特性 与其他组件的交互
容器运行时 运行容器(Pod 内的容器),管理镜像拉取、容器启停等操作 支持多种运行时(Docker、containerd、CRI-O),通过 CRI(容器运行时接口)与 Kubernetes 集成 由 kubelet 调用,负责实际运行容器
kubelet 节点代理,管理 Pod 生命周期,上报节点状态,确保容器健康运行 监听 API Server 的指令,驱动容器运行时执行操作,管理存储卷(CVI)和网络(CNI) 与 API Server 通信,接收 Pod 调度指令并反馈节点状态
kube-proxy 实现 Service 的负载均衡和网络代理,维护节点网络规则(如 iptables/IPVS) 为 Pod 提供唯一 IP,支持服务发现和内部通信,确保服务可访问 与 API Server 同步 Service 和 Endpoints 信息,动态更新网络规则

3:kubernetes 网络插件

特性 说明
项目来源 由 CoreOS 开发,被多个 Kubernetes 发行版默认集成
数据存储 利用集群现有的 etcd 存储状态信息,无需额外存储
网络类型 IPv4 Overlay 网络
IP 分配 每个节点分配一个子网,节点上的网桥接口为 Pod 分配 IP
通信方式 同一主机 Pod 通过网桥通信;跨主机 Pod 流量封装在 UDP/VXLAN 包中转发
后端模式 支持 UDP(测试)、VXLAN(推荐)、host-gateway(需二层网络)
适用场景 中小规模集群,简单易用
模式类型 工作原理 依赖条件 特点 适用场景
Overlay 通过隧道封装(如 VXLAN)实现跨主机通信 三层网络可达 配置简单,性能中等 通用场景,跨云/跨机房
路由 依赖路由表直接转发 需底层网络支持路由 高性能,但配置复杂 对性能要求高的环境
桥接 通过网桥连接同主机容器 仅限同主机通信 低开销,无法跨节点 单节点测试/开发环境

四:Kubeadm 快速安装 Kubernetes 集群

主机名 IP地址 操作系统 CPU/内存 主要软件组件 角色
k8s-master 192.168.10.101 CentOS7.9 2核、4G Docker CE, Kube-apiserver, Kube-controller-manager, Kube-scheduler, Etcd, Kubelet, Kube-proxy Master(控制平面)
k8s-node01 192.168.10.102 CentOS7.9 2核、2G Docker CE, Kubectl, Kube-proxy, Calico Worker(工作节点)
k8s-node02 192.168.10.103 CentOS7.9 2核、2G Docker CE, Kubectl, Kube-proxy, Calico Worker(工作节点)

正式开始部署 kubernetes 集群之前,先要进行如下准备工作。基础环境相关配置操作在三台主机k8s-master、k8s-node01、k8s-node82 上都需要执行,下面以 k8s-master 主机为例进行操作演示

完成基础环境准备之后,在三台主机上分别部署 Docker 环境,因为 Kubernetes 对容器的编排需要 Docker 的支持。以 k8s-master 主机为例进行操作演示,首先安装一些 Docker 的依赖包,然后将Docker 的 YUM 源设置成国内地址,最后通过 YUM 方式安装 Docker 并启动。

1:部署 Kubernetes 集群(注意命令执行的节点)

配置三台主机的主机名

复制代码
# 主机一(Master节点)
[root@k8s-master ~]# hostnamectl set-hostname k8s-master
[root@k8s-master ~]# exec bash

# 主机二(Node01节点)
[root@k8s-node01 ~]# hostnamectl set-hostname k8s-node01
[root@k8s-node01 ~]# exec bash

# 主机三(Node02节点)
[root@k8s-node02 ~]# hostnamectl set-hostname k8s-node02
[root@k8s-node02 ~]# exec bash

在三台主机上绑定 hosts

复制代码
# 配置集群节点hosts解析
cat <<EOF >> /etc/hosts
192.168.10.101 k8s-master
192.168.10.102 k8s-node01
192.168.10.103 k8s-node02
EOF

关闭交换分区

复制代码
# 禁用swap并永久生效
swapoff -a  # 立即关闭swap
sed -i '/swap/s/^/#/' /etc/fstab  # 注释掉fstab中的swap条目

配置 Kubernetes 的 YUM 源

操作节点:k8s-master,k8s-node01,k8s-node02

复制代码
# 配置Kubernetes阿里云镜像源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
       https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

# 清理yum缓存
dnf clean all

安装Kubelet、Kubeadm 和 Kubectl

操作节点:k8s-master,k8s-node01,k8s-node02

复制代码
dnf install -y kubelet-1.23.6 kubeadm-1.23.6 kubectl-1.23.6

如果在命令执行过程中出现索引 gpg 检査失败的情况,请使用 yum install -y --nogpgcheck kubelet-1.23.0 kubeadm-1.23.0 kubect1-1.23.0来安装,或者将gpgcheck=1和repo_gpgcheck=1设置为 0

Kubelet 设置开机启动

操作节点:k8s-master,k8s-node01,k8s-node02

复制代码
systemctl enable kubelet

kubelet 刚安装完成后,通过 systemctl start kubelet 方式是无法启动的,需要加入节点或初始化为 master 后才可启动成功。

生成初始化配置文件

操作节点:k8s-master

复制代码
kubeadm config print init-defaults > init-config.yaml

Kubeadm 提供了很多配置项,Kubeadm 配置在 Kubernetes 集群中是存储在 ConfigMap 中的,也可将这些配置写入配置文件,方便管理复杂的配置项。Kubeadm 配置内容是通过 kubeadm config 命令写入配置文件的。

其中,kubeadm config 除了用于输出配置项到文件中,还提供了其他一些常用功能,如下所示。

  • kubeadm config view:查看当前集群中的配置值。
  • kubeadm config print join-defaults:输出 kubeadm join 默认参数文件的内容。
  • kubeadm config images list:列出所需的镜像列表。
  • kubeadm config images pull:拉取镜像到本地。
  • kubeadm config upload from-flags:由配置参数生成 ConfigMap。

修改初始化配置文件

操作节点:k8s-master

复制代码
# init-config.yaml
apiVersion: kubeadm.k8s.io/v1beta3
kind: InitConfiguration
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
localAPIEndpoint:
  advertiseAddress: 192.168.10.101
  bindPort: 6443
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  name: k8s-master
  taints: null

---
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
kubernetesVersion: v1.23.6
imageRepository: registry.aliyuncs.com/google_containers
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
dns:
  type: CoreDNS
etcd:
  local:
    dataDir: /var/lib/etcd
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12
  podSubnet: 10.244.0.0/16
apiServer:
  timeoutForControlPlane: 4m0s
controllerManager: {}
scheduler: {}

注意:1.24.8 的版本中 apiVersion:kubeadm.k8s.io/v1beta2 被弃用,

serviceSubnet:指定使用 ipvs 网络进行通信,ipvs 称之为 IP 虚拟服务器(IP Virtual server,简写为 IPVS)。是运行在 LVS 下的提供负载平衡功能的一种技术。含义 IPVS 基本上是一种高效的Layer-4交换机

podsubnet 10.244.0.0/16 参数需要和后文中 kube-flannel.yml 中的保持一致,否则,可能会使得 Node 间 Cluster Ip 不通。

默认情况下,每个节点会从 Podsubnet 中注册一个掩码长度为 24 的子网,然后该节点的所有 podip 地址都会从该子网中分配。

拉取所需镜像

操作节点:k8s-master

如果地址无法解析,可以使用阿里的公共 DNS:223.5.5.5 或 223.6.6.6

复制代码
kubeadm config images list--config init-config.yaml
kubeadm config images pull --config=init-config.yaml

备注:

此步骤是拉取 k8s 所需的镜像,如果已经有离线镜像,可以直接导入,这一步就不需要了

初始化 k8s-master

操作节点:k8s-master

注意:master 节点最少需要2个CPU

复制代码
kubeadm init --config=init-config.yaml

执行完该命令后一定记下最后生成的 token:

kubeadm join 192.168.10.101:6443 \

--token abcdef.0123456789abcdef \

--discovery-token-ca-cert-hash sha256:8b17b7d607ab7f79c2249c58d74525368bbb15ad884c365aaa1a968b9833d107

Kubeadm 通过初始化安装是不包括网络插件的,也就是说初始化之后是不具备相关网络功能的,比如k8s-master 节点上査看节点信息都是"Not Ready"状态、Pod 的 coreDNS 无法提供服务等。

备注:

如果要重复初始化,先重置 kubeadm

root@k8s-master \~\]# kubeadm reset **复制配置文件到用户的 home 目录** 操作节点:k8s-master # 配置kubectl访问权限 mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config **node 节点加入集群** 操作节点:k8s-node01、k8s-node02 注意:将master 中生成的 token,直接复制过来即可 kubeadm join 192.168.16.161:6443 \ --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:8b17b7d607ab7f79c2249c58d74525368bbb15ad884c365aaa1a968b9833d107 **在 k8s-master 节点设置环境变量并查看节点信息** # Nodes status (all NotReady) kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master NotReady master 13m v1.19.4 k8s-node01 NotReady 2m30s v1.19.4 k8s-node02 NotReady 21s v1.19.4 # Pods status (CoreDNS pending) kubectl get pod -A NAMESPACE NAME READY STATUS RESTARTS AGE kube-system coredns-6d8c4cb4d-7sw19 0/1 Pending 0 3m58s kube-system coredns-6d8c4cb4d-rr1pp 0/1 Pending 0 3m58s [...other system pods running...] 因为此时还没安装网络插件,coredns 无法获得解析的 IP,就会使得 coredns 处于 pending 状态。各个节点的状态也处于 NotReady 的状态,这些异常情况待安装过网络插件后都会自行解决。 **部署 calico 网络插件** kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml 备注: 也可以提前下载好 calica 的资源清单直接部署 \[root@k8s-master \~\]# kubectl create -f calico.yaml # 查看集群节点状态(全部Ready) kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master Ready control-plane,master 22h v1.23.0 k8s-node01 Ready 22h v1.23.0 k8s-node02 Ready 22h v1.23.0 # 查看所有命名空间的Pod状态 kubectl get pod --all-namespaces ## 五:Metrics-server 部署 Metrics Server 是一种可扩展、高效的容器资源指标来源,适用于 Kubernetes 内置的自动缩放管道。Metrics Server 从 Kubelets 收集资源指标,并通过 Metrics API 将它们暴露在 Kubernetesapiserver 中,供 Horizontal Pod Autoscaler 和 Vertical Pod Autoscaler 使用。指标 API 也可以通过 访问 kubectl top,从而更容易调试自动缩放管道。 Metrics Server 对集群和网络配置有特定的要求。这些要求并不是所有集群分布的默认要求。在使用 Metrics server 之前,请确保您的集群分布支持这些要求: * kube-apiserver 必须启用聚合层。 * 节点必须启用 webhook 身份验证和授权。 * Kubelet 证书需要由集群证书颁发机构签名(或通过传递--kubelet-insecure-tls 给Metrics Server 来禁用证书验证)注意这里是重点,如果本地没有签名需要传递 args:"--kubelet-insecure-tls"给Metrics Server * 容器运行时必须实现容器指标RPC(或具有cAdvisor 支持) * 网络应支持以下通信: 1. 控制平面到指标服务器。控制平面节点需要到达 Metrics Server 的 pod IP 和端口10250(或节点 IP 和自定义端口,如果 hostNetwork 已启用) 2. 所有节点上的 Kubelet 的指标服务器。指标服务器需要到达节点地址和 Kubelet 端口。地址和端口在Kubelet中配置并作为Node 对象的一部分发布。字段中的地址.status.addresses 和端口.status.daemonEndpoints.kubeletEndpoint.port(默认 10250)。Metrics Server 将根据 kubelet-preferred-address-types 命令行标志(InternalIP,ExternalIP,Hostname 清单中的默认值)提供的列表选择第一个节点地址 源码位置: metrics-server的github 地址:https://github.com/kubernetes-sigs/metrics-server | Metrics Server 版本 | Metrics API 组/版本 | 支持的 Kubernetes 版本范围 | 备注 | |-------------------|--------------------------|---------------------|----------------| | 0.6.x | `metrics.k8s.io/v1beta1` | 1.19+ | 最新稳定版本,推荐新集群使用 | | 0.5.x | `metrics.k8s.io/v1beta1` | 1.8+ | 兼容性广,适合旧版本集群 | | 0.4.x | `metrics.k8s.io/v1beta1` | 1.8+ | 已逐步淘汰 | | 0.3.x | `metrics.k8s.io/v1beta1` | 1.8-1.21 | 仅适用于历史版本集群 | **下载Metrics-server 的yaml 文件** > wget https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.6.3/components.yamI **修改 yaml 文件并安装** apiVersion: apps/v1 kind: Deployment metadata: name: metrics-server namespace: kube-system labels: k8s-app: metrics-server spec: selector: matchLabels: k8s-app: metrics-server template: metadata: labels: k8s-app: metrics-server spec: containers: - name: metrics-server image: registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server:v0.6.3 args: - --kubelet-insecure-tls - --cert-dir=/tmp - --secure-port=4443 - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname - --kubelet-use-node-status-port - --metric-resolution=15s **测试安装结果** kubectl top node NAME CPU(cores) CPU% MEMORY(bytes) MEMORY% k8s-master 99m 4% 1201Mi 31% k8s-node01 57m 2% 1597Mi 42% k8s-node02 37m 3% 616Mi 16% kubectl top pod -A NAMESPACE NAME CPU(cores) MEMORY(bytes) kube-system calico-kube-controllers-64cc74d646-vtjgc 1m 27Mi kube-system calico-node-jswkq 17m 156Mi kube-system calico-node-kfcr7 18m 169Mi kube-system calico-node-srz8f 15m 161Mi kube-system coredns-6d8c4cb4d-gggss 2m 64Mi kube-system coredns-6d8c4cb4d-l6plx 2m 21Mi kube-system etcd-k8s-master 14m 64Mi kube-system kube-apiserver-k8s-master 37m 361Mi kube-system kube-controller-manager-k8s-master 9m 55Mi kube-system kube-proxy-4vndc 1m 23Mi kube-system kube-proxy-5dg8m 1m 69Mi kube-system kube-proxy-tbqkz 1m 24Mi kube-system kube-scheduler-k8s-master 3m 25Mi kube-system metrics-server-66bdc46d86-4mfgw 3m 25Mi ## 六:Kuboard 部署 | **功能模块** | **核心能力** | **用户价值** | |-----------|---------------------------------------------------------------------------------|----------------------| | **资源可视化** | • 图形化展示 Pod/Deployment/Service/Node 等资源状态 • 拓扑关系展示(如 Deployment→ReplicaSet→Pod) | 无需记忆命令,快速掌握集群状态和应用架构 | | **监控与运维** | • 实时监控 CPU/内存/网络等指标 • 直接查看 Pod 日志 • 界面一键扩缩容/更新资源 | 提升故障排查效率,简化运维操作 | | **多集群管理** | • 统一管理多个集群 • 基于角色的权限控制(RBAC) | 降低多集群管理复杂度,保障安全性 | | **应用部署** | • 向导式部署(表单填写) • YAML 文件导入 • 版本管理与灰度发布 | 加速应用交付,支持灵活部署策略 | **部署 Kuboard** # (1) 安装kuboard插件 [root@localhost ~]# kubectl apply -f kuboard-v3.yaml # (2) 查看dashboard状态 [root@localhost ~]# kubectl get pods -n kuboard # (3) 查看service暴露端口 [root@localhost ~]# kubectl get svc -n kuboard NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kuboard-v3 NodePort 10.1.236.103 80:30080/TCP,10081:30081/TCP,10081:30081/UDP 4m42s 访问测试 > 浏览器访问 http://\:30080 > > 用户名: admin > > 密码: Kuboard123 ## 七:安装 helm 客户端 # (1) 下载安装包 [root@localhost ~]# wget https://get.helm.sh/helm-v3.9.4-linux-amd64.tar.gz # (2) 解压 [root@localhost ~]# tar zxvf helm-v3.9.4-linux-amd64.tar.gz # (3) 安装 [root@localhost ~]# mv linux-amd64/helm /usr/local/bin/ # (4) 查看版本 [root@localhost ~]# helm version version.BuildInfo{Version:"v3.9.4", GitCommit:"ee407bdf364942bcb8e8665f82e15aa28009b71", GitTreeState:"clean", GoVersion:"go1.16.5"} 小技巧: 在使用 kubectl 命令的时候,如果觉得单词不好打,可以设置一个别名: [root@localhost ~]# vim ~/.bashrc alias rm='rm -i' alias cp='cp -i' alias mv='mv -i' alias ku='kubectl' 重启后生效 关闭所有的节点,为实验环境做快照,所有的节点都做快照, ## 八:测试 # nginx-service.yaml 完整内容 apiVersion: v1 kind: Service metadata: name: mynginx namespace: default labels: app: mynginx spec: type: LoadBalancer ports: - port: 80 targetPort: http protocol: TCP name: http selector: app: mynginx --- apiVersion: apps/v1 kind: Deployment metadata: name: mynginx-deployment namespace: default labels: app: mynginx spec: replicas: 2 selector: matchLabels: app: mynginx template: metadata: labels: app: mynginx spec: containers: - name: mynginx image: nginx:1.7.9 ports: - name: http containerPort: 80 protocol: TCP # 部署应用 [root@localhost ~]# kubectl apply -f nginx-service.yaml # 检查部署状态 [root@localhost ~]# kubectl get pod NAME READY STATUS RESTARTS AGE mynginx-deployment-6ddb8c4786-rt24d 1/1 Running 0 66s mynginx-deployment-6ddb8c4786-tn2cq 1/1 Running 0 66s # 查看服务状态 [root@localhost ~]# kubectl get service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 443/TCP 8m39s mynginx LoadBalancer 10.97.243.236 80:31050/TCP 69s 用宿主机浏览器访问: > [http://192.168.10.101:31050](http://192.168.10.101:31050 "http://192.168.10.101:31050")

相关推荐
别致的影分身2 小时前
Docker 镜像原理
运维·docker·容器
阿葱(聪)2 小时前
java 在k8s中的部署流程
java·开发语言·docker·kubernetes
指月小筑2 小时前
K8s 自定义调度器 Part1:通过 Scheduler Extender 实现自定义调度逻辑
云原生·容器·kubernetes·go
@大迁世界3 小时前
前端:优秀架构的坟墓
前端·架构
Elastic 中国社区官方博客4 小时前
在 Windows 上使用 Docker 运行 Elastic Open Crawler
大数据·windows·爬虫·elasticsearch·搜索引擎·docker·容器
土小帽软件测试5 小时前
docker安装、启动jenkins服务,创建接口自动化定时任务(mac系统)
docker·容器·jenkins
世纪摆渡人5 小时前
部署-k8s和docker、jenkins的区别和联系
docker·kubernetes·jenkins
明天…ling5 小时前
docker+小皮面板
运维·docker·容器
秋千码途5 小时前
小架构step系列17:getter-setter-toString
java·开发语言·架构