5分鐘帶你快速入門和了解 OAM Kubernetes

KAnts發表於2020-07-15

什麼是 OAM?

OAM 的全稱為開放應用模型(Open Application Model),由阿里巴巴宣佈聯合微軟共同推出。

OAM 解決了什麼問題?

OAM 本質是為了解耦K8S中現存的形形色色的資源,讓每個角色的關注點更為集中和專注。

舉個例子,我們在生產環境中部署了Deployment資源,其中容器的image,健康檢查,資源請求開發人員一般會了然於胸,但涉及到Pod副本數、PV、PVC、網路頻寬、網路策略、對外負載配置等,一般的開發人員根本無從下手。

為什麼會無從下手?原因很簡單,正常的開發人員根本不會有這些內容的許可權,而且絕大部分開發人員沒有公司資源的監控資料,無法對應用所使用的資源進行平衡。最簡單的情況,如果開放了CPU、記憶體、共享儲存大小、網路頻寬的上限配置,我相信很多人一上來就設定為8C,16GB,100GB,100MB這樣奢侈配置,實際的叢集資源能支援幾個這樣的應用呢?

所以這類的事情更適合應用運維人員去做,當然應用運維的人員也需要一定的水準。應用運維人員可以根據監控和告警按需的對CPU、記憶體、共享儲存、網路等資源進行彈性伸縮,甚至可以從監控資料中發現一定的規律配置自動的程式來進行自動擴縮容,例如HPA、CronHPA。

OAM 是如何解決這些問題的?

在 OAM 體系中大致分了三個角色,分別為:

  • 基礎設施運維人員
    負責開發、安裝和維護各種 Kubernetes 級別的功能。具體工作包括但不限於維護大規模的 K8s 叢集、實現控制器/Operator,以及開發各種 K8s 外掛。在公司內部,我們通常被稱為“平臺團隊(Platform Builder)
  • 業務研發人員
    以程式碼形式傳遞業務價值。大多數業務研發都對基礎設施或 K8s 不甚瞭解,他們與 PaaS 和 CI 流水線互動以管理其應用程式。業務研發人員的生產效率對公司而言價值巨大。
  • 應用運維人員
    為業務研發人員提供有關叢集容量、穩定性和效能的專業知識,幫助業務研發人員大規模配置、部署和執行應用程式(例如,更新、擴充套件、恢復)。請注意,儘管應用運維人員對 K8s 的 API 和功能具有一定了解,但他們並不直接在 K8s 上工作。在大多數情況下,他們利用 PaaS 系統為業務研發人員提供基礎 K8s 功能。在這種情況下,許多應用運維人員實際上也是 PaaS 工程人員。

各個角色之間的服務關係為:基礎設施運維人員 < 應用運維人員 < 業務研發人員。

與角色對應的也同樣的有三個核心內容,分別為:

  • Component(元件)
    由業務開發人員輸出,它可能包含微服務集合、資料庫和雲負載均衡器。
  • Trait(運維特徵)
    由應用運維人員管理,例如:彈性伸縮、日誌、監控、告警和 Ingress 等功能。
  • Application Configuration(應用配置)
    組合Component和Trait等內容描述應用最終能力的配置檔案。

OAM 從資源角度上就隔離了不同角色所關心的內容,而不再將這些內容混雜在一起。
整體示意圖如下:

更詳細的內容可以閱讀:《深度解讀!阿里統一應用管理架構升級的教訓與實踐

OAM 社群生態現況

由於OAM是一個新的概念,所以社群的文件目前比較混亂,下面列出還在活動並在維護的幾個倉庫。

OAM標準規範

截至目前的版本

  • 1.0.0-alpha1
  • 1.0.0-alpha2

https://github.com/oam-dev/spec

基於Crossplane的OAM 核心執行時實現

支援的OAM規範:1.0.0-alpha2
https://github.com/crossplane/oam-kubernetes-runtime

OAM工作負載、特徵、範圍集合

可以理解為非OAM Runtime必須實現的OAM外掛和擴充套件
https://github.com/oam-dev/catalog

該庫提供了以下內容:

  • Workloads
    • Containerized
    • StatefulSet
    • Deployment
    • AdvancedStatefulSet
    • CloneSet
  • Traits
    • ManualScaler(手動伸縮器)
    • trait-injector(資源注入器)
    • ServiceExpose(服務匯出)
    • IngressTrait(Ingress)
    • HPATrait(自動伸縮)
    • CronHPATrait(基於Cron表示式的定時伸縮)
    • MetricHPATrait(基於指標的自動伸縮)
    • SimpleRolloutTrait(簡單的滾動更新)
    • ServiceMonitor(服務監控器,還在PR中)
  • Scopes
    • HealthScope

不維護或過時的倉庫

這邊列出一些容易被誤導的倉庫,大家遇到了可以跳過查閱,避免繞彎路。

Rudr

實現了 OAM 規範 1.0.0-alpha1
https://github.com/oam-dev/rudr

addon-oam-kubernetes-local

被 oam-kubernetes-runtime 替代
https://github.com/crossplane/addon-oam-kubernetes-local

快速入門

先決條件

安裝

helm repo add oam https://github.com/oam-dev/crossplane-oam-sample/tree/master/archives/
kubectl create namespace oam-system
helm install crossplane --namespace oam-system oam/crossplane-oam

嘗試一個應用配置樣本

# sample_application_config.yaml

apiVersion: core.oam.dev/v1alpha2
kind: Component
metadata:
  name: example-component
spec:
  workload:
    apiVersion: core.oam.dev/v1alpha2
    kind: ContainerizedWorkload
    spec:
      containers:
        - name: my-nginx
          image: nginx:1.16.1
          resources:
            limits:
              memory: "200Mi"
          ports:
            - containerPort: 4848
              protocol: "TCP"
          env:
            - name: WORDPRESS_DB_PASSWORD
              value: ""
  parameters:
    - name: instance-name
      required: true
      fieldPaths:
        - metadata.name
    - name: image
      fieldPaths:
        - spec.containers[0].image
---
apiVersion: core.oam.dev/v1alpha2
kind: ApplicationConfiguration
metadata:
  name: example-appconfig
spec:
  components:
    - componentName: example-component
      parameterValues:
        - name: instance-name
          value: example-appconfig-workload
        - name: image
          value: nginx:latest
      traits:
        - trait:
            apiVersion: core.oam.dev/v1alpha2
            kind: ManualScalerTrait
            metadata:
              name:  example-appconfig-trait
            spec:
              replicaCount: 3
$ kubectl apply -f samples/sample_application_config.yaml
component.core.oam.dev/example-component created
applicationconfiguration.core.oam.dev/example-appconfig created
$ kubectl get manualscalertraits.core.oam.dev
NAME                      AGE
example-appconfig-trait   4s
$ kubectl get containerizedworkloads.core.oam.dev
NAME                         AGE
example-appconfig-workload   58s
$ kubectl get deploy
NAME                                    READY   UP-TO-DATE   AVAILABLE   AGE
example-appconfig-workload-deployment   3/3     3            3           114s

可以看到,通過Component和Trait、ApplicationConfiguration的抽象,開發人員和運維人員所關心的內容不再混合在一起,變得更為清晰。

最後

受限於篇幅的原因,本文簡單介紹了 OAM 概念並實踐了一個簡單的基於 OAM 概念的應用程式樣本,還沒有完全發揮 OAM 的能力。
下一節將會詳解如何一步一步使用kubebuilder為OAM新增一個基於Cron表示式定時伸縮的Train。

小夥伴們可以前往:https://github.com/oam-dev/catalog/pull/44 檢視該 Train 的 PR 情況。
CronHPATrain 目前已被 oam-dev catalog 接收併合並。

相關文章