kubernetes高级之创建只读文件系统以及只读asp.net core容器
使用docker创建只读文件系统
容器化部署对应用的运维带来了极大的方便,同时也带来一些新的安全问题需要考虑.比如黑客入侵到容器内,对容器内的系统级别或者应用级别文件进行修改,会造成难以估量的损失.(比如修改hosts文件导致dns解析异常,修改web资源导致网站被嵌入广告,后端逻辑被更改导致权限验证失效等,由于是分布式部署,哪些容器内的资源被修改也很难以发现).解决这个问题的办法就是创建创建一个具有只读文件系统的容器.下面介绍使用docker run命令和docker compose来创建具有只读文件系统的容器.
使用docker run命令创建只读文件系统
比如说要创建一个只读文件系统的redis容器,可以执行以下命令
docker run --read-only redis
docker compose/swarm创建只读文件系统
yaml编排文件示例如下
version: '3.3' services: redis: image: redis:4.0.1-alpine networks: - myoverlay read_only: true networks: myoverlay:
问题:创建只读文件系统看起来很不错,但是实际上往往会有各种各样的问题,比如很多应用要写temp文件或者写日志文件,如果对这样的应用创建只读容器则很可能导致应用无法正常启动.对于需要往固定位置写入日志或者临时文件的应用,可以挂载宿主机的存储卷,虽然容器是只读的,但是挂载的盘仍然是可读写的.
创建只读的asp.net core容器
上面一节我们讲到了创建容器只读文件系统以增加安全性,以及如何解决需要写入日志文件或者临时文件这样常见的问题.我们尝试创建一个只读的asp.net应用时,即便不使用任何log组件(即不写入日志),仍然无法正常启动镜像.解决这个问题其实也非常简单,只需要把环境变量
COMPlus_EnableDiagnostics的值设置为
0即可.
FROM microsoft/dotnet:2.2-aspnetcore-runtime AS base WORKDIR /app EXPOSE 52193 FROM microsoft/dotnet:2.2-sdk AS build WORKDIR /src COPY . . WORKDIR "/src" RUN dotnet build "ReadOnlyTest.csproj" -c Release -o /app FROM build AS publish RUN dotnet publish "ReadOnlyTest.csproj" -c Release -o /app FROM base AS final WORKDIR /app ENV DOTNET_RUNNING_IN_CONTAINER=true ENV DOTNET_CLI_TELEMETRY_OPTOUT=1 ENV COMPlus_EnableDiagnostics=0 COPY --from=publish /app . ENTRYPOINT ["dotnet", "ReadOnlyTest.dll"]
我们对这些环境变量进行简单介绍
DOTNET_RUNNING_IN_CONTAINER
值设置为true时则表示应用运行在容器内,方便我们获取程序的运行环境,然后根据环境做出不同决策(比如单元测试的时候,可能要根据项目是运行在windows,linux或者linux容器做出不同的测试策略).当然,你也可以设置其它的环境变量来方便自己使用,比如你键名称设置为IsRunningInDocker
,但是DOTNET_RUNNING_IN_CONTAINER
DOTNET_CLI_TELEMETRY_OPTOUT
是否输出遥测信息,如果设置为1则是关闭,这样dotnet.exe就不会向调试窗口输出遥测信息.COMPlus_EnableDiagnostics
目前没有找到太多关于这个参数的详细信息,只是查阅资源发现这开启这项配置可以创建只读权限 aspnet 应用程序.
微软官方基础镜像里还包含一项名称叫作
ASPNETCORE_VERSION的环境变量,我们可以直接读取它,这样使用公共的环境变量一来避免息手动设置和更新的麻烦,二来便于和社区交流(自己定义约束的只能用于内部团队交流)
我们如何使用这些环境变量呢,其它可以在程序里面暴露一个helper方法,比如
private bool InDocker { get { return Environment.GetEnvironmentVariable("DOTNET_RUNNING_IN_CONTAINER") == "true";} }
这样我们就可以根据实际的需求来使用它.
上面我们介绍了如何使用docker run命令以及docker-compose创建只读文件系统.然而在kubernetes集群里,我们需要使用k8s的编排方法来创建只读文件系统.那么在k8s里如何创建只读文件系统.其实这里涉及到了另一个高级主题:那就是k8s的安全策略(Pod Security Policies)我们将在下一节介绍它.
- ASP.NET Core 打造一个简单的图书馆管理系统 (修正版)(三)密码修改以及密码重置
- ASP.NET Core Web API + Angular 仿B站(一) 目的分析以及创建 WebAPI + Angular7 项目
- ASP.NET Core 打造一个简单的图书馆管理系统(四)密码修改以及密码重置
- asp.net core高级EF Core2.0数据模型设计创建
- ASP.NET Core 打造一个简单的图书馆管理系统 (修正版)(二)用户数据库初始化、基本登录页面以及授权逻辑的建立
- sql server 关于表中只增标识问题 C# 实现自动化打开和关闭可执行文件(或 关闭停止与系统交互的可执行文件) ajaxfileupload插件上传图片功能,用MVC和aspx做后台各写了一个案例 将小写阿拉伯数字转换成大写的汉字, C# WinForm 中英文实现, 国际化实现的简单方法 ASP.NET Core 2 学习笔记(六)ASP.NET Core 2 学习笔记(三)
- ASP.NET Core 打造一个简单的图书馆管理系统 (修正版)(一) 基本模型以及数据库的建立
- Asp.net文件上传 重命名 以及自动创建上传目录
- 创建自定义路由处理程序(Creating a Custom Route Handler) | 定制路由系统| 高级路由特性 |精通ASP-NET-MVC-5-弗瑞曼
- IT咨询顾问:一次吐血的项目救火 java或判断优化小技巧 asp.net core Session的测试使用心得 【.NET架构】BIM软件架构02:Web管控平台后台架构 NetCore入门篇:(十一)NetCore项目读取配置文件appsettings.json 使用LINQ生成Where的SQL语句 js_jquery_创建cookie有效期问题_时区问题
- ASP.NET Core Web API + Angular 仿B站(二)后台模型创建以及数据库的初始化
- IIS asp.net 中出现未能加载文件或程序集“System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”或它的某一个依赖项。系统找不到指定的文件。
- VS2017创建 ASP.NET Core 1.1 Web项目,上传大文件时提示404
- ASP.NET Core 打造一个简单的图书馆管理系统(三)基本登录页面以及授权逻辑的建立
- asp.net中对文件的创建,移动,复制,及删除操作
- ASP.NET创建文件并写入内容
- asp.net实现创建映射,发送文件,删除映射
- ASP.NET CS文件中输出JavaScript脚本的3种方法以及区别
- Asp.net输出Excel文件并且下载该文件以及某些细节问题解决
- ASP.NET判断物理路径下是否存在某文件,如果不存在则创建