前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >解决 Kubernetes 部署 Metrics Server 无法访问 Apiserver 问题

解决 Kubernetes 部署 Metrics Server 无法访问 Apiserver 问题

作者头像
米开朗基杨
发布于 2021-01-14 07:50:48
发布于 2021-01-14 07:50:48
4.4K00
代码可运行
举报
文章被收录于专栏:云原生实验室云原生实验室
运行总次数:0
代码可运行

前言

系统环境:

  • 部署方式:二进制
  • Docker 版本:19.03.8
  • kubernetes 版本:1.20.1
  • 操作系统版本:CentOS 7.8
  • metrics server 版本:0.4.1

参考地址:

  • 带你玩转 kubernetes-k8s 第 54 篇[1]
  • 二进制方式搭建 Kubernetes 1.19.3 高可用集群(五)部署 dashboard[2]

1. 问题描述

通过二进制方式部署完成 kubernetes 后,部署 Metrics Server 后,查看日志出现下面错误信息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
E1231 10:33:31.978715 1 configmap_cafile_content.go:243] key failed with:
missing content for CA bundle "client-ca::kube-system::extension-apiserver-authentication::requestheader-client-ca-file"
E1231 10:34:22.710836 1 configmap_cafile_content.go:243] kube-system/extension-apiserver-authentication failed with:
missing content for CA bundle "client-ca::kube-system::extension-apiserver-authentication::requestheader-client-ca-file"
E1231 10:34:31.978769 1 configmap_cafile_content.go:243] key failed with:
missing content for CA bundle "client-ca::kube-system::extension-apiserver-authentication::requestheader-client-ca-file"

根据错误日志信息,可以知道是缺少认证的证书文件,导致不能访问 kube-apiserver 而出现的问题。

2. 问题分析

查找资料分析原因

经过网上查找搜寻,从一篇博客中 https://www.lingjie.tech/article/2020-11-07/20 找到答案。之所以出现这个错误是因为 kube-apiserver 没有开启 API 聚合功能。所以需要配置 kube-apiserver 参数,开启聚合功能即可。

什么是 API 聚合

这里的 API 聚合机制 是 Kubernetes 1.7 版本引入的特性,能够将用户扩展的 API 注册到 kube-apiserver 上,仍然通过 API ServerHTTP URL 对新的 API 进行访问和操作。为了实现这个机制,Kubernetes 在 kube-apiserver 服务中引入了一个 API 聚合层(API Aggregation Layer),用于将 扩展 API 的访问请求转发到用户服务的功能。

为了能够将用户自定义的 API 注册到 MasterAPI Server 中,首先需要在 Master 节点所在服务器,配置 kube-apiserver 应用的启动参数来启用 API 聚合 功能,参数如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
--runtime-config=api/all=true
--requestheader-allowed-names=aggregator
--requestheader-group-headers=X-Remote-Group
--requestheader-username-headers=X-Remote-User
--requestheader-extra-headers-prefix=X-Remote-Extra-
--requestheader-client-ca-file=/etc/kubernetes/pki/ca.pem
--proxy-client-cert-file=/etc/kubernetes/pki/proxy-client.pem
--proxy-client-key-file=/etc/kubernetes/pki/proxy-client-key.pem

如果 kube-apiserver 所在的主机上没有运行 kube-proxy,即无法通过服务的 ClusterIP 进行访问,那么还需要设置以下启动参数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
--enable-aggregator-routing=true

在设置完成重启 kube-apiserver 服务,就启用 API 聚合 功能了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ systemctl daemon-reload && systemctl restart kube-apiserver

3. 解决问题

按照上面的解决问题思路,我们可以开启 API 聚合功能,然后重启 Metrics Server 服务,步骤如下:

安装 cfssl 工具

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## 下载三个组件
$ wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -O cfssl
$ wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64  -O cfssljson
$ wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64  -O cfssl-certinfo

## 复制到 bin 目录下
$ chmod +x ./cfssl*
$ mv ./cfssl* /usr/local/bin/

创建 cfssl 配置文件

创建 proxy-client-csr.json 文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "CN": "aggregator",
  "hosts": [],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "BeiJing",
      "L": "BeiJing",
      "O": "system:masters",
      "OU": "System"
    }
  ]
}

生成证书和秘钥:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## Master1 执行下面命令生成证书
$ cfssl gencert \
  -profile=kubernetes \
  -ca=/etc/kubernetes/pki/ca.pem \
  -ca-key=/etc/kubernetes/pki/ca-key.pem \
  proxy-client-csr.json

查看生产的证书:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ ls -l

-rw-r--r-- 1 root root 1017 1231 11:20 proxy-client.csr
-rw-r--r-- 1 root root  236 1231 11:07 proxy-client-csr.json
-rw------- 1 root root 1675 1231 11:20 proxy-client-key.pem
-rw-r--r-- 1 root root 1411 1231 11:20 proxy-client.pem

将证书访问指定的目录下,这里我将其放到 /etc/kubernetes/pki 下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ cp * /etc/kubernetes/pki/

复制到其它 Master 节点服务器中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## 复制到 Master2
$ scp * 192.168.2.11:/etc/kubernetes/pki/
## 复制到 Master3
$ scp * 192.168.2.12:/etc/kubernetes/pki/

修改 kube-apiserver 参数

修改三个 Master 节点中全部 kube-apiserver 配置参数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
vi /etc/kubernetes/manifests/kube-apiserver.yaml
...
--runtime-config=api/all=true \
--requestheader-allowed-names=aggregator \
--requestheader-group-headers=X-Remote-Group \
--requestheader-username-headers=X-Remote-User \
--requestheader-extra-headers-prefix=X-Remote-Extra- \
--requestheader-client-ca-file=/etc/kubernetes/pki/ca.pem \
--proxy-client-cert-file=/etc/kubernetes/pki/proxy-client.pem \
--proxy-client-key-file=/etc/kubernetes/pki/proxy-client-key.pem \
...

参数说明:

  • –requestheader-client-ca-file: 客户端 CA 证书。
  • –requestheader-allowed-names: 允许访问的客户端 common names 列表,通过 header 中 –requestheader-username-headers 参数指定的字段获取。客户端 common names 的名称需要在 client-ca-file 中进行设置,将其设置为空值时,表示任意客户端都可访问。
  • –requestheader-username-headers: 参数指定的字段获取。
  • –requestheader-extra-headers-prefix: 请求头中需要检查的前缀名。
  • –requestheader-group-headers 请求头中需要检查的组名。
  • –requestheader-username-headers 请求头中需要检查的用户名。
  • –proxy-client-cert-file: 在请求期间验证 Aggregator 的客户端 CA 证书。
  • –proxy-client-key-file: 在请求期间验证 Aggregator 的客户端私钥。
  • –requestheader-allowed-names: 允许访问的客户端 common names 列表,通过 header 中 –requestheader-username-headers 参数指定的字段获取。客户端 common names 的名称需要在 client-ca-file 中进行设置,将其设置为空值时,表示任意客户端都可访问。

重启 kube-apiserver 组件

重启三个 Master 服务器中全部 kube-apiserver 组件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ systemctl daemon-reload && systemctl restart kube-apiserver

重启 Metrics Server 应用

查看已有的 metrics server 的 pod:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ kubectl get pods -n kube-system | grep metrics-server

metrics-server-7455879dcc-w9dw7   1/1   Running   0   1d

删掉已有的 metrics server 的 pod,使其重新生成新的 pod 资源:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ kubectl delete pods metrics-server-7455879dcc-w9dw7 -n kube-system

输入命令进行验证

等一段时间,然后输入下面命令进行测试:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@k8s-cluster-master-0040 ~]# kubectl top node
NAME                    CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
k8s-master-10     300m         3%     4788Mi          30%
k8s-master-11     800m         5%     5218Mi          31%
k8s-master-12     500m         4%     4900Mi          31%
k8s-woker-021     81m          1%     2930Mi          9%
k8s-woker-022     61m          0%     1658Mi          5%
k8s-woker-023     62m          0%     6061Mi          22%

可以观察到命令已经可以正常使用。

参考资料

[1]

带你玩转 kubernetes-k8s 第 54 篇: https://blog.csdn.net/qq_31136839/article/details/100183026

[2]

二进制方式搭建 Kubernetes 1.19.3 高可用集群(五)部署 dashboard: https://www.lingjie.tech/article/2020-11-07/20

原文链接:http://www.mydlq.club/article/102/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云原生实验室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
RxJava系列番外篇:一个RxJava解决复杂业务逻辑的案例
之前写过一系列RxJava1的文章,也承诺过会尽快有RxJava2的介绍。无奈实际项目中还未真正的使用RxJava2,不敢妄动笔墨。所以这次还是给大家分享一个使用RxJava1解决问题的案例,希望对大家在使用RxJava的时候有一点点启发。对RxJava还不了解的同学可以先去看看我之前的RxJava系列文章: RxJava系列1(简介) RxJava系列2(基本概念及使用介绍) RxJava系列3(转换操作符) RxJava系列4(过滤操作符) RxJava系列5(组合操作符) RxJava系列6(从
张磊BARON
2018/04/13
1.4K0
RxJava系列番外篇:一个RxJava解决复杂业务逻辑的案例
RxJava(三) flatMap 操作符用法详解
还是以上一篇map操作符的例子吧,如果对 map操作符 不是很了解的,可以看看我之前的文章。
全栈程序员站长
2022/09/05
1.8K0
RxJava从入门到不离不弃(一)——基本概念和使用
RxJava的编程思想已经在Android开发者中变得越来越流行。有个不好的点就是上手不太容易,尤其是大部分人之前都是使用命令式编程语言。
蜻蜓队长
2018/08/03
7920
RxJava从入门到不离不弃(一)——基本概念和使用
【译】对RxJava中-repeatWhen()和-retryWhen()操作符的思考
第一次见到.repeatWhen()和.retryWhen()这两个操作符的时候就非常困惑了。不得不说,它们绝对是“最令人困惑弹珠图”的有力角逐者。
用户1740424
2018/07/23
2.1K0
【译】对RxJava中-repeatWhen()和-retryWhen()操作符的思考
【译】使用RxJava代替EventBus类库
如今的Android社区,人人都在讨论RxJava以及为什么我们应该在项目中使用RxJava。当我们开始在Android项目中使用RxJava的时候,就已经意识到了,我们的代码库可以不再需要Otto了(或其他事件总线类库)。
用户1740424
2018/07/23
4430
【译】使用RxJava代替EventBus类库
【译】RxJava变换操作符:-concatMap(-)与-flatMap(-)的比较
是时候回归写作了。(译者注:原作者吧啦吧啦唠家常,这里就不做翻译了,但是,有两个重要的链接,点我,再点我)
用户1740424
2018/07/23
8240
【译】RxJava变换操作符:-concatMap(-)与-flatMap(-)的比较
RxAndroid从零开始学之五(常见操作符与三级缓存)
RxAndroid的操作符有很多,本以为写了上一节的一些基本的Operator就可以正常编写代码了,但是后来在github上看googlesample,发现了一些另外的Operator。那么本文就继续介绍这些operator并加上自己的一些理解。
Frank909
2019/01/14
6350
【译】使用RxJava实现延迟订阅
我越来越喜欢把RxJava的defer()操作符作为一个工具来使用,以确保Observable代码在被订阅后才执行(而不是创建后立即执行)。我之前写过一些有关defer()的代码,但是,现在我想做更详细的描述。
用户1740424
2018/07/23
8390
【译】使用RxJava实现延迟订阅
【译】避免打断链式结构:使用.compose( )操作符
*[Chains break by the weakest link](https://www.flickr.com/photos/hernanpc/7115374283)*
小鄧子
2018/08/20
6610
RxJava简析
rxjava文档地址https://mcxiaoke.gitbooks.io/rxdocs/content/ 这个是中文版的
用户3112896
2020/11/25
7350
Android RxJava 实战系列:从磁盘 / 内存缓存中 获取缓存数据
Carson_Ho的Github地址 = RxJava2实战系列:从磁盘 / 内存缓存中 获取缓存数据
Carson.Ho
2019/02/22
2K0
Android应用架构
来源: 小鄧子(@Rx小鄧子) Android开发生态圈的节奏非常之快。每周都会有新的工具诞生,类库的更新,博客的发表以及技术探讨。如果你外出度假一个月,当你回来的时候可能已经发布了新版本的Support Library或者Play Services 我与Ribot Team一起做Android应用已经超过三年了。这段时间,我们所构建的Android应用架构和技术也在不断地演变。本文将向您阐述我们的经验,错误以及架构变化背后的原因。 曾经的架构 追溯到2012年我们的代码库使用的是基本结构,那个时候我们没有
编程范 源代码公司
2018/04/16
1.3K0
Android应用架构
【译】RxJava中的事件广播
如果你想多点传播一个事件,也就是向所有的下游操作符或订阅者发送同一个事件。这在做耗时操作如网络请求等场景来讲是非常有用的。你不需要为每个订阅者做重复的网络请求,只需执行一次,然后传播响应结果即可。
用户1740424
2018/07/23
8270
【译】RxJava中的事件广播
RxJava三问—基础知识点回顾
然后开始提问题了,Rxjava涉及的内容很多,我还是会以三个问题为单位,从易到难,一篇篇的说下去,今天的三问是:
码上积木
2020/12/11
6280
Android RxJava应用:合并数据源
Rxjava由于其基于事件流的链式调用、逻辑简洁 & 使用简单的特点,深受各大 Android开发者的欢迎。
Carson.Ho
2022/03/25
7940
Android RxJava应用:合并数据源
大佬们,一波RxJava 3.0来袭,请做好准备~
每个Android开发者,都是爱RxJava的,简洁线程切换和多网络请求合并,再配合Retrofit,简直是APP开发的福音。不知不觉,RxJava一路走来,已经更新到第三大版本了。不像RxJava 2对RxJava 1那么残忍,RxJava 3对RxJava 2的兼容性还是挺好的,目前并没有做出很大的更改。RxJava2到2020年12月31号不再提供支持,错误时同时在2.x和3.x修复,但新功能只会在3.x上添加。
Rouse
2019/07/17
1.9K0
大佬们,一波RxJava 3.0来袭,请做好准备~
一篇博客让你了解RxJava
RxJava可以说是2016年最流行的项目之一了,最近也接触了一下RxJava,于是想写一篇博客,希望能通过这篇博客让大家能对其进行了解,本篇博客是基于RxJava2.0,跟RxJava1.0还是有很多不同的
老马的编程之旅
2022/06/22
5440
一篇博客让你了解RxJava
【译】RxJava中的事件广播
如果你想多点传播一个事件,也就是向所有的下游操作符或订阅者发送同一个事件。这在做耗时操作如网络请求等场景来讲是非常有用的。你不需要为每个订阅者做重复的网络请求,只需执行一次,然后传播响应结果即可。
小鄧子
2018/08/20
5980
【译】RxJava中的事件广播
Android RxJava 实战讲解:合并数据源 & 同时展示数据
前言 Rxjava,由于其基于事件流的链式调用、逻辑简洁 & 使用简单的特点,深受各大 Android开发者的欢迎。 如果还不了解RxJava,请看文章:Android:这是一篇 清晰 & 易懂的R
Carson.Ho
2019/02/22
3.6K2
RxJava 2.0还没熟悉,RxJava 3.0说来就来了!(多种操作符代码详解篇)
在上篇文章中讲的是关于Rxjava的基础篇,今天来讲讲多种操作符的具体内容,操作符太多了,大家准备好啊,耐心看~
Android技术干货分享
2019/07/19
2.2K0
RxJava 2.0还没熟悉,RxJava 3.0说来就来了!(多种操作符代码详解篇)
推荐阅读
相关推荐
RxJava系列番外篇:一个RxJava解决复杂业务逻辑的案例
更多 >
LV.1
腾讯科技(深圳)有限公司客户端开发
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档