kubelet + kube-apiserver + etcd - 深入解析
kubelet + kube-apiserver + etcd – 深入解析
本文是逐步运行 Kubernetes 组件系列的一部分。在这篇文章中,我们将基于之前的独立模式设置,进一步扩展到包含 API 服务器的模式。API 服务器是 Kubernetes 控制平面的核心组件之一,负责公开 Kubernetes API,并作为控制平面的前端。其主要实现是 kube-apiserver。
从独立模式到 API 服务器模式
在独立模式下,kubelet 通过静态 Pod 目录直接管理 Pod 定义文件。而在 API 服务器模式中,kubelet 与 kube-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 时,需要注意以下几点:
-
指定节点名称:由于当前环境中未运行调度器,需在 Pod 定义文件中添加
nodeName属性。例如:nodeName: instance-20220803-1159 -
禁用服务账户检查:由于未安装
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 的组合环境,并实现了以下功能:
- 当向
kube-apiserver发送 Pod 创建请求时,Pod 定义会被写入etcd。 - 如果 Pod 规范中指定了
nodeName,kube-apiserver会通知对应的kubelet。 kubelet创建 Pod 后,会将 Pod 状态更新到kube-apiserver。- 最终,
kube-apiserver将信息同步到etcd。
通过这些步骤,我们对 Kubernetes 控制平面的核心组件有了更深入的理解。后续文章将继续探讨 Kubernetes 其他组件的运行机制。
原文链接: https://medium.com/@ElieXU/kubelet-api-server-8e2bdd6a147e