介绍

这是一个关于 Egg.js 应用上云️的示例,笔者所在的大前端团队的已应用于生产。

CI/CD & DevOps & GitOps & HPA 等这里暂不做讨论,因为每一个点篇幅都很长。

我这里的实验条件

示例项目

可直接做实验(文章写的再好,不如提供一个上云示例)

GitHub: k8s-eggjs->点我

GitHub: k8s-eggjs

GitHub: k8s-eggjs

这个示例,简单的提供了两个接口:

/api/posts

  1. curl -X POST http://localhost:7001/api/posts --data '{"title":"post1", "content": "post1 content"}' --header 'Content-Type:application/json; charset=UTF-8'

api/topics

  1. curl -X POST http://localhost:7001/api/topics --data '{"title":"topic1", "content": "topic1 content"}' --header 'Content-Type:application/json; charset=UTF-8'

笔者也把这个项目部署到了

上云实战

(示例已提供,可直接做实验)

Scripts

package.json 这里简单调整为:

  1. "start": "egg-scripts start --workers=1 --title=egg-server-k8s-eggjs-promethues",

最好是单进程启动,应用容器的编排完全交给 kubernetes。

Egg 关于 K8S 部署的相关 issues

Docker Image 准备

文件位于 docker/Dockerfile.prod

  1. FROM node:15-alpine
  2. RUN ln -sf /usr/share/zoneinfo/Asia/ShangHai /etc/localtime
  3. RUN echo "Asia/Shanghai" > /etc/timezone
  4. COPY package.json /app/dependencies/package.json
  5. COPY yarn.lock /app/dependencies/yarn.lock
  6. RUN cd /app/dependencies \
  7. && yarn install --frozen-lockfile --registry=https://registry.npm.taobao.org \
  8. && yarn cache clean \
  9. && mkdir /app/egg \
  10. && ln -s /app/dependencies/node_modules /app/egg/node_modules
  11. COPY ./ /app/egg/
  12. WORKDIR /app/egg
  13. EXPOSE 7001
  14. CMD npm run start

构建Image

  1. docker build -f docker/Dockerfile.prod -t k8s-eggjs-promethues:1.0.0 . --no-cache

打个 tag,笔者试验镜像是放在阿里云的(公司有自己的私有仓库)

  1. docker tag k8s-eggjs-promethues:1.0.0 registry.cn-shenzhen.aliyuncs.com/hacker-linner/k8s-eggjs-promethues:1.0.0

推送到阿里云

  1. docker push registry.cn-shenzhen.aliyuncs.com/hacker-linner/k8s-eggjs-promethues:1.0.0

Helm Chart(k8s-helm-charts)

(示例项目已提供,可直接做实验)

生成部署 Chart

  1. mkdir k8s-helm-charts && cd k8s-helm-charts
  2. helm create k8seggjs

我们复制一份 k8seggjs/values.yaml 到外层与 k8seggjs 文件夹同级(k8s-helm-charts/values.yaml)。

k8s-helm-charts/values.yaml做如下修改:

  1. replicaCount: 3 # 部署副本我用3个实例做负载均衡,保证服务可用
  2. image:
  3. repository: registry.cn-shenzhen.aliyuncs.com/hacker-linner/k8s-eggjs-promethues # 镜像变为刚上传
  4. pullPolicy: Always # 镜像拉取策略可直接用默认`IfNotPresent`
  5. # apiPort,metricsPort 默认模板没有,
  6. # 这里我对 template 里面的 ingress.yaml service.yaml deployment.yaml 文件做了相应改动
  7. service:
  8. type: ClusterIP
  9. apiPort: 7001 # 这个 API 服务的端口
  10. metricsPort: 7777 # 这个是 prometheus 所需的 metrics 端口
  11. # Ingress Controller,根据你的环境决定,我这里用的是 traefik
  12. ingress:
  13. enabled: true
  14. annotations:
  15. ingress.kubernetes.io/ssl-redirect: "true"
  16. ingress.kubernetes.io/proxy-body-size: "0"
  17. kubernetes.io/ingress.class: "traefik"
  18. traefik.ingress.kubernetes.io/router.tls: "true"
  19. traefik.ingress.kubernetes.io/router.entrypoints: websecure
  20. hosts:
  21. - host: k8seggjs.hacker-linner.com
  22. paths:
  23. - /
  24. tls:
  25. - secretName: hacker-linner-cert-tls
  26. hosts:
  27. # 做资源限制,防止内存泄漏,交给 K8S 杀掉然后重启,保证服务可用
  28. resources:
  29. limits:
  30. cpu: 100m
  31. memory: 128Mi
  32. requests:
  33. cpu: 100m
  34. memory: 128Mi

创建部署 Namespace

  1. kubectl create ns k8seggjs

使用 Helm 部署

  1. helm install k8seggjs ./k8seggjs -f values.yaml -n k8seggjs
  2. # 卸载:helm uninstall k8seggjs -n k8seggjs

ServiceMonitor(k8s-prometheus)

RBAC 设置

  1. apiVersion: rbac.authorization.k8s.io/v1
  2. kind: RoleList
  3. items:
  4. - apiVersion: rbac.authorization.k8s.io/v1
  5. kind: Role
  6. metadata:
  7. name: prometheus-k8s-k8seggjs
  8. namespace: k8seggjs
  9. rules:
  10. - apiGroups:
  11. - ""
  12. resources:
  13. - services
  14. - endpoints
  15. - pods
  16. verbs:
  17. - get
  18. - list
  19. - watch
  20. ---
  21. apiVersion: rbac.authorization.k8s.io/v1
  22. kind: RoleBindingList
  23. items:
  24. - apiVersion: rbac.authorization.k8s.io/v1
  25. kind: RoleBinding
  26. metadata:
  27. name: prometheus-k8s-k8seggjs
  28. namespace: k8seggjs
  29. roleRef:
  30. apiGroup: rbac.authorization.k8s.io
  31. kind: Role
  32. name: prometheus-k8s-k8seggjs
  33. subjects:
  34. - kind: ServiceAccount
  35. name: prometheus-k8s
  36. namespace: monitoring

指标 Service 设置

  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4. namespace: k8seggjs
  5. name: k8seggjs-metrics
  6. labels:
  7. k8s-app: k8seggjs-metrics
  8. annotations:
  9. prometheus.io/scrape: 'true'
  10. prometheus.io/scheme: http
  11. prometheus.io/path: /metrics
  12. prometheus.io/port: "7777"
  13. spec:
  14. selector:
  15. app.kubernetes.io/name: k8seggjs
  16. ports:
  17. - name: k8seggjs-metrics
  18. port: 7777
  19. targetPort: 7777
  20. protocol: TCP

ServiceMonitor 设置

  1. apiVersion: monitoring.coreos.com/v1
  2. kind: ServiceMonitor
  3. metadata:
  4. name: k8seggjs
  5. namespace: monitoring
  6. spec:
  7. endpoints:
  8. - bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token
  9. interval: 5s
  10. port: k8seggjs-metrics
  11. jobLabel: k8s-app
  12. namespaceSelector:
  13. matchNames:
  14. - k8seggjs
  15. selector:
  16. matchLabels:
  17. k8s-app: k8seggjs-metrics

应用

  1. kubectl apply -f ServiceMonitor.yaml

egg-exporter & egg-prometheus

egg-exporter,Egg.js 的 Prometheus 指标收集插件,附带 Grafana 看板。

egg-prometheus,Prometheus plugin for Egg.js。

示例项目的指标收集就是用的这个。

Grafana (k8s-grafana)

dashboard-metrics.json,完整的面板 json。来自于egg-exporter。笔者这里做了 metrics 前缀的调整。

  1. config.exporter = {
  2. scrapePort: 7777,
  3. scrapePath: '/metrics',
  4. prefix: 'k8seggjs_',
  5. defaultLabels: { stage: process.env.NODE_ENV },
  6. };

我们导入 json 文件进行 Grafana 面板创建

修改面板 Variables

$stage

  • Query: k8seggjs_nodejs_version_info{worker="app"}
  • Regex: /.*stage="([^"]*).*/

$appname

  • Query: k8seggjs_nodejs_version_info{worker="app"}
  • Regex: /.*app="([^"]*).*/

$node

  • Query: k8seggjs_nodejs_version_info{worker="app"}
  • Regex: /.*instance="([^"]*).*/

最终效果

Refs

互相交流学习

我的微信:

EggJS 云原生应用硬核实战(Kubernetes+Traefik+Helm+Prometheus+Grafana),提供 Demo的更多相关文章

  1. 云原生之旅 - 5)Kubernetes时代的包管理工具 Helm

    前言 上一篇文章 [基础设施即代码 使用 Terraform 创建 Kubernetes] 教会了你如何在Cloud上面建Kubernetes资源,那么本篇来讲一下如何在Kubernetes上面部署应 ...

  2. 第一届云原生应用大赛火热报名中! helm install “一键安装”应用触手可及!

    云原生应用,是指符合“云原生”理念的应用开发与交付模式,这是当前在云时代最受欢迎的应用开发最佳实践. 在现今的云原生生态当中,已经有很多成熟的开源软件被制作成了 Helm Charts,使得用户可以非 ...

  3. 如何将云原生工作负载映射到 Kubernetes 中的控制器

    作者:Janakiram MSV 译者:殷龙飞 原文地址:https://thenewstack.io/how-to-map-cloud-native-workloads-to-kubernetes- ...

  4. 云原生应用 Kubernetes 监控与弹性实践

    前言 云原生应用的设计理念已经被越来越多的开发者接受与认可,而Kubernetes做为云原生的标准接口实现,已经成为了整个stack的中心,云服务的能力可以通过Cloud Provider.CRD C ...

  5. 云原生之旅 - 6)不能错过的一款 Kubernetes 应用编排管理神器 Kustomize

    前言 相信经过前一篇文章的学习,大家已经对Helm有所了解,本篇文章介绍另一款工具 Kustomize,为什么Helm如此流行,还会出现 Kustomize?而且 Kustomize 自 kubect ...

  6. 云原生生态周报 Vol.9| K8s v1.15 版本发布

    本周作者 | 衷源.心贵 业界要闻 1.Kubernetes Release v1.15 版本发布,新版本的两个主题是持续性改进和可扩展性.(https://github.com/kubernetes ...

  7. 云原生生态周报 Vol. 8 | Gartner 发布云原生趋势

    业界要闻 Gartner 发布云原生基础设施未来的八大趋势:权威分析机构 Gartner 在对 2020 年技术趋势的展望当中指出:“预计2020年所有领先的容器管理软件均内置服务融合技术,到2022 ...

  8. 如何优雅地使用云原生 Prometheus 监控集群

    作者陈凯烨,腾讯云前端开发工程师.负责 TKE 集群,弹性集群和云原生监控等模块控制台开发. 概述 Prometheus 是一套开源的系统监控报警框架.2016 年,Prometheus 正式加入 C ...

  9. Dapr | 云原生的抽象与实现

    引言 Dapr 是微软主导的云原生开源项目,2019年10月首次发布,到今年2月正式发布 V1.0 版本.在不到一年半的时间内,github star 数达到了 1.2 万,超过同期的 kuberne ...

随机推荐

  1. Java学习的第十二天

    1.包名 2.接口不太懂. 3.明天开始学习第五章

  2. 01.axios封装

    1. 始vue化项目 https://www.cnblogs.com/xiaonq/p/11027880.html   vue init webpack deaxios # 使用脚手架创建项目 dea ...

  3. [Luogu P4777] 【模板】扩展中国剩余定理(EXCRT) (扩展中国剩余定理)

    题面 传送门:洛咕 Solution 真*扩展中国剩余定理模板题.我怎么老是在做模板题啊 但是这题与之前不同的是不得不写龟速乘了. 还有两个重点 我们在求LCM的时候,记得先/gcd再去乘另外那个数, ...

  4. 835. Image Overlap —— weekly contest 84

    Image Overlap Two images A and B are given, represented as binary, square matrices of the same size. ...

  5. Simulink代码自动生成(一)

    前面介绍了MDB的设计思想并对比了它和传统的嵌入式软件开发之间的差异,现在开始使用Simulink工具演示模型的搭建和C代码的自动生成过程. Matlab版本:R2018B 一.算法模型的搭建 搭建一 ...

  6. 直播平台源码搭建教程:微信小程序中的直播如何去掉水印

    直播平台源码搭建教程:微信小程序中的直播如何去掉水印 本文与大家分享一下直播平台源码搭建教程,如何去掉直播视频的水印 var services = require('../../lib/service ...

  7. C#/VB.NET 给Excel添加、删除数字签名

    一.程序环境 以下内容通过C#及VB.NET代码demo示例介绍如何给Excel文档添加数字签名,以及删除Excel文档中已有的数字签名.工具使用最近发布的Spire.XLS for .NET 版本1 ...

  8. 转载:Python中collections模块

    转载自:Python中collections模块 目录 Python中collections模块 Counter defaultdict OrderedDict namedtuple deque Ch ...

  9. Shell 筛选符合条件的 ELF 文件

    0 运行环境 本机系统:Windows 10 虚拟机软件:Oracle VM VirtualBox 6 虚拟机系统:Ubuntu 18 1 引言 - 编译过程 我们知道在 CPU 上执行的是低级别的机 ...

  10. 手写简易React-Fiber

    1.首先创建createElement函数 1 function createElement ( 2 type, 3 config, 4 ...children 5 ) { 6 7 const pro ...