别再死记硬背K8s组件了!用Docker和Kind动手搭建实验环境,5分钟搞懂API Server和etcd

发布时间:2026/6/12 19:35:24

别再死记硬背K8s组件了!用Docker和Kind动手搭建实验环境,5分钟搞懂API Server和etcd 从零构建K8s实验环境用Docker和Kind透视API Server与etcd的协作奥秘当你第一次接触Kubernetes时是否曾被那些晦涩的组件名词搞得晕头转向API Server、etcd、Controller Manager...这些控制平面的核心组件在文档中总是以抽象的概念呈现。今天我将带你用完全不同的方式理解它们——通过亲手搭建一个本地实验环境观察这些组件如何真实运作。1. 为什么选择Kind作为实验工具在开始动手之前我们需要一个轻量级的Kubernetes环境。相比minikube或kubeadmKindKubernetes in Docker具有独特优势秒级启动基于容器化的节点创建集群只需一条命令零依赖仅需安装Docker即可运行无需虚拟化支持真实环境不是模拟器而是真实的kubelet和组件进程可销毁性实验完成后可彻底清理不留痕迹# 验证Docker已安装 docker --version # 输出应类似Docker version 20.10.17, build 100c701提示确保Docker分配了至少4GB内存可在Preferences - Resources中调整否则可能因资源不足导致组件异常。2. 五分钟快速搭建实验环境让我们从零开始创建一个包含完整控制平面的Kubernetes集群# 安装kind命令行工具 curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.17.0/kind-linux-amd64 chmod x ./kind sudo mv ./kind /usr/local/bin/ # 创建集群配置文件暴露API Server端口 cat kind-config.yaml EOF kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 nodes: - role: control-plane extraPortMappings: - containerPort: 6443 hostPort: 16443 EOF # 启动集群 kind create cluster --config kind-config.yaml这个配置做了件很关键的事将API Server的6443端口映射到宿主机的16443端口。稍后我们会直接通过这个端口与API Server交互。3. 深入观察控制平面组件现在让我们进入控制平面节点看看各个组件如何运行# 进入控制平面容器 docker exec -it kind-control-plane bash # 查看运行的组件进程 ps aux | grep -E kube-apiserver|etcd|kube-controller-manager|kube-scheduler你应该能看到类似这样的输出root 1010 3.4 8.1 1022784 164492 ? Ssl 14:23 0:07 kube-apiserver --advertise-address172.18.0.2 --allow-privilegedtrue... root 936 2.1 5.3 728852 108200 ? Ssl 14:23 0:04 etcd --advertise-client-urlshttps://172.18.0.2:2379 --cert-file/etc/kubernetes/pki/etcd/server.crt...3.1 API Server的请求处理流程让我们通过一个实际API请求观察组件间的协作# 在宿主机上执行非容器内 curl -k https://localhost:16443/api/v1/namespaces/default/pods \ --header Authorization: Bearer $(kubectl get secrets -o jsonpath{.items[?(.metadata.annotations[kubernetes\.io/service-account\.name]default)].data.token} | base64 --decode)这个请求会经历以下关键步骤认证阶段API Server验证Bearer Token的合法性授权阶段检查default service account是否有list pods权限etcd交互从etcd获取当前namespace下的pod数据响应构建将etcd的原始数据转换为API对象格式注意在生产环境中永远不要使用不安全的-k参数这里仅用于实验简化。3.2 etcd中的数据存储结构etcd作为Kubernetes的数据库存储了所有集群状态。让我们查看它实际存储的内容# 在控制平面容器内执行 ETCDCTL_API3 etcdctl \ --endpointshttps://127.0.0.1:2379 \ --cacert/etc/kubernetes/pki/etcd/ca.crt \ --cert/etc/kubernetes/pki/etcd/server.crt \ --key/etc/kubernetes/pki/etcd/server.key \ get / --prefix --keys-only | grep -v ^$你会看到类似这样的键结构/registry/pods/default/nginx /registry/services/default/kubernetes /registry/configmaps/kube-system/kube-proxy这种层次化的键设计反映了Kubernetes的资源组织结构。API Server不是直接存储YAML文件而是将对象序列化为Protocol Buffer格式后存入etcd。4. 组件交互实验从创建Pod看全链路协作让我们通过创建一个简单的nginx Pod观察各组件如何协作# 创建Pod kubectl run nginx --imagenginx --port80 # 观察调度过程需要新开终端 kubectl get pods -w这个简单的命令背后发生了以下关键事件API Server接收请求验证YAML合法性并转换为内部对象etcd持久化存储将Pod定义写入/registry/pods/default/nginx调度器介入通过watch机制发现新Pod选择合适节点本例只有control-plane节点更新Pod的nodeName字段kubelet接管监测到属于本节点的Pod通过CRI接口创建容器更新Pod状态为Running我们可以通过以下命令观察etcd中的数据变化# 在控制平面容器内执行 watch -n 1 ETCDCTL_API3 etcdctl \ --endpointshttps://127.0.0.1:2379 \ --cacert/etc/kubernetes/pki/etcd/ca.crt \ --cert/etc/kubernetes/pki/etcd/server.crt \ --key/etc/kubernetes/pki/etcd/server.key \ get /registry/pods/default/nginx -w fields5. 高级调试模拟组件故障理解组件协作的最佳方式就是故意破坏它们让我们模拟API Server不可用的情况# 在控制平面容器内停止API Server docker exec kind-control-plane pkill kube-apiserver # 尝试操作集群会失败 kubectl get pods此时你会看到类似错误The connection to the server 127.0.0.1:16443 was refused但有趣的是已经运行的Pod仍然正常工作——这是因为工作负载不受影响kubelet直接管理容器生命周期控制平面无状态只要etcd存活API Server可随时重启客户端重试机制kubectl会自动重试连接恢复API Server只需重启容器中的进程docker exec kind-control-plane kube-apiserver ...6. 性能优化实战调整etcd参数etcd的性能直接影响整个集群的响应速度。让我们调整一些关键参数# 备份原始manifest docker exec kind-control-plane cp /etc/kubernetes/manifests/etcd.yaml /tmp/ # 编辑etcd配置 docker exec -it kind-control-plane vi /etc/kubernetes/manifests/etcd.yaml在command部分添加以下优化参数- --snapshot-count10000 # 提高快照阈值 - --heartbeat-interval500 # 心跳间隔(ms) - --election-timeout5000 # 选举超时(ms) - --quota-backend-bytes8589934592 # 存储配额8GB保存后kubelet会自动重启etcd容器。我们可以用benchmark测试效果# 安装benchmark工具 go install go.etcd.io/etcd/tools/benchmarklatest # 执行写入测试 benchmark --endpointshttps://127.0.0.1:2379 \ --cacert/etc/kubernetes/pki/etcd/ca.crt \ --cert/etc/kubernetes/pki/etcd/server.crt \ --key/etc/kubernetes/pki/etcd/server.key \ put --total10000 --conns100 --key-size32 --val-size256观察调整前后的TPS每秒事务数变化理解参数对性能的影响。

相关新闻