传统的web项目存储文件,图片等,一般都是放站点部署的磁盘中。站点重启后还是能继续访问。
但是在k8s中。无状态pod重启后,都是随机落到一台worker上,这样之前的文件就有可能找不到了。
准备测试项目:
场景一,文件存pod下,重启pod文件还在吗?
参照:使用rancher在k8s上完成第一个CI/CD的项目
创建一个TextController 有两个接口:
SaveText 传入文本,保存一个txt文件在服务器。并返回文件地址。
GetText 传入文件名,下载那个文件下来
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System.Text;
namespace K8sStorageDemo.Controllers
{
[Route("api/[controller]/[action]")]
[ApiController]
public class TextController : ControllerBase
{
private string basePath = "/home/admin/files";
[HttpGet]
public string SaveText(string text)
{
return SaveFile(text);
}
[HttpGet]
public ActionResult GetText(string filename)
{
var path = basePath + $"/{filename}.txt";
byte[] byteArr = System.IO.File.ReadAllBytes(path);
string mimeType = "application/octet-stream";
return new FileContentResult(byteArr, mimeType)
{
FileDownloadName = filename
};
}
private string SaveFile(string text)
{
if (!System.IO.Directory.Exists(basePath))
{
System.IO.Directory.CreateDirectory(basePath);
}
var path = basePath + $"/{Guid.NewGuid().ToString()}.txt";
if (!System.IO.File.Exists(path))
{
// 创建要写入的文件。
string createText = text + Environment.NewLine;
System.IO.File.WriteAllText(path, createText, Encoding.UTF8);
}
return path;
}
}
}
准备好ingress:K8sStorageDemo_ingress.yaml 导入集群。
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: k8sstoragedemo
namespace: default
spec:
rules:
- host: www.k8sstoragedemo.cn
http:
paths:
- path: /
backend:
serviceName: k8sstoragedemo
servicePort: 80
rancher流水线发布完成后,配置本地hosts文件(参照):k8s基于ingress-nginx的服务发现和负载均衡
192.168.21.233 www.k8sstoragedemo.cn
然后请求:http://www.k8sstoragedemo.cn/api/Text/SaveText?text=hello%20k8s'
然后进入容器看