直接将凭证(token 或证书)写入 Kubectl 配置文件(`~/.kube/config`)有些不安全,本文将凭证存入 1Password 中,并利用 exec 功能动态从 1Password 读取凭证(读取的过程中,1Password 会弹出二次确认信息)来保证不会轻易泄漏配置文件
不使用 1Password?Mac 用户也可以将信息存入 Keychain 然后使用 security 命令行工具读取大体操作与本文类似
准备配置文件
首先准备一份可以直接使用的配置文件,包括 cluster user context 节,例如
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: DATA+OMITTED
server: https://127.0.0.1:6443
name: default
contexts:
- context:
cluster: default
user: default
name: default
current-context: default
kind: Config
preferences: {}
users:
- name: default
user:
client-certificate-data: DATA+OMITTED
client-key-data: DATA+OMITTED我们只需要对 user 进行修改 —— 将 client-certificate-data 和 client-key-data 变为动态读取(如果不是证书认证,这里则是 token)
生成凭证描述 JSON
将用户凭证的部分单独提取出来(类似如下的部分,在原始配置的 users[0].user 下)
client-certificate-data: DATA+OMITTED
client-key-data: DATA+OMITTED利用这一部分自行准备一份 JSON,类似于
{
"apiVersion": "client.authentication.k8s.io/v1beta1",
"kind": "ExecCredential",
"spec": {
"interactive": false
},
"status": {
"clientCertificateData": "-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----\n",
"clientKeyData": "-----BEGIN EC PRIVATE KEY-----\n...\n-----END EC PRIVATE KEY-----\n"
}
}注意这里面的 status.clientCertificateData 与 status.clientKeyData 分别是由原来配置中的 yaml 的 client-certificate-data 和 client-key-data 进行 base64 Decode 得来
(如果你不是使用证书认证而是使用 token,这里直接粘贴原始的 token 原文即可)
存储到 1Password
创建一个 1Password 条目,新建一个密码类型的字段(假设明明为 k8s config)写入前一步准备的凭证 JSON,复制这个项目的 Private Share Link
得到一行类似 https://start.1password.com/open/i?a=AAA&v=VVV&i=III 的链接,利用其中的 VVV(代表 Vault ID)和 III (代表 Item ID)的部分,构造一个 URL op://VVV/III/k8s config 备用(后面的 k8s config 和你的字段名称保持一致)
在命令行中输入 op read 'op://VVV/III/k8s config' 测试下能否正常读取到前面配置的 JSON
修改 kubeconfig
修改你的 kubeconfig 文件,将原来的
user:
client-certificate-data: DATA+OMITTED
client-key-data: DATA+OMITTED替换成
user:
exec:
apiVersion: client.authentication.k8s.io/v1beta1
command: op
args:
- read
- 'op://VVV/III/k8s config'
interactiveMode: Always
provideClusterInfo: false即可