1. 程式人生 > >EggJS 雲原生應用硬核實戰(Kubernetes+Traefik+Helm+Prometheus+Grafana),提供 Demo

EggJS 雲原生應用硬核實戰(Kubernetes+Traefik+Helm+Prometheus+Grafana),提供 Demo

## 介紹 這是一個關於 [Egg.js](https://eggjs.org/zh-cn/) 應用上雲☁️的**示例**,筆者所在的大前端團隊的已應用於生產。 `CI/CD` & `DevOps` & `GitOps` & `HPA` 等這裡暫不做討論,因為每一個點篇幅都很長。 ### 我這裡的實驗條件 * 一個可用的 Kubernetes 叢集 * 已在叢集中部署 [Kube-Prometheus-Stack](https://artifacthub.io/packages/helm/prometheus-community/kube-prometheus-stack) * 已在叢集中部署 [Traefik v2.2](https://traefik.io/) 作為 [Ingress Controller](https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/) * 已安裝 [Helm V3](https://helm.sh/) ### 示例專案 可直接做實驗(文章寫的再好,不如提供一個上雲示例) GitHub: **[k8s-eggjs->點我](https://github.com/Hacker-Linner/k8s-eggjs)** GitHub: **[k8s-eggjs](https://github.com/Hacker-Linner/k8s-eggjs)** GitHub: **[k8s-eggjs](https://github.com/Hacker-Linner/k8s-eggjs)** 這個示例,簡單的提供了兩個介面: `/api/posts` ```sh curl -X POST http://localhost:7001/api/posts --data '{"title":"post1", "content": "post1 content"}' --header 'Content-Type:application/json; charset=UTF-8' ``` `api/topics` ```sh curl -X POST http://localhost:7001/api/topics --data '{"title":"topic1", "content": "topic1 content"}' --header 'Content-Type:application/json; charset=UTF-8' ``` 筆者也把這個專案部署到了 * [k8seggjs.hacker-linner.com->點我](https://k8seggjs.hacker-linner.com/) * [k8seggjs.hacker-linner.com](https://k8seggjs.hacker-linner.com/) * [k8seggjs.hacker-linner.com](https://k8seggjs.hacker-linner.com/) ## 上雲實戰 **(示例已提供,可直接做實驗)** ### Scripts `package.json` 這裡簡單調整為: ```sh "start": "egg-scripts start --workers=1 --title=egg-server-k8s-eggjs-promethues", ``` **最好是單程序啟動,應用容器的編排完全交給 kubernetes。** [Egg 關於 K8S 部署的相關 issues](https://github.com/eggjs/egg/issues?q=k8s) ### Docker Image 準備 檔案位於 `docker/Dockerfile.prod` ```Dockerfile FROM node:15-alpine RUN ln -sf /usr/share/zoneinfo/Asia/ShangHai /etc/localtime RUN echo "Asia/Shanghai" > /etc/timezone COPY package.json /app/dependencies/package.json COPY yarn.lock /app/dependencies/yarn.lock RUN cd /app/dependencies \ && yarn install --frozen-lockfile --registry=https://registry.npm.taobao.org \ && yarn cache clean \ && mkdir /app/egg \ && ln -s /app/dependencies/node_modules /app/egg/node_modules COPY ./ /app/egg/ WORKDIR /app/egg EXPOSE 7001 CMD npm run start ``` 構建`Image` ```sh docker build -f docker/Dockerfile.prod -t k8s-eggjs-promethues:1.0.0 . --no-cache ``` 打個 `tag`,筆者試驗映象是放在阿里雲的(公司有自己的私有倉庫) ```sh docker tag k8s-eggjs-promethues:1.0.0 registry.cn-shenzhen.aliyuncs.com/hacker-linner/k8s-eggjs-promethues:1.0.0 ``` 推送到阿里雲 ```sh docker push registry.cn-shenzhen.aliyuncs.com/hacker-linner/k8s-eggjs-promethues:1.0.0 ``` ### Helm Chart(k8s-helm-charts) (示例專案已提供,可直接做實驗) **生成部署 Chart** ```sh mkdir k8s-helm-charts && cd k8s-helm-charts helm create k8seggjs ``` 我們複製一份 `k8seggjs/values.yaml` 到外層與 `k8seggjs` 資料夾同級(`k8s-helm-charts/values.yaml`)。 **`k8s-helm-charts/values.yaml`做如下修改:** ```yaml replicaCount: 3 # 部署副本我用3個例項做負載均衡,保證服務可用 image: repository: registry.cn-shenzhen.aliyuncs.com/hacker-linner/k8s-eggjs-promethues # 映象變為剛上傳 pullPolicy: Always # 映象拉取策略可直接用預設`IfNotPresent` # apiPort,metricsPort 預設模板沒有, # 這裡我對 template 裡面的 ingress.yaml service.yaml deployment.yaml 檔案做了相應改動 service: type: ClusterIP apiPort: 7001 # 這個 API 服務的埠 metricsPort: 7777 # 這個是 prometheus 所需的 metrics 埠 # Ingress Controller,根據你的環境決定,我這裡用的是 traefik ingress: enabled: true annotations: ingress.kubernetes.io/ssl-redirect: "true" ingress.kubernetes.io/proxy-body-size: "0" kubernetes.io/ingress.class: "traefik" traefik.ingress.kubernetes.io/router.tls: "true" traefik.ingress.kubernetes.io/router.entrypoints: websecure hosts: - host: k8seggjs.hacker-linner.com paths: - / tls: - secretName: hacker-linner-cert-tls hosts: # 做資源限制,防止記憶體洩漏,交給 K8S 殺掉然後重啟,保證服務可用 resources: limits: cpu: 100m memory: 128Mi requests: cpu: 100m memory: 128Mi ``` **建立部署 Namespace** ```sh kubectl create ns k8seggjs ``` **使用 Helm 部署** ```sh helm install k8seggjs ./k8seggjs -f values.yaml -n k8seggjs # 解除安裝:helm uninstall k8seggjs -n k8seggjs ``` ![](https://img2020.cnblogs.com/blog/436453/202012/436453-20201202142311024-766805340.png) ### ServiceMonitor(k8s-prometheus) **RBAC 設定** ```yaml apiVersion: rbac.authorization.k8s.io/v1 kind: RoleList items: - apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: prometheus-k8s-k8seggjs namespace: k8seggjs rules: - apiGroups: - "" resources: - services - endpoints - pods verbs: - get - list - watch --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBindingList items: - apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: prometheus-k8s-k8seggjs namespace: k8seggjs roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: prometheus-k8s-k8seggjs subjects: - kind: ServiceAccount name: prometheus-k8s namespace: monitoring ``` **指標 Service 設定** ```yaml apiVersion: v1 kind: Service metadata: namespace: k8seggjs name: k8seggjs-metrics labels: k8s-app: k8seggjs-metrics annotations: prometheus.io/scrape: 'true' prometheus.io/scheme: http prometheus.io/path: /metrics prometheus.io/port: "7777" spec: selector: app.kubernetes.io/name: k8seggjs ports: - name: k8seggjs-metrics port: 7777 targetPort: 7777 protocol: TCP ``` **ServiceMonitor 設定** ```yaml apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: k8seggjs namespace: monitoring spec: endpoints: - bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token interval: 5s port: k8seggjs-metrics jobLabel: k8s-app namespaceSelector: matchNames: - k8seggjs selector: matchLabels: k8s-app: k8seggjs-metrics ``` **應用** ```sh kubectl apply -f ServiceMonitor.yaml ``` ![](https://img2020.cnblogs.com/blog/436453/202012/436453-20201202142409364-30486130.png) ![](https://img2020.cnblogs.com/blog/436453/202012/436453-20201202142429581-192092349.png) ![](https://img2020.cnblogs.com/blog/436453/202012/436453-20201202142438533-1036128369.png) ### egg-exporter & egg-prometheus [egg-exporter](https://github.com/jianglin-wu/egg-exporter),Egg.js 的 Prometheus 指標收集外掛,附帶 Grafana 看板。 [egg-prometheus](https://github.com/eggjs/egg-prometheus),Prometheus plugin for Egg.js。 示例專案的指標收集就是用的這個。 ### Grafana (k8s-grafana) `dashboard-metrics.json`,完整的面板 json。來自於[egg-exporter](https://github.com/jianglin-wu/egg-exporter)。筆者這裡做了 `metrics` 字首的調整。 ```js config.exporter = { scrapePort: 7777, scrapePath: '/metrics', prefix: 'k8seggjs_', defaultLabels: { stage: process.env.NODE_ENV }, }; ``` **我們匯入 `json` 檔案進行 `Grafana` 面板建立** ![](https://img2020.cnblogs.com/blog/436453/202012/436453-20201202142523279-1058537878.png) **修改面板 `Variables`** ![](https://img2020.cnblogs.com/blog/436453/202012/436453-20201202142539764-1956099734.png) **`$stage`** * Query: `k8seggjs_nodejs_version_info{worker="app"}` * Regex: `/.*stage="([^"]*).*/` ![](https://img2020.cnblogs.com/blog/436453/202012/436453-20201202142552624-1555885004.png) **`$appname`** * Query: `k8seggjs_nodejs_version_info{worker="app"}` * Regex: `/.*app="([^"]*).*/` ![](https://img2020.cnblogs.com/blog/436453/202012/436453-20201202142612994-529374535.png) **`$node`** * Query: `k8seggjs_nodejs_version_info{worker="app"}` * Regex: `/.*instance="([^"]*).*/` ![](https://img2020.cnblogs.com/blog/436453/202012/436453-20201202142626858-1245612777.png) **最終效果** ![](https://img2020.cnblogs.com/blog/436453/202012/436453-20201202142640696-1078361771.png) ## Refs * [當egg遇見K8s會發生什麼?](https://developer.aliyun.com/article/725568) * [egg-exporter](https://github.com/jianglin-wu/egg-exporter) * [egg-prometheus](https://github.com/eggjs/egg-prometheus) * [filter-variables-with-regex](https://grafana.com/docs/grafana/latest/variables/filter-variables-with-regex/) ## 互相交流學習 我的微信:

相關推薦

EggJS 原生應用實戰Kubernetes+Traefik+Helm+Prometheus+Grafana,提供 Demo

## 介紹 這是一個關於 [Egg.js](https://eggjs.org/zh-cn/) 應用上雲☁️的**示例**,筆者所在的大前端團隊的已應用於生產。 `CI/CD` & `DevOps` & `GitOps` & `HPA` 等這裡暫不做討論,因為每一個點篇幅都很長。 ### 我這裡的實驗條

jeesite應用實戰數據增刪改查

mar 但是 pat cda 關聯 HA AR TP 字典 jeesite配置指南(官方文檔有坑,我把坑填了!)這篇文章裏,我主要把jeesite官方給出的幫助文檔的坑填了,按照裏面的方法可以搭建起來jeesite的站點。系統可以運行以後,就可以進入開發模塊了,我們先從數據

原生應用的10大關鍵屬性

交互 持久性 例如 自我 tle padding ctu 持久 縮小 “雲原生(Cloud Native)”是用於描述基於容器的環境的術語。雲原生技術被用於開發應用程序,這些應用程序是使用容器打包的服務構建的、被部署為微服務、並通過靈活的DevOps流程和持續交付工作流在彈

如何提高阿里應用的可用性

這是如何提高阿里雲上應用的可用性系列文章的第二篇,第一篇傳送門。 在單體應用時代,最大的問題是如何解決資料庫瓶頸,而微服務之下,一個大應用被拆分成了幾十個甚至上百個微服務,資料訪問的壓力被傳導到了服務之間的網路,服務強弱依賴,服務雪崩等各種問題隨之而來,那麼如何保障服務的可用性以及整個應用的健壯性呢?常見的

如何提高阿里應用的可用性

摘要: 如今,開發並上線一款應用十分方便。因為雲端計算提供了從最基礎的計算資源如伺服器網路、資料庫服務、中介軟體PaaS平臺到各種應用支撐的雲管理服務,同時開源社群的迅猛發展也提供了從資料庫、快取到應用全生命流程中各種必須的元件,所以越來越多的應用開發者可以把精力放在業務創新上。 如今,開發並上線一款應用十

如何提高阿裏應用的可用性

依賴 服務 技術 動態 應用 接下來 agen rod 雲計 摘要: 如今,開發並上線一款應用十分方便。因為雲計算提供了從最基礎的計算資源如服務器網絡、數據庫服務、中間件PaaS平臺到各種應用支撐的雲管理服務,同時開源社區的迅猛發展也提供了從數據庫、緩存到應用全生命流程中各

如何提高阿裏應用的可用性

級別 經驗 process term 保險絲 ddb 控制 假設 cdb 摘要: 這是如何提高阿裏雲上應用的可用性系列文章的第二篇,第一篇傳送門。 在單體應用時代,最大的問題是如何解決數據庫瓶頸,而微服務之下,一個大應用被拆分成了幾十個甚至上百個微服務,數據訪問的壓力被傳導

【阿里總監課第四期】時髦的原生應用怎麼寫?

概述應用已經跨入了雲原生的時代。要寫一個時髦的雲原生應用,首先當然要了解什麼是雲原生。CNCF,也就是雲原生計算基金會,作為目前人氣最旺的雲端計算行業協會,在今年6月份給出了雲原生的定義,阿里雲牽頭做了一個官方的翻譯: “雲原生技術有利於各組織在公有云、私有云和混合雲等新型動態環境中,構建和執行可彈性擴充套

阿里總監課第四期,時髦的原生應用怎麼寫?

概述 應用已經跨入了雲原生的時代。要寫一個時髦的雲原生應用,首先當然要了解什麼是雲原生。CNCF,也就是雲原生計算基金會,作為目前人氣最旺的雲端計算行業協會,在今年6月份給出了雲原生的定義,阿里雲牽頭做了一個官方的翻譯: “雲原生技術有利於各組織在公有云、私有云和混合雲等新型動態環境中,

阿里學生機搭建FTP實戰日後完善

機型 1核2G 40SSD 應用映象 LNMP環境 基於CentOS 7.x **老規矩 科普(不喜直接跳過) **【轉】 我們知道計算機網路具有五層結構: 物理層 鏈路層 網路層 傳輸層 應用層 在每一層都有其特有的協議幫助資料進行通訊交流。比如我們比較熟悉的

Kubernetes上基於Istio體驗原生應用實踐 資料下載

Service Mesh被認為是繼Kubernetes之後當前最為熱門技術方向,在過去一年中已成為容器行業的排名第一的流行詞。Service Mesh可以極大地簡化使用者體驗,並將大中型企業的Kubernetes落地引領進下一個全新階段,被業界普遍認為是新一代的微服務架構的最佳技術設計。 從容器技術發展來看

開源應用 Docker App 加入 CNAB 規範,實現原生應用的統一管理

出品丨Docker公司(ID:docker-cn)編譯丨小東每週一、三、五,與您不見不散! Docker App 是我們在2018 DockerCon 美國大會上簡要介紹的一款新工具。我們一直致力於“Docker APP”的開發,使容器應用程式更易於在不同團隊和不同環境之間共享和管理,我們還將其

詳解原生應用實踐與未來趨勢_Kubernetes中文社群

近日,愛分析在京舉辦了 2018 愛分析·中國雲端計算高峰論壇,本次論壇以“雲化萬物,智動未來”為主題,探討雲端計算行業的發展趨勢。愛分析邀請了雲端計算領域標杆公司時速雲創始人&CEO 黃啟功進行主題演講。 黃啟功認為,企業採用基於雲原生的技術和管理方法,可以更好地把業

沃趣科技加入CNCF(原生應用計算基金會),共建Cloud

北京時間2018年2月28日,沃趣科技正式加入雲原生應用計算基金會 (Cloud Native Computing Foundation,以下簡稱CNCF)。沃趣科技基於Kubernetes和Docker的國內首款雲原生私有RDS平臺也即將釋出。 按照CNCF的規則,根據企業會員對程式碼的貢

軟體基礎設施支撐原生應用_Kubernetes中文社群

雙12福利預告: 12月12日,K8S技術社群聯合EasyStack為國內社群使用者精彩送上“赴美大咖團國內首輪直播訪談”,為大家解讀KubeCon北美峰會最新最熱議題內容!點此免費報名! Kubecon / CloudNativeCon 2017北美峰會 奧斯汀時間12月6日9點,北京時間12月6日23點

Kubernetes原生應用程式庫,分散式應用程式編寫架構Metaparticle_Kubernetes中文社群

自動部署、擴充套件和管理Container應用程式的開源系統Kubernetes共同創辦人Brendan Burns於KubeCon上,發表分散式應用程式編寫架構Metaparticle,這是一套為雲原生應用程式而生的Kubernetes標準庫,目的是讓開發者使用自己熟悉的程式語言,就能開發分

阿里開源!原生應用自動化引擎 OpenKruise | 直擊 KubeCon

在近期開展的 KubeCon China 2019 上,阿里雲將陸續為全球使用者分享阿里巴巴超大規模雲原生落地實踐、雲原

原生應用 Kubernetes 監控與彈性實踐

前言   雲原生應用的設計理念已經被越來越多的開發者接受與認可,而Kubernetes做為雲原生的標準

第一屆原生應用大賽火熱報名中! helm install “一鍵安裝”應用觸手可及!

雲原生應用,是指符合“雲原生”理念的應用開發與交付模式,這是當前在雲時代最受歡迎的應用開發最佳實踐。 在現今的雲原生生態當中,已

使用Velero Restic快速完成原生應用遷移至ACK叢集

本文記錄使用Velero Restic快速完成雲原生應用遷移至ACK叢集的實踐過程。 0. 實踐步驟概覽 (1)建立GKE叢