OneDegree SRE 架構大揭秘

Tony Pai
OneDegree Tech Blog
6 min readJul 29, 2022

這次 OneDegree SRE Team 想來跟大家分享在各個產品的系統架構,上一篇文章 OneDegree SRE 團隊大揭秘中有提到 OneDegree 的事業體有三個,分別是 ODHK、IXT 以及 Cymetrics,但礙於篇幅,本篇僅介紹 ODHK 和 IXT。

ODHK

ODHK Infra Diagram

首先,我們從網路層開始,外部流量首先會抵達啟用了 Web Application Firewall 的 Application Gateway,接下來根據 Domain 分別流向坐落在不同 Subnet 的 Front End 以及 Back End 的 Azure Kuberentes Service(以下稱 AKS)實體,在實際接觸到應用程式(以下稱 AP)之前,會先流經 Nginx Ingress,通過 Rate Limit 和 Whitelist IP 之後,最後才會觸碰到 AP。

從 AKS 本身出去的流量會分成兩個方向,一個往外部網路,一個往 SaaS 服務,往外部網路走 NAT Gateway,往 SaaS 服務的部分,我們採取 Zero Trust 原則,將服務提供的 Password、Secret Key 和 Token 存放在 Key Vault,每次請求都須經過驗證,而且只信任來自特定網路的請求,這裡稍微提一下環境的拆分,我們有 DEV、SIT、UAT 和 PROD 四個環境,前後端又分別用 AKS 實體分開,也就是說我們可以很明確的限制 Key Vault 只接受來自特定環境而且是 Back End 的請求。

圖的最下方我們可以看到一些第三方服務,像是 New Relic 效能調校、Sentry 錯誤追蹤、Cloudinary CDN 和圖像處理等。適當地使用第三方服務,不僅可以讓開發人員更有效率,也能夠減少 SRE 人天的耗損,能夠更專注在問題解決、架構優化或減少成本等更具價值的事情上。

Deployment Flow

再來講部署的部分,我們建立了一個專門用來部署的 GitLab Repo(以下稱為 Deploy Repo),裡面會存有部署的相關資訊以及腳本,除了不會跟產品原始碼混在一起之外也方便管理,但開發人員要怎麼去部署呢?我們在對應產品的 GitLab Repo(以下稱 Service Repo)預先建置了 Deploy Job,Service Repo 的 GitLab CI 會在 Merge Request 合併回 Develop 分支的時候產生 Pipeline,開發人員觸發 Deploy Job,Service Repo 便會對 Deploy Repo 發起部署請求,由 Deploy Repo 去執行部署行為,同時 Service Repo 也會追蹤執行結果,因此即便是開發人員也能順利完成部署。

IXT

IXT Infra Diagram

IXT 為了因應各地市場規範,將現有的架構分成雲端和地端,上圖為 IXT 的雲端架構,基本上與 ODHK 的架構並無太大不同。而地端架構主要是因應客戶需求,分成有前台和沒有前台兩種架構,這裡所謂的前台就好比我們平常購買保險的網路投保平台,包含網站的首頁以及購買流程,如果客戶已經有自己的前台,也可以直接藉由 IXT 提供的標準化 API 做整合。

IXT w/ Front End Solution
IXT w/o Front End Solution

客戶如果希望於地端部署,流程上我們會先提供系統架構以及硬體清單,客戶或與客戶配合的廠商會準備好硬體,然後我們會同時在 Azure 建置開發環境,然後協助客戶建置生產環境,生產環境的建置主要會碰到三個難點,第一是網路環境,第二是作業系統,第三是服務整合。網路環境的部分,最好的情況是客戶能夠給 Diagram,如果沒有就只能相信對面的工程師了,當然也會有要我們 On Site 去蓋生產環境的情況。作業系統的部分,我們透過撰寫 Ansible 腳本去減少原本的手動建置環境的不一致性。而服務整合則是相對花最多時間的地方,因為除了要同時確保上述兩項正常運作之外,還有我們的 AP 以及對方的 AP。

Monitoring

Monitoring Stack

最後來談談監控和告警的部分,目前的 Monitoring Stack 分成 Health Checking、Routine Failure、Resource Health 和 Application Error。

  1. Health Checking 由 Uptime Kuma 負責,它會定期對生產環境的服務做 Health Check 和 SSL Check。
  2. Routine Failure 會在我們內部的 Routine Job 執行失敗時發出告警。
  3. Resource Health 主要是由 Azure Monitor 在發生 Incident 或有即將到來的 Planned Maintenance 時去發出告警。
  4. Application Error 是由 Grafana 和 Elastic Cloud 一同建立的告警機制,目前 Grafana 主要是監控 Node 和 Container Metrics,而 Elastic Cloud 則是比對 AP Log 是否有 HTTP Error。

結語

今年參加了 Taiwan Cloud Summit 2022,看到今年的議題已經大多是 Kubernetes 的形狀了,所以我們也有在思考地端方案使用 Kubernetes 的可行性,但… 實際上也是要考量客戶能不能接受以及後續維護。其他還有很多坑像是 Security、IaC 或 Service Mesh 等等,完成到一個階段之後再來跟大家分享吧。

(題外話)原先一直想不到標題要怎麼下才好,後來乾脆延續之前的名稱,所以之後可能會變成「大揭秘」系列吧?

--

--