tke/eks集群引用secret异常

2021-04-12 17:21:29 浏览数 (1)

最近有收到小伙伴的一些关于eks或者tke集群使用的一些问题,具体的问题是这样的

  • eks集群的pod配置日志采集到cls,但是cls无法检索到日志
  • tke集群ingress同步规则到clb失败,ingress事件报错The length of CertificateId 'xxxxxxhiQXI=' is not valid

首先我们来分别分析下这2个问题是什么原因导致的,解决方案是什么,这里和secret又有什么联系呢?

第一个问题分析

  1. 首先看下pod内的日志是否有正常产生,这里看了下是有正常写日志的
  2. 看下cls主题索引是否开启,检查了主题是开启的
  3. 查看pod的cls采集配置是否正常,这里是在控制台配置的,通过引用一个secret里面的账号的SecretId和SecretKey去访问cls,yaml文件看配置都是正常的
  4. 检查账号是否有访问cls的权限,这里账号cam是有权限的

到这里就有点迷茫了,配置没问题,权限也ok,为什么日志没有到cls呢,其实这里我们忽略了一步,那就是没有检查SecretId和SecretKey的值是否准确,我们只是检查了pod的yaml中ENV环境变量SecretId和SecretKey是否有正常引用而已。

那么接下来我们去检查下secret里面,如果secret里SecretId和SecretKey的值都是正确的,那就是组件出问题了,这个时候就需要找腾讯云工程师排查了。

这里控制台或者kubectl查看下对应的secret的yaml,然后查看SecretId和SecretKey的值,因为secret默认会进行base64编码,所以我们看到内容是编码后的,这里我们用下面命令解码。

代码语言:javascript复制
$ echo "" | base64 -d

解码后发现SecretId和SecretKey的值和正常的不一样,解码后的值像是经过base64编码,这里于是将解码后值再base64解码一次,才是正确的值,那么这里的问题就明确了,导致cls无法检索到日志是因为引用的secret配置的账号SecretId和SecretKey不正确导致,SecretId和SecretKey对应的值base64编码了2次。为什么会编码2次呢?后面我们再统一总结,先分析下第二个问题。

第二个问题分析

  1. 首先查看ingress事件,看了下ingress事件报错The length of CertificateId 'xxxxxxhiQXI=' is not valid
  2. 查看ingress的yaml,这里用的了证书,肯定是配置了https,看下证书对应的secret是哪个
  3. 控制台或者kubectl查看ingress里面引用的secret,然后找到qcloud_cert_id字段对应的值,检查证书id是否正确

这里我们还是和上面一样,通过命令base64解码qcloud_cert_id的值,发现解码后的值也是base64编码过的,这边再base64解码一次才获取到了正确的证书id,那么这里为什么会base64编码2次呢?

分析总结

上面2个问题,我们都简要分析了下,其实产生问题的原因,就是secret里配置的一些值base64编码2次,导致引用异常。

正常来说,通过yaml创建Opaque类型的secret,如果是键值对方式,通常需要先对value值进行base64编码,这个是正确的操作方式,但是如果是在腾讯云控制台创建secret,前端会默认对你传入的值进行base64编码,所以你在控制台填写了base64编码后的value,那么到集群中secret对应值就相对于编码了2次,从而获取对应的value值不正确。

既然这里知道原因了,那么解决方案就出来了,控制台创建secret,不需要对value值先进行base64编码,直接用原始的内容即可。

这里的问题总结一句话就是:

腾讯云容器服务控制台创建secret,变量值填写原始内容,不需要先base64编码。

0 人点赞