tls 证书在 k8s 集群上大量使用的话,当到期时会存在批量替换的难度,比如说每个名称空间,多个业务的使用,在这篇博文中,将尝试批量替换整个集群的证书(前提,在没有使用 vault, cert-manager这类组件的集群之上)。
基本操作
步骤1:首先不知道有多少个名称空间使用了这个证书,所以需要遍历所有的名称空间,这里使用 kubectl 的 json path 实现
bash
|
|
步骤2:拿到名称空间的名字后,就需要循环这个名称空间下所有的 secret
bash
|
|
步骤3:找到与这个匹配的证书进行替换
把步骤3拆解为下面几个步骤:
- 拿去到符合要求的secret的名字
- 匹配名称是否为修改的secret
- 做替换操作
由于步骤2使用的是 jsonpath 拿到的 secret name,由于 kubectl 并不支持高级jsonpath语法,官方推荐使用jq,那么使用jq获取名字
bash
|
|
使用 awk 做字符串匹配,匹配是否包含对应的字符串关键词
bash
|
|
最后使用 kubectl replace 替换现有的 secret
bash
|
|
三个步骤整个为一个命令,如下所示:
bash
|
|
注意:
- ingress 使用的证书会立即更新
- 如果是作为 secret 挂在到 Pod 中需要重启,这是因为 kubelet volume 机制导致的。
高级用法
查询证书内容,并根据域名进行替换
查看证书域名的命令
bash
|
|
步骤拆解
bash
|
|
更新前没出意外需要备份下对应资源,批量备份集群内指定域名的 secret 命令
bash
|
|
批量替换命令,查询 tls 签发域名,并进行替换
bash
|
|