kubelet + kube-apiserver + etcd - 深入解析

作者:API传播员 · 2025-12-15 · 阅读时间:5分钟
本文深入解析Kubernetes控制平面核心组件kubelet、kube-apiserver和etcd的集成与配置,涵盖从独立模式到API服务器模式的扩展、etcd安装、kube-apiserver启动选项、令牌认证、kubelet注册及Pod创建常见问题解决,帮助读者掌握Kubernetes组件运行机制和Pod管理流程。

kubelet + kube-apiserver + etcd – 深入解析

本文是逐步运行 Kubernetes 组件系列的一部分。在这篇文章中,我们将基于之前的独立模式设置,进一步扩展到包含 API 服务器的模式。API 服务器是 Kubernetes 控制平面的核心组件之一,负责公开 Kubernetes API,并作为控制平面的前端。其主要实现是 kube-apiserver


从独立模式到 API 服务器模式

在独立模式下,kubelet 通过静态 Pod 目录直接管理 Pod 定义文件。而在 API 服务器模式中,kubeletkube-apiserver 进行通信,Pod 的创建和管理将通过 API 服务器完成。

Kubernetes 使用 etcd 存储集群数据。当我们通过 kubectl 创建 Pod 时,首先会与 kube-apiserver 通信,随后将 Pod 定义写入 etcd。此外,Pod 的创建还涉及调度器等其他组件,这部分将在后续文章中详细讨论。


安装和配置 etcd

首先,我们需要安装一个单节点的 etcd 集群并启动它。


安装 kube-apiserver

接下来,我们安装 kube-apiserver。以下是安装步骤:

$ wget https://dl.k8s.io/v1.25.0/bin/linux/amd64/kube-apiserver
$ chmod +x ./kube-apiserver
$ ./kube-apiserver --version
Kubernetes v1.25.0

启动 kube-apiserver 需要传递一些必要的选项,包括证书和密钥对。以下是生成服务账户密钥对的命令:

$ cd /home/opc/k8s/certs
$ openssl genrsa -out service-account-key.pem 4096
$ openssl req -new -x509 -days 365 -key service-account-key.pem -sha256 -out service-account-cert.pem
$ openssl x509 -pubkey -noout -in service-account-cert.pem > service-account-pub.pem
$ ls -all

然后,使用以下命令启动 kube-apiserver

./kube-apiserver --etcd-servers=http://127.0.0.1:2379 
--service-cluster-ip-range=10.0.0.0/16 
--service-account-issuer=https://kubernetes.default.svc.cluster.local 
--service-account-signing-key-file=/home/opc/k8s/certs/service-account-key.pem 
--service-account-key-file=/home/opc/k8s/certs/service-account-pub.pem 
--token-auth-file=/home/opc/k8s/token_auth_file

使用令牌文件进行身份验证

为了安全地连接到 kube-apiserver,我们可以使用令牌认证文件。令牌文件是一个 CSV 文件,至少包含三列:令牌、用户名和用户 UID。以下是示例文件内容:

$ cat token_auth_file
kubeapiserverdummytoken,elie,1000

使用 curl 测试连接:

curl --header "Authorization: Bearer kubeapiserverdummytoken" https://127.0.0.1:6443/api/v1/pods

配置 kubelet 与 kube-apiserver 通信

kubelet 是运行在每个节点上的组件。为了将节点注册到 kube-apiserver,我们需要使用 kubeconfig 选项指定 API 服务器的位置及其连接方式。以下是创建 kubelet.kubeconfig 文件的步骤:

./kubelet --config=/home/opc/k8s/configs/kubeletConfigFile.yaml 
--container-runtime=remote 
--container-runtime-endpoint=unix:///run/cri-dockerd.sock 
--kubeconfig=/home/opc/k8s/configs/kubelet.kubeconfig

通过上述配置,kubelet 将成功注册到 kube-apiserver


创建 Pod 并解决常见问题

kube-apiserver 模式下创建 Pod 时,需要注意以下几点:

  1. 指定节点名称:由于当前环境中未运行调度器,需在 Pod 定义文件中添加 nodeName 属性。例如:

    nodeName: instance-20220803-1159
  2. 禁用服务账户检查:由于未安装 serviceAccount 控制器,需通过 --disable-admission-plugins=ServiceAccount 选项禁用服务账户检查:

    ./kube-apiserver --etcd-servers=http://127.0.0.1:2379 
    --service-cluster-ip-range=10.0.0.0/16 
    --service-account-issuer=https://kubernetes.default.svc.cluster.local 
    --service-account-signing-key-file=/home/opc/k8s/certs/service-account-key.pem 
    --service-account-key-file=/home/opc/k8s/certs/service-account-pub.pem 
    --token-auth-file=/home/opc/k8s/token_auth_file 
    --disable-admission-plugins=ServiceAccount

通过以上配置,Pod 将成功运行。


总结

通过本文,我们成功搭建了 kubelet + kube-apiserver + etcd 的组合环境,并实现了以下功能:

  1. 当向 kube-apiserver 发送 Pod 创建请求时,Pod 定义会被写入 etcd
  2. 如果 Pod 规范中指定了 nodeNamekube-apiserver 会通知对应的 kubelet
  3. kubelet 创建 Pod 后,会将 Pod 状态更新到 kube-apiserver
  4. 最终,kube-apiserver 将信息同步到 etcd

通过这些步骤,我们对 Kubernetes 控制平面的核心组件有了更深入的理解。后续文章将继续探讨 Kubernetes 其他组件的运行机制。

原文链接: https://medium.com/@ElieXU/kubelet-api-server-8e2bdd6a147e