参考原文地址: https://blog.youkuaiyun.com/sss294438204/article/details/88741392
项目中需要通过SDK 向集群内添加 Secret 资源,于是搜索了很多内容发现相关介绍甚少。仅找到一篇相关文章,按照作者实践步骤测试发现报错。最后翻看官方文档也未能找到想要的答案。后通过自己测试反推找到答案,特此记录如下:
以下是官方文档对 Secret 资源操作的相关示例:
官方文档:https://github.com/fabric8io/kubernetes-client/blob/master/doc/CHEATSHEET.md#secret
上述示例仅为 Opaque 类型数据创建,且实际操作时需要对相关字段进行Base64后才可正常保存。关于 Opaque 类型不再过多叙述。
以下是针对 kubernetes.io/dockerconfigjson 类型数据创建(主要也是存储 docker-registy 信息)
首先简单分析下我们需要提供的数据格式内容,原格式内容如下:
{"auths":{"registry.cn-beijing.aliyuncs.com":{"username":"myUsername","password":"myPwd","auth":"bXlVc2VybmFtZTpteVB3ZA=="}}}
1. registry.cn-beijing.aliyuncs.com 为 docker-registy 的请求地址。
2. username 为 docker-registy 的用户名。
3. password 为 docker-registy 的密码。
4. auth 为 "用户名:密码" 经过Base64 后的字符串。(注意中间的冒号) encode(myUsername:myPwd)
这个json数据其实也是 docker 的 config.json 文件内容
代码部分如下:
private Secret createRegistrySecret(DockerRegistry info){
Base64.Encoder encoder = Base64.getEncoder();
// 生成 auth 部分得 Base64 字符串
String authStr = String.format("%s:%s", info.getUsername(), info.getPassword());
String enStr = encoder.encodeToString(authStr.getBytes());
// 将相关 docker-registry 信息替换
String dataStr = String.format("{\"auths\":{\"%s\":{\"username\":\"%s\",\"password\":\"%s\",\"auth\":\"%s\"}}}",
info.getAddress(), info.getUsername(), info.getPassword(), enStr);
// 对 JSON 字符串在进行 Base64 加密
dataStr = encoder.encodeToString(dataStr.getBytes());
// 创建 Secret 资源对象
Secret registrySecret = new SecretBuilder()
.withNewMetadata()
.withName(info.getName())
.endMetadata()
.addToData(".dockerconfigjson", dataStr)
.withType("kubernetes.io/dockerconfigjson")
.build();
return registrySecret;
}
注意事项:
1. 一定要使用 addToData() 方法添加数据
2. addToData() 方法的第一个参数必须是 .dockerconfigjson
3. 需要指定具体类型 .withType("kubernetes.io/dockerconfigjson")