《Kubernetes知识篇(二):Kube-apiserver原理分析》

本文深入介绍了kube-apiserver的功能特性,包括其作为Kubernetes核心组件的角色,以及工作原理。同时,展示了如何通过curl命令访问kube-apiserver,并提到了RESTAPI的使用,强调了安全接口的重要性。此外,还指导了如何利用kubectl查询Kubernetes API资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



一、kube-apiserver功能特性

如下图所示:
在这里插入图片描述


二、kube-apiserver工作原理图

如下图所示:
在这里插入图片描述


三、API 访问

curl方式

#查看apiserver地址
APISERVER=$(kubectl config view | grep server | awk '{print $2,$3}')

#查看token地址
TOKEN=$(kubectl describe secret $(kubectl get secrets | grep default | cut -f1 -d ' ')| grep -E '^token'| cut -f2 -d':'| tr -d '\t')

#执行curl命令
curl $APISERVER/api --header "Authorization: Bearer $TOKEN" --insecure

如下图所示:
在这里插入图片描述


四、REST API

kube-apiserver 支持同时提供 https(默认监听在 6443 端口)和 http API(默认监听在 127.0.0.1 的 8080 端口),其中 http API 是非安全接口,不做任何认证授权机制,不建议生产环境启用。两个接口提供的 REST API 格式相同,参考 Kubernetes API Reference 查看所有 API 的调用格式。

在这里插入图片描述
在实际使用中,通常通过 kubectl 来访问 apiserver,也可以通过 Kubernetes 各个语言的 client 库来访问 apiserver。在使用 kubectl 时,打开调试日志也可以看到每个 API 调用的格式,比如

kubectl --v=8 get pods

可通过 kubectl api-versions 和 kubectl api-resources 查询 Kubernetes API 支持的 API 版本以及资源对象。
如下图所示:
在这里插入图片描述

总结:整理不易,如果对你有帮助,可否点赞关注一下?

更多详细内容请参考:企业级K8s集群运维实战

apiserver配置文件 KUBE_APISERVER_OPTS="--logtostderr=true \$ --v=4 \$ --etcd-servers=https://192.168.106.141:2379,https://192.168.106.142:2379,https://192.168.106.143:2379 \$ --bind-address=192.168.106.141 \$ --secure-port=6443 \$ --advertise-address=192.168.106.141 \$ --allow-privileged=true \$ --service-cluster-ip-range=10.0.0.0/24 \$ --enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,ResourceQuota,NodeRestriction \$ --authorization-mode=RBAC,Node \$ --enable-bootstrap-token-auth \$ --token-auth-file=/opt/kubernetes/cfg/token.csv \$ --service-node-port-range=30000-50000 \ $ --tls-cert-file=/opt/kubernetes/ssl/server.pem \$ --tls-private-key-file=/opt/kubernetes/ssl/server-key.pem \$ --client-ca-file=/opt/kubernetes/ssl/ca.pem \$ --service-account-key-file=/opt/kubernetes/ssl/ca-key.pem \$ --etcd-cafile=/opt/etcd/ssl/ca.pem \$ --etcd-certfile=/opt/etcd/ssl/server.pem \$ --etcd-keyfile=/opt/etcd/ssl/server-key.pem"$ 但是无法启动 提示Jul 22 18:42:13 bogon kube-apiserver: --logtostderr log to standard error instead of files (default true) Jul 22 18:42:13 bogon kube-apiserver: error: --etcd-servers must be specified Jul 22 18:42:13 bogon kube-apiserver: --alsologtostderr log to standard error as well as files Jul 22 18:42:13 bogon kube-apiserver: --logtostderr log to standard error instead of files (default true) Jul 22 18:42:13 bogon kube-apiserver: error: --etcd-servers must be specified Jul 22 18:42:13 bogon kube-apiserver: --alsologtostderr log to standard error as well as files Jul 22 18:42:13 bogon kube-apiserver: --logtostderr log to standard error instead of files (default true) Jul 22 18:42:13 bogon kube-apiserver: error: --etcd-servers must be specified
最新发布
07-23
<think>我们正在处理用户关于kube-apiserver启动失败的问题,错误信息为“error: --etcd-servers must be specified”。根据引用内容,我们知道kube-apiserver需要连接到etcd服务器存储集群数据。因此,这个错误表明在启动kube-apiserver时没有正确指定etcd服务器的地址。 解决方案步骤: 1. 确认etcd服务状态:首先确保etcd服务已经启动并正常运行。可以使用`systemctl status etcd`(如果使用systemd)或检查etcd的日志来确认。 2. 检查etcd监听地址:根据引用[4],曾经出现过因为etcd没有监听127.0.0.1:2379而导致连接被拒绝的问题。因此,需要确认etcd的配置(通常是/etc/etcd/etcd.conf)中的`ETCD_LISTEN_CLIENT_URLS`参数是否包含了kube-apiserver将要连接的地址(比如127.0.0.1:2379或者特定的IP地址)。 3. 配置kube-apiserver的启动参数:在kube-apiserver的启动命令或配置文件中,必须明确指定etcd服务器的地址。例如,如果etcd运行在本机的默认端口(2379),则添加`--etcd-servers=http://127.0.0.1:2379`。如果有多个etcd实例,则用逗号分隔。 具体操作: - 如果使用systemd管理kube-apiserver,编辑kube-apiserver的service文件(如/etc/systemd/system/kube-apiserver.service),在ExecStart命令中添加`--etcd-servers`参数。 - 如果是直接使用命令行启动,确保在命令行中包含该参数。 示例service文件片段: ``` ExecStart=/usr/local/bin/kube-apiserver \ --etcd-servers=http://127.0.0.1:2379 \ ...其他参数... ``` 4. 重启服务:修改配置后,重新加载systemd配置并重启服务: ``` sudo systemctl daemon-reload sudo systemctl restart kube-apiserver ``` 5. 验证:使用`systemctl status kube-apiserver`查看服务状态,或者通过日志`journalctl -u kube-apiserver`来确认是否启动成功。 注意:如果etcd服务器不在本地,或者使用了TLS加密,那么需要相应地调整地址和添加证书参数(如`--etcd-cafile`, `--etcd-certfile`, `--etcd-keyfile`)。但根据错误信息,当前问题只是未指定etcd服务器地址,因此先确保指定了正确的地址。 引用分析- 引用[1]提到kube-apiserver将配置存储到etcd server,因此连接etcd是必须的。 - 引用[4]提供了一个类似问题的案例,即etcd监听地址配置不正确导致连接被拒绝,但当前错误是未指定etcd服务器,所以核心问题还是启动参数中缺少`--etcd-servers`。 因此,解决这个问题的关键是确保在启动kube-apiserver时通过`--etcd-servers`参数指定etcd服务器的地址。</think>### Kubernetes API Server 启动失败:`--etcd-servers must be specified` 解决方案 此错误表明 kube-apiserver 无法连接到 etcd 数据存储,通常由以下原因导致: #### 🔧 核心解决步骤 1. **检查启动参数配置** - 确认 kube-apiserver 启动命令包含有效的 etcd 地址: ```bash ps -ef | grep kube-apiserver | grep etcd-servers ``` - 正确格式示例: ``` --etcd-servers=http://<etcd-ip>:2379 # 单节点 --etcd-servers=https://etcd1:2379,https://etcd2:2379,https://etcd3:2379 # 集群 ``` 2. **验证 etcd 服务状态** ```bash # 检查 etcd 是否运行 systemctl status etcd # 测试 etcd 连接性 ETCDCTL_API=3 etcdctl --endpoints=http://<etcd-ip>:2379 endpoint status ``` 3. **修复配置问题** - **Systemd 服务文件**(`/etc/systemd/system/kube-apiserver.service`): ```ini [Service] ExecStart=/usr/bin/kube-apiserver \ --etcd-servers=http://192.168.1.100:2379 \ # 替换为实际ETCD地址 ...其他参数... ``` - **kubeadm 集群**:修改 `/etc/kubernetes/manifests/kube-apiserver.yaml` ```yaml spec: containers: - command: - kube-apiserver - --etcd-servers=https://etcd-cluster:2379 # 确保此项存在 ``` 4. **应用配置并重启** ```bash systemctl daemon-reload systemctl restart kube-apiserver journalctl -u kube-apiserver -f # 查看实时日志 ``` #### ⚠️ 常见陷阱排查 1. **etcd 监听地址不匹配** 确保 etcd 配置的 `ETCD_LISTEN_CLIENT_URLS` 包含 kube-apiserver 使用的地址(引用[4]): ```ini # /etc/etcd/etcd.conf ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379" # 允许所有IP连接 ``` 2. **TLS 证书问题**(当使用 HTTPS 时) - 检查证书路径是否正确: ``` --etcd-cafile=/etc/kubernetes/pki/etcd/ca.crt --etcd-certfile=/etc/kubernetes/pki/apiserver-etcd-client.crt --etcd-keyfile=/etc/kubernetes/pki/apiserver-etcd-client.key ``` - 确保证书由相同 CA 签发(引用[2]) 3. **网络连通性问题** ```bash # 从 API Server 节点测试连接 telnet <etcd-ip> 2379 curl http://<etcd-ip>:2379/version ``` #### 📌 设计原理说明 kube-apiserver 依赖 etcd 作为唯一持久化存储,所有集群状态(Pods、Services 等)都存储在 etcd 中。启动时未指定 `--etcd-servers` 会导致 API Server 无法初始化存储后端,这是 Kubernetes 架构的核心设计(引用[1][3])。 > **架构提示**:kube-apiserver 在 Master 节点启动时,会通过 `CreateServerChain()` 初始化与 etcd 的连接(引用[3]),此阶段必须验证 etcd 可用性。 --- ### 相关问题 1. 当 kube-apiserver 报错 `connection refused` 连接 etcd 失败时,如何分步骤诊断网络问题? 2. 在 Kubernetes 高可用集群中,如何为 kube-apiserver 配置多 etcd 节点实现故障转移? 3. 如何为 kube-apiserver 和 etcd 的 HTTPS 通信生成和配置 TLS 证书? 4. kube-apiserver 启动过程中 `CreateServerChain()` 函数具体执行了哪些初始化操作?(引用[3])
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东城绝神

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值