最近有个需求,上传文件至k8s容器
简单实现(一)
依赖版本
<dependency>
<groupId>io.kubernetes</groupId>
<artifactId>client-java</artifactId>
<version>18.0.1</version>
</dependency>
查看copy相关api,遂有实现如下
Copy copy = new Copy();
//执行拷贝
copy.copyFileToPod(namespace, podInfo.getPodName(), null, Paths.get(srcPath), Paths.get(descPath));
由于Websocket 缺陷,不能在上传完成后及时关闭,导致这里会一直卡住。想了解详细原因的朋友可以去github查看
解决方法,手动关闭Process进程
Copy copy = new Copy();
//上传
Future<Integer> future = copy.copyFileToPodAsync(namespace, podInfo.getPodName(), null, Paths.get(srcPath), Paths.get(descPath));
//手动关闭
future.get(1, TimeUnit.NANOSECONDS);
进阶(二)自定义MyCopy,支持MultipartFile类型文件
1、新建MyCopy,并继承Exec,核心代码如下
public Future<Integer> copyFileToPodAsync(
String namespace, String pod, String container, MultipartFile file, Path destPath)
throws ApiException, IOException {
// Run decoding and extracting processes
final Process proc = execCopyToPod(namespace, pod, container, destPath);
try (
InputStream inputStream = file.getInputStream();
ArchiveOutputStream archiveOutputStream =
new TarArchiveOutputStream(proc.getOutputStream())
) {
ArchiveEntry tarEntry = new TarArchiveEntry(new File(destPath.getFileName().toString())
);
((TarArchiveEntry) tarEntry).setSize(file.getSize());
archiveOutputStream.putArchiveEntry(tarEntry);
Streams.copy(inputStream, archiveOutputStream);
archiveOutputStream.closeArchiveEntry();
return new ProcessFuture(proc);
}
}
2、改为自定义实现
MyCopy myCopy = new MyCopy();
Future<Integer> future = myCopy.copyFileToPodAsync(namespace, podInfo.getPodName(), null, file, Paths.get(descPath));
future.get(1, TimeUnit.NANOSECONDS);