kubernetes核心之kube-apiserver剖析

本文介绍了Kubernetes中apiserver如何使用go-restful框架提供RESTful服务,包括Container、WebService和Route的概念,以及gRPC框架的高效特性,如ProtocolBuffers序列化和HTTP/2协议的利用。同时,概述了kube-apiserver的命令行启动流程。

流程

  • 我们首先用一次简单的pod创建流程来演示apiserver是如何运行的
    在这里插入图片描述

go-restful原理

  • rest是现代客户端应用程序通过http协议与http server进行通信的机制,也是目前最流程的API设计规范,它支持基本的CRUD操作,具体规范就是用GET请求查询,用POST请求创建,用PUT请求修改,用DELETE请求删除
  • Kubernetes选择了使用go-restful框架,这种框架支持多个Container,每个Container都相当于一个http server,不同的Container之间检控不同的地址和端口,对外提供不同的http服务,每个Container可以包含多个WebService,WebService相当于一组不同服务的分类,每个WebService下面又包含了多个Router,Router根据http请求的URL路由到对应的处理函数(Handler Func)
    在这里插入图片描述

github.com/emicklei/go-restful@v2.9.5+incompatible/container.go

// Find best match Route ; err is non nil if no match was found
var webService *WebService
var route *Route
var err error
func() {
  c.webServicesLock.RLock()
  defer c.webServicesLock.RUnlock()
  webService, route, err = c.router.SelectRoute(
    c.webServices,
    httpRequest)
}()
...
route.Function(wrappedRequest, wrappedResponse)
...

gRPC框架

  • gRPC是Google开发的RPC服务,分为两部分,RPC框架和数据序列化框架
  • gPRC是一个超快速、超高效的RPC服务,可以在许多主流的编程语言、平台、框架中轻松创建高性能、可扩展的API和微服务
  • gRPC默认使用Protocol Buffers作为IDL(Interface Description Language)语言,Protocol Buffers,简称Protobuf,是一种高性能的开源二进制序列化协议,可以轻松定义服务并自动生成客户端库,主要用于结构化数据的序列化和反序列化
  • gRPC基于HTTP/2协议标准实现,它复用了很多HTTP/2的特性,例如双向流、流控制、报头压缩,以及通过单个TCP连接的多路复用请求等

命令行参数

https://kubernetes.io/zh-cn/docs/reference/command-line-tools-reference/kube-apiserver/

启动流程

在这里插入图片描述

<think>我们正在处理的问题是:当执行 `sudo systemctl start kube-apiserver` 时出现错误提示 `Unit kube-apiserver.service not found`。根据引用[1]和引用[3]的信息,这可能是因为在安装Kubernetes时,kube-apiserver服务没有被正确安装或配置。 原因分析: 1. 在Kubernetes中,kube-apiserver通常是以静态Pod的方式运行,尤其是在使用kubeadm部署的集群中。因此,它可能没有作为systemd服务安装。 2. 如果你使用kubeadm初始化集群,那么kube-apiserver的Pod应该由kubelet管理,其配置文件位于`/etc/kubernetes/manifests/kube-apiserver.yaml`。而systemd服务中并没有`kube-apiserver.service`这个单元,所以使用systemctl启动会报错。 解决方案: 步骤1:检查kube-apiserver是否以静态Pod方式运行 - 查看kube-apiserver的Pod是否存在: ```bash kubectl get pods -n kube-system | grep kube-apiserver ``` 或者,如果kubectl命令不可用,直接检查静态Pod的配置目录: ```bash ls /etc/kubernetes/manifests/ ``` 你应该能看到`kube-apiserver.yaml`文件。 步骤2:如果静态Pod配置文件存在,则重启kubelet服务 - 静态Pod由kubelet管理,因此重启kubelet会重新创建静态Pod: ```bash sudo systemctl restart kubelet ``` 步骤3:检查kube-apiserver的Pod状态 - 等待片刻,然后查看Pod状态: ```bash kubectl get pods -n kube-system ``` 如果kube-apiserver的Pod没有运行,检查其日志: ```bash kubectl logs -n kube-system kube-apiserver-<node-name> --tail=50 ``` 注意:将`<node-name>`替换为你的节点名称。 步骤4:如果静态Pod配置文件不存在,可能是kubeadm安装不完整 - 重新初始化集群(注意:这会重置集群): 根据引用[3]提供的命令,重置当前节点: ```bash kubeadm reset rm -rf /etc/cni/ ``` 然后重新初始化: ```bash kubeadm init --kubernetes-version=v1.17.17 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/16 --ignore-preflight-errors=Swap ``` 注意:版本号可以根据需要调整。 步骤5:安装完成后,设置kubectl配置 - 按照初始化成功后的提示,执行: ```bash mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config ``` 步骤6:安装网络插件(如flannel) - 执行: ```bash kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml ``` 注意:如果在初始化过程中遇到问题,请检查kubelet的日志: ```bash journalctl -xeu kubelet ``` 另外,根据引用[2]提到,建议使用1.23以下版本的Kubernetes。如果你安装的版本过高,可能会遇到兼容性问题。 如果以上步骤不能解决问题,可能需要检查: - 是否安装了正确版本的kubeadm、kubelet和kubectl(引用[2])。 - 节点上的Docker是否正常运行(引用[5]提到Docker服务启动问题,可通过`curl -sSL https://get.docker.com/ | sh`安装)。 - 系统配置,例如cgroup驱动是否匹配(引用[4]提到修改为cgroupfs)。 建议: - 在重新初始化之前,确保系统配置满足Kubernetes的要求(关闭swap,检查网络等)。 相关问题: §§相关问题§§ 1. 如何正确安装kubeadm、kubelet和kubectl特定版本? 2. 如何配置Kubernetes集群的cgroup驱动? 3. 使用kubeadm重置集群的步骤是什么? </think>### 解决 `Failed to start kube-apiserver.service: Unit not found` 错误 此错误表明系统找不到 kube-apiserver 服务单元文件,通常由安装不完整或配置错误导致。以下是具体解决步骤: --- ### 原因分析 1. **kube-apiserver 未安装** Kubernetes 控制平面组件未完整安装 2. **服务单元文件缺失** `/etc/systemd/system/` 中缺少服务定义文件 3. **初始化失败** `kubeadm init` 执行不完整或失败 --- ### 解决步骤 #### 步骤 1:验证组件安装 检查是否安装了必要的控制平面组件: ```bash # 检查 kubelet 状态(核心服务) sudo systemctl status kubelet # 验证 kubeadm 版本 kubeadm version ``` 若未安装,按引用[2]安装指定版本: ```bash sudo apt-get install -y kubelet=1.20.2-00 kubeadm=1.20.2-00 kubectl=1.20.2-00 sudo systemctl enable --now kubelet ``` #### 步骤 2:创建 kube-apiserver 服务单元 手动创建服务文件: ```bash sudo tee /etc/systemd/system/kube-apiserver.service <<EOF [Unit] Description=Kubernetes API Server Documentation=https://github.com/kubernetes/kubernetes [Service] ExecStart=/usr/bin/kube-apiserver \\ --advertise-address=$(hostname -I | awk '{print $1}') \\ --allow-privileged=true \\ --authorization-mode=Node,RBAC \\ --client-ca-file=/etc/kubernetes/pki/ca.crt \\ --enable-admission-plugins=NodeRestriction \\ --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 \\ --etcd-servers=https://127.0.0.1:2379 \\ --kubelet-client-certificate=/etc/kubernetes/pki/apiserver-kubelet-client.crt \\ --kubelet-client-key=/etc/kubernetes/pki/apiserver-kubelet-client.key \\ --service-account-key-file=/etc/kubernetes/pki/sa.pub \\ --service-cluster-ip-range=10.96.0.0/12 \\ --tls-cert-file=/etc/kubernetes/pki/apiserver.crt \\ --tls-private-key-file=/etc/kubernetes/pki/apiserver.key Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target EOF ``` #### 步骤 3:重新初始化集群 执行完整重置和初始化: ```bash # 清理旧配置(引用[3]) sudo kubeadm reset -f sudo rm -rf /etc/kubernetes /var/lib/etcd $HOME/.kube sudo iptables -F # 初始化集群(引用[3]) sudo kubeadm init \ --kubernetes-version=v1.20.2 \ --pod-network-cidr=10.244.0.0/16 \ --ignore-preflight-errors=Swap # 配置kubectl mkdir -p $HOME/.kube sudo cp /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config ``` #### 步骤 4:启动服务 ```bash # 重载systemd配置 sudo systemctl daemon-reload # 启动API服务器 sudo systemctl start kube-apiserver # 设置开机自启 sudo systemctl enable kube-apiserver # 验证状态 sudo systemctl status kube-apiserver ``` #### 步骤 5:解决依赖问题 若提示 Docker 未安装(引用[5]): ```bash curl -fsSL https://get.docker.com | sudo sh sudo systemctl enable --now docker ``` 若 cgroup 驱动不匹配(引用[4]): ```bash # 修改kubelet配置 sudo sed -i 's/systemd/cgroupfs/g' /etc/systemd/system/kubelet.service.d/10-kubeadm.conf sudo systemctl daemon-reload sudo systemctl restart kubelet ``` --- ### 验证安装 ```bash # 检查API服务器状态 kubectl cluster-info # 查看节点状态 kubectl get nodes ``` 正常输出应显示 `control-plane` 节点为 `Ready` 状态 --- ### 常见问题处理 | 错误现象 | 解决方案 | |---------|---------| | `etcd` 连接失败 | 检查 `/etc/kubernetes/manifests/etcd.yaml` 证书路径 | | 证书签名错误 | 执行 `sudo kubeadm init phase certs all` 重新生成证书 | | 端口占用冲突 | 检查 `netstat -tulnp | grep 6443` 并释放端口 | > **重要提示**:生产环境建议使用更高版本 Kubernetes (≥1.25),但需注意容器运行时改为 containerd(需额外配置)[^2] ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Clarence Liu

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

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

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

打赏作者

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

抵扣说明:

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

余额充值