容器化分布式日志组件ExceptionLess的Angular前端UI

时间:2022-09-11 14:06:25

写在前面

随着微服务架构的流行,日志也需要由专门的分布式日志组件来完成这个工作,我们项目使用的是 ExceptionLess 这个组件,它是前后端分离的;这篇文章我们就来实践容器化 ExceptionLess 的前端,并为其包含一个 nginx 的宿主,形成一个能够独立运行的、自包含的环境,这样当我们使用k8s集群的时候,就可以使用这个开箱即用的镜像,任意伸缩,滚动更新,按需扩容等等。

ExceptionLess UI 是使用Angular开发的一个纯前端 Web UI,首先我们需要安装环境(git、npm、bower、grunt etc.),请参考详细步骤。安装完成后,使用 grunt 发布项目,这样一个纯静态的前端网站就生成了;然后将刚刚生成的所有静态文件以tar.gz格式压缩成归档文件,如 exceptionless.ui.gkb.tar.gz

构造镜像

原理

一个Linux版本的镜像,本质上就是带有某种环境的Linux系统。比如镜像nginx:1.13.12,就是安装了nginx 1.13.12 的linux系统,然后打包成的一个镜像。理解了镜像的本质,我们就可以从零构造一个带有指定配置的、任意版本的nginx镜像(其实,我们接下来就是要在做这件事情)。

同理,现在我们需要将包含静态文件的纯前端,宿主到一个web服务器,和传统的方法是一样的,先安装一个web服务器,然后将其作为静态资源的宿主。不同的是,当我们用容器化的思想来做这件事情时候,把所有的流程编排进Dockerfile即可,就是这么简单。

综上所述,构建镜像就是构建一个带有某种环境的Linux系统,只是我们将传统安装环境的步骤编排进Dockerfile而已

示例说明

我已经使用k8s部署了一个nginx 1.13.12环境,现在以交互模式进入容器:

kubectl -n k8s-ecoysystem-apps exec -it nginx-deployment-6c45fc49cb-zdlfb /bin/bash

容器化分布式日志组件ExceptionLess的Angular前端UI

看到了吗,这就一个安装了nginx 1.13.12的linux环境。

如何编写Dockerfile?

引导

其实,当我们安装完成nginx时,它已经配置好了一个静态资源的例子,如下:

容器化分布式日志组件ExceptionLess的Angular前端UI

所以我们可以通过浏览器,访问到如下的界面:

容器化分布式日志组件ExceptionLess的Angular前端UI

这个界面就是静态文件/usr/share/nginx/html/index.html被浏览器渲染的效果。

编排步骤

把部署静态资源的步骤编排进Dockerfile(这个步骤也可以从零构建FROM SCRATCH,条条道路通罗马,大家下去自己实战)

FROM nginx:1.13.12
MAINTAINER justmine
WORKDIR /usr/share/nginx/html
ADD ["exceptionless.ui.tar.gz","."]
  • FROM nginx:1.13.12 从一个带有nginx:1.13.12环境的linux开始构建
  • MAINTAINER justmine 说明作者
  • WORKDIR /usr/share/nginx/html 设置工作目录
  • ADD ["exceptionless.ui.tar.gz","."] 将静态资源拷贝到nginx宿主对外提供静态资源的目录下。这里也可以使用copy命令来完成,但是需要我们提前解压好归档文件。

注意:WORKDIR工作目录指的是当前命令执行的工作目录,所以ADD第二个参数直接用点(.)代替即可,这样操作起来相对来说比较便利。但是ADD第一个参数的工作目录和这个没有关系,指的是docker build时传递的工作目录,所以需要注意,如果在传递的目录下,找不到这个归档文件,最后一步生成镜像就会报错Forbidden path outside of the build context

Dockerfile生成镜像并上传到DockerHub

docker build -t justmine/nginx-hosted-exceptionless-ui:1.0 .
docker push justmine/nginx-hosted-exceptionless-ui:1.0

千万注意docker build最后的一个点(.),这是归档文件的上下文目录。

容器化分布式日志组件ExceptionLess的Angular前端UI

k8s集群

deployment.yml

apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-hosted-exceptionless-ui
namespace: k8s-ecoysystem-apps
spec:
replicas: 1
selector:
matchLabels:
app: nginx-hosted-exceptionless-ui
template:
metadata:
labels:
app: nginx-hosted-exceptionless-ui
spec:
containers:
- image: justmine/nginx-hosted-exceptionless-ui:1.0
imagePullPolicy: Always
name: nginx-hosted-exceptionless-ui
ports:
- containerPort: 80
protocol: TCP

service.yml

apiVersion: v1
kind: Service
metadata:
name: nginx-hosted-exceptionless-ui
namespace: k8s-ecoysystem-apps
spec:
type: NodePort
selector:
app: nginx-hosted-exceptionless-ui
ports:
- nodePort: 32003
port: 80
targetPort: 80

容器化分布式日志组件ExceptionLess的Angular前端UI

浏览器(firefox)查看效果

容器化分布式日志组件ExceptionLess的Angular前端UI

日志

容器化分布式日志组件ExceptionLess的Angular前端UI

总结

本篇分析了镜像的本质,镜像的构建原理,并一步一步地引导大家容器化一个开箱即用的纯前端UI,这也是微服务架构实行前后端分离后,容器化前端的一个典型例子。可以说容器化后,使用k8s就可以为所欲为,真正的让k8s成为微服务应用平台的一大利器啊。这也是我在容器化微服务路上,落实的一个案例,希望分享给大家,更希望把整个思绪过程分享给大家。

项目参考:https://github.com/justmine66/k8s.ecoysystem.apps/tree/master/k8s/ExceptionLess

附言

上次详解k8s零停机滚动发布微服务后,社区群里有人希望这周赶紧写金丝雀部署,这里说声抱歉,由于我们自己的微服务项目也需要与k8s结合,所以,需要先解决实际工作中急切遇到的一些问题。后面会抽时间完成金丝雀部署实践,请继续关注。

如果你觉得本篇文章对您有帮助的话,感谢您的【推荐】,这将成为我继续写作的动力

如果你对 kubernets 和 dotnet 感兴趣的话可以关注我,我会定期的在博客分享我的学习心得

我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=2ijrp0ik104ko

容器化分布式日志组件ExceptionLess的Angular前端UI的更多相关文章

  1. 如何扩展分布式日志组件(Exceptionless)的Webhook事件通知类型?

    写在前面 从上一篇博客高并发.低延迟之C#玩转CPU高速缓存(附示例)到现在又有几个月没写博客了,啥也不说,变得越来越懒了,懒惰产生了拖延后遗症. 最近一周升级了微服务项目使用的分布式日志组件Exce ...

  2. 分布式日志框架Exceptionless之生产环境部署步骤

    Exceptionless 是一个开源的实时的日志收集框架,它将日志收集变得简单易用并且不需要了解太多的相关技术细节及配置.本篇基于我的上一篇<基于Exceptionless实现分布式日志&gt ...

  3. 一套标准的ASP&period;NET Core容器化应用日志收集分析方案

    讲故事 关注我公众号的朋友,应该知道我写了一些云原生应用收集和分析相关的文章,其中内容大多聚焦某个具体的组件: 超级有用的TraceId,快点用起来吧! 如何利用NLog输出结构化日志,并在Kiban ...

  4. 利用 ELK 搭建 Docker 容器化应用日志中心

    利用 ELK 搭建 Docker 容器化应用日志中心 概述 应用一旦容器化以后,需要考虑的就是如何采集位于 Docker 容器中的应用程序的打印日志供运维分析.典型的比如SpringBoot应用的日志 ...

  5. &period;NET开源分布式日志框架ExceptionLess实战演练&lpar;公开版&rpar;

    一.课程介绍 在以前,我们做日志收集大多使用 Log4net,Nlog 等框架,在应用程序变得复杂并且集群的时候,可能传统的方式已经不是很好的适用了,因为收集各个日志并且分析他们将变得麻烦而且浪费时间 ...

  6. Flume&plus;Kafka收集Docker容器内分布式日志应用实践

    1 背景和问题 随着云计算.PaaS平台的普及,虚拟化.容器化等技术的应用,例如Docker等技术,越来越多的服务会部署在云端.通常,我们需要需要获取日志,来进行监控.分析.预测.统计等工作,但是云端 ...

  7. &period;NetCore 分布式日志收集Exceptionless 在Windows下本地安装部署及应用实例

    自己安装时候遇到很多问题,接下来把这些问题写出来希望对大家有所帮助 搭建环境: 1.下载安装 java 8 SDK (不要安装最新的10.0) 并配置好环境变量(环境变量的配置就不做介绍了) 2.下载 ...

  8. 详解利用ELK搭建Docker容器化应用日志中心

    概述 应用一旦容器化以后,需要考虑的就是如何采集位于Docker容器中的应用程序的打印日志供运维分析.典型的比如SpringBoot应用的日志 收集.本文即将阐述如何利用ELK日志中心来收集容器化应用 ...

  9. 开源分布式日志系统ExceptionLess部署杂乱笔记 加密

    前两天看到了这篇文章,亲身体会了下,确实不错,按照官方的文档试了试本地部署,折腾一番后终于成功,记下心得在此,不敢独享. 本地部署官方wiki .NET 4.6.1 这个因为我装了VS2015,就没有 ...

随机推荐

  1. 第一次到IT公司上班&excl;

    今日是自个的首次正式到IT公司进行作业,感触也是别有一番兴趣!如今就让自个回味下第一天的作业经历吧! 我上班的公司叫西安西科软件技术有限公司,第一天上班的缘故,早上起得很早,差不多六点半还没到就起床洗 ...

  2. 5 个最好的3D游戏开发工具(转)

    转自:http://www.open-open.com/news/view/33a4f0 5 个最好的3D游戏开发工具 jopen 2012-11-19 22:56:21 • 发布 摘要:UDK(th ...

  3. python几道简单的算法题

    最近看了python的语法,但是总感觉不知道怎么使用它,还是先来敲敲一些简单的程序吧. 1.题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 程序分析:可填在百位.十 ...

  4. HDU 5862 Counting Intersections&lpar;离散化&plus;树状数组&rpar;

    HDU 5862 Counting Intersections(离散化+树状数组) 题目链接http://acm.split.hdu.edu.cn/showproblem.php?pid=5862 D ...

  5. MAC - PhpStorm安装调试环境xdebug

    今天下午一直在捣鼓如何用PhpStorm进行调试,查找了许多资料,零零碎碎的,所以自己弄篇文章记录一下步骤. 安装xdebug 使用brew安装xdebug,语法如下 brew install hom ...

  6. 解决无法打开myeclipse--&gt&semi;&OpenCurlyDoubleQuote;The default workspace&&num;39&semi;D&colon; &sol;myeclipse spaceis in use or cannot be created&period; Please choose a different one”

    解决方法:到工作空间中删除.metadata文件夹中的.lock文件 如果提示无法删除,到任务管理器中关闭java进程:

  7. 漫画HDFS工作原理&lpar;转)

    转自:http://blog.csdn.net/netcoder/article/details/7442779?locationNum=2 对漫画内容更好的解读,可参考: http://www.we ...

  8. Ubuntu 之 atom 安装以及 常用配置

    安装方式如下: 打开终端,使用以下命令安装: sudo add-apt-repository ppa:webupd8team/atom sudo apt-get update sudo apt-get ...

  9. C&plus;&plus;中多态中构造函数与析构函数的调用

    做个实验,看一下成员变量的构造析构,父类子类的构造析构,以及虚函数对调用的影响. #include <iostream> using namespace std; class Member ...

  10. ERROR&colon; No query specified

    mysql中执行show命令的时候,提示以下信息: mysql> show variables like 'datadir'\G; *************************** 1. ...