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_CONTAINERDOTNET_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)我们将在下一节介绍它.
kubernetes高级之创建只读文件系统以及只读asp.net core容器的更多相关文章
- Kubernetes中分布式存储Rook-Ceph的使用:一个ASP.NET Core MVC的案例
在<Kubernetes中分布式存储Rook-Ceph部署快速演练>文章中,我快速介绍了Kubernetes中分布式存储Rook-Ceph的部署过程,这里介绍如何在部署于Kubernete ...
- 【翻译】在Mac上使用VSCode创建你的第一个Asp.Net Core应用
Setting Up Your Development Environment 设置你的开发环境 To setup your development machine download and inst ...
- ASP.NET Core在Azure Kubernetes Service中的部署和管理
目录 ASP.NET Core在Azure Kubernetes Service中的部署和管理 目标 准备工作 注册 Azure 账户 AKS文档 进入Azure门户(控制台) 安装 Azure Cl ...
- 使用 ASP.NET Core MVC 创建 Web API(一)
从今天开始来学习如何在 ASP.NET Core 中构建 Web API 以及每项功能的最佳适用场景.关于此次示例的数据库创建请参考<学习ASP.NET Core Razor 编程系列一> ...
- VisualStudioCode中用dotnet命令创建多个ASP.NET Core 项目、类库、控制台程序,并添加应用间的引用
一.准备工作 首先安装VisualStudioCode并且可以使用. 1.首先新创建空的MyApps文件夹,作为项目主目录,下面将在这个文件夹中创建多个web应用程序.类型.控制台程序等. 2.打开V ...
- 解决ntfs格式的移动硬盘mount到Linux下时变成只读文件系统的问题
环境介绍 主机: XP 虚拟机:VirtualBox+Debian6 遇到的问题 我有一块西部数据的移动硬盘,虚拟机中有一些资料需要拷贝到移动硬盘中,然后我将移动硬盘插上后,执行如下设置,将移动硬盘分 ...
- mkdir: 无法创建目录"kk": 只读文件系统
创建文件提示 root@hap1:/test>mkdir kk mkdir: 无法创建目录"kk": 只读文件系统 root@hap1:/test>mount .... ...
- 一旦rhel5.8造成只读文件系统ORA-00354: corrupt redo log block header
一旦rhel5.8造成只读文件系统ORA-00354: corrupt redo log block header Wed Jun 03 03:31:24 CST 2015 Thread 1 adva ...
- Linux文件系统,ntfs分区显示只读文件系统,提示超级快损坏
背景:某天当我打开自己的设备,突然发现ntfs分区无法写入任何文件,提示为只读文件系统,具体现象如下: 修复过程:排除权限问题,使用fsck进行修复无果后,使用e2fsck进行修复 显示超级快损坏,这 ...
随机推荐
- 【Luogu】P2445动物园(最大流)
题目链接 题目本身还是比较水的吧……容易发现是最大流套上dinic跑一遍就好了,并不会超时. 比较不偷税的一点是关于某动物的所有目击报告都符合才能连边……qwqqwqqwq #include<c ...
- 给shell添加颜色
编辑/etc/baserc 添加 TERM=xterm-color; export TERM alias ls='ls -G' alias ll='ls -lG' 给vim添加颜色 编辑/usr/sh ...
- 搜索引擎快捷导航:一个简单的chrome插件(教程)
一.如何通过练习来提高学习新框架的最好姿势是:基于现有的业务来学习.即从工作中学习,从实践中学.但是,如果一直只使用新的框架来重写旧的业务,成长也会趋近于0.第一次,使用新框架时收获可能颇丰:第二次, ...
- 最里层的是child元素
1. 简介A convenience widget that combines common painting, positioning, and sizing widgets. Container在 ...
- mac/linux自带定时任务执行crontab的使用
1.编辑定时任务信息 sudo crontab -e #以root用户创建,也可以 -u 参数 编辑内容如下: 频率表达式分别对应为 分.时.日.周.月 LANG=zh_CN.UTF-8 */30 * ...
- 完全平方数(bzoj 2440)
Description 小 X 自幼就很喜欢数.但奇怪的是,他十分讨厌完全平方数.他觉得这些数看起来很令人难受.由此,他也讨厌所有是完全平方数的正整数倍的数.然而这丝毫不影响他对其他数的热爱. 这天是 ...
- mongodb window安装学习
https://blog.csdn.net/u011692780/article/details/81223525 教程:http://www.runoob.com/mongodb/mongodb-t ...
- Django 利用 Pagination 分页
Django自身提供了一些类来实现管理分页,数据被分在不同的页面中,并带有“上一页/下一页”标签.这个类叫做Pagination,其定义位于 django/core/paginator.py 中. 一 ...
- 树(弱化版)(lca)
3306: 树 时间限制: 10 Sec 内存限制: 256 MB 题目描述 给定一棵大小为 n 的有根点权树,支持以下操作: • 换根 • 修改点权 • 查询子树最小值 输入 第一行 ...
- 利用例子来理解spring的面向切面编程(使用@Aspect)
上篇的例子,自动装配和自动检测Bean是使用注解的方式处理的,而面向切面编程是使用aop标签处理的,给我感觉就像中西医参合一样. 现在就来优化优化,全部使用注解的方式处理. 1.工程图: