介紹
OAM是構建雲原生應用程式的規範專注於分離開發和運營需求,Open Application Model將模組化,可擴充套件和可移植的設計引入到Kubernetes等平臺上,以構建和交付應用程式。rudr是開放應用模型規範(oam)的Kubernetes實現,允許使用者輕鬆地在任何Kubernetes叢集上部署和管理應用程式,而無需擔心應用程式開發人員和運營商的問題
Rudr目前處於Alpha狀態。它可能反映了我們納入Open App Model規範之前正在審查的API或功能
使用者希望專注於輕鬆地描述和構建應用程式,但是使用Kubernetes直接實現這一點很複雜。從本質上講,容器編排平臺將應用程式原語與基礎結構原語密不可分。開發人員和操作人員等不同角色必須彼此關注彼此域中的問題,以便了解底層基礎結構的整體情況。深入了解容器基礎架構的要求為應用程式部署和管理引入了以下問題
沒有針對雲原生應用程式的標準定義,這使使用者難以尋找更簡便的現代化方法。有許多工具和方法可以完成任務。一方面,這是積極的,因為它使使用者可以自由選擇自己的路徑。但是,對於正在尋找自以為是的方式的使用者而言,這是一個機會在基礎設施運營商,應用程式運營商和開發人員之間很難明確區分角色。使用者接觸到其域外的結構,他們必須學習這些結構才能完成日常任務方法:讓我們一次邁出一步這使應用程式開發人員可以專注於構建OAM元件,應用程式運營商可以通過OAM應用程式配置來專注於運營功能,而基礎架構運營商可以專注於Kubernetes通過利用開放應用程式模型,使用者現在擁有一個框架,可以在其Kubernetes叢集上定義其應用程式目前,Rudr將利用已定義的特徵來完成任務。這樣就可以自由使用使用者想要的任何基礎工具,同時提供著重於功能而不是技術的特徵。將來,Rudr可能會提供一組預設技術來提供特徵所需的功能。從頭開始建立應用
在本教程中,我們將構建一個用Python編寫的簡單Web應用程式元件,您可以將其用於測試。它讀取一個環境變數TARGET並顯示”Hello $ {TARGET}!”。如果未指定TARGET,它將使用”world”作為TARGET
先決條件
現有的k8s叢集,當前支援1.15以上版本安裝rudr
安裝rudr,kubectl,helm
git clone https://github.com/oam-dev/rudr.gitcurl -LO "https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/darwin/amd64/kubectl"wget https://get.helm.sh/helm-v3.0.0-linux-amd64.tar.gztar xf helm-v3.0.0-linux-amd64.tar.gzcp helm /usr/local/bin/helmhelm install rudr ./charts/rudr --wait --set image.tag=v1.0.0-alpha.1驗證安裝
kubectl get crds -l app.kubernetes.io/part-of=core.oam.devkubectl get deployment rudr升級rudr
helm upgrade rudr charts/rudr解除安裝rudr
kubectl delete crd -l app.kubernetes.io/part-of=core.oam.dev安裝具體特性的實現
Rudr提供了多個特徵,包括入口和自動縮放器。但是,它不會安裝其中一些的預設實現。這是因為它們對映到可由不同控制器實現的原始Kubernetes功能。查詢符合您的特徵的實現的最佳位置是Helm Hub。
手動縮放
手動縮放沒有外部依賴性
ingress
要成功使用ingress特性,您將需要安裝Kubernetes入口控制器之一。我們建議使用nginx-ingress。
首先,將穩定版本庫新增到您的Helm安裝中。helm repo add stable https://kubernetes-charts.storage.googleapis.com/使用Helm 3安裝NGINx ingresshelm install nginx-ingress stable/nginx-ingress您仍然還必須管理DNS配置。如果您也無法控制example.com的域對映,則無法將入口對映到example.com。使用rudr一旦安裝了Rudr,就可以開始建立和部署應用程式。部署應用程式的第一步是部署其組成元件。在部署元件的父應用程式之前,該元件實際上不會執行。但是,必須先部署它,然後再部署應用程式首先,安裝示例元件:
$ kubectl apply -f examples/helloworld-python-component.yaml該元件聲明了一個用Python編寫的簡單Web應用程式。您可以閱讀Scratch文件中的建立元件以了解我們如何構建它。之後,您可以使用kubectl列出所有可用的元件:
$ kubectl get componentschematicsNAME AGEhelloworld-python-v1 14s您可以檢視單個元件
$ kubectl get componentschematic helloworld-python-v1 -o yamlapiVersion: core.oam.dev/v1alpha1kind: ComponentSchematicmetadata: creationTimestamp: "2019-10-08T13:02:23Z" generation: 1 name: helloworld-python-v1 namespace: default resourceVersion: "1989944" ...spec: containers: - env: - fromParam: target name: TARGET# ... more YAML檢視Trait
Rudr提供了一種在安裝時附加操作功能的方法。這使應用程式操作有機會在安裝時提供自動縮放,快取或入口控制等功能,而無需開發人員更改元件中的任何內容。您還可以列出Rudr上可用的特徵:
$ kubectl get traitsNAME AGEautoscaler 19mingress 19mmanual-scaler 19mvolume-mounter 19m您可以像研究元件一樣檢視單個特徵:
$ kubectl get trait ingress -o yamlapiVersion: core.oam.dev/v1alpha1kind: Traitmetadata: creationTimestamp: "2019-10-02T19:57:37Z" generation: 1 name: ingress namespace: default resourceVersion: "117813" selfLink: /apis/core.oam.dev/v1alpha1/namespaces/default/traits/ingress uid: 9f82c346-c8c6-4780-9949-3ecfd47879f9spec: appliesTo: - core.oam.dev/v1alpha1.Server - core.oam.dev/v1alpha1.SingletonServer properties: - description: Host name for the ingress name: hostname required: true type: string - description: Port number on the service name: service_port required: true type: int - description: Path to expose. Default is '/' name: path required: false type: string上面描述了一種Trait,該Trait將入口附加到元件上,處理到該應用的流量路由
安裝應用程式配置
當您準備嘗試安裝某些產品時,請檢視examples/first-app-config.yaml,它顯示了應用了單個trait的基本應用程式配置:
apiVersion: core.oam.dev/v1alpha1kind: ApplicationConfigurationmetadata: name: first-appspec: components: - componentName: helloworld-python-v1 instanceName: first-app-helloworld-python-v1 parameterValues: - name: target value: Rudr - name: port value: '9999' traits: - name: ingress parameterValues: - name: hostname value: example.com - name: path value: / - name: service_port value: 9999這是一個應用程式的示例,該應用程式由單個元件組成,該元件的入口特徵為example.com,服務埠為9999。要安裝此應用程式配置,請使用kubectl:
$ kubectl apply -f examples/first-app-config.yamlconfiguration.core.oam.dev/first-app created您需要等待一兩分鐘才能完全部署它。在幕後,Rudr正在建立所有必要的物件。 完全部署後,您可以看到您的配置:
$ kubectl get configurationsNAME AGEfirst-app 4m23s$ kubectl get configuration first-app -o yamlapiVersion: core.oam.dev/v1alpha1kind: ApplicationConfigurationmetadata: annotations: ... creationTimestamp: "2019-10-08T12:39:07Z" generation: 6 name: first-app namespace: default resourceVersion: "2020150" selfLink: /apis/core.oam.dev/v1alpha1/namespaces/default/applicationconfigurations/first-app uid: 2ea9f384-993c-42b0-803a-43a1c273d291spec: components: - instanceName: first-app-helloworld-python-v1 componentName: helloworld-python-v1 parameterValues: - name: target value: Rudr - name: port value: "9999" traits: - name: ingress parameterValues: - name: hostname value: example.com - name: path value: / - name: service_port value: 9999status: components: helloworld-python-v1: deployment/first-app-helloworld-python-v1: running ingress/first-app-helloworld-python-v1-trait-ingress: Created service/first-app-helloworld-python-v1: created phase: synced訪問web服務
export POD_NAME=$(kubectl get pods -l "oam.dev/instance-name=first-app-helloworld-python-v1,app.kubernetes.io/name=first-app" -o jsonpath="{.items[0].metadata.name}")echo "Visit http://127.0.0.1:9999 to use your application"kubectl port-forward $POD_NAME 9999:9999kubectl port-forward 命令將阻塞並處理您的請求。您將獲得以下輸出:
Hello Rudr!升級應用程式配置檔案
現在,我們已經成功安裝了Web應用程式並檢查了結果,該應用程式執行良好。但是總有一天,操作員可能需要更改某些內容。例如:
hostname:可能是因為與其他應用程式發生衝突,假設我們將主機名更改為oamexample.com。env(target): 假設我們將目標的值更改為World,這可能代表一些正常的更新情況更改應用程式配置檔案
因此,您可以如下更改first-app-config.yaml:
apiVersion: core.oam.dev/v1alpha1kind: ApplicationConfigurationmetadata: name: first-appspec: components: - componentName: helloworld-python-v1 instanceName: first-app-helloworld-python-v1 parameterValues: - name: target- value: Rudr+ value: World - name: port value: '9999' traits: - name: ingress parameterValues: - name: hostname- value: example.com+ value: oamexample.com - name: path value: / - name: service_port value: 9999應用更改的檔案
再次,我們應用這個yaml:
$ kubectl apply -f examples/first-app-config.yamlapplicationconfiguration.core.oam.dev/first-app configured檢查更新的應用
然後先檢查應用的Yaml:
$ kubectl get configuration first-app -o yamlapiVersion: core.oam.dev/v1alpha1kind: ApplicationConfigurationmetadata: annotations: ... creationTimestamp: "2019-10-08T12:39:07Z" generation: 9 name: first-app namespace: default resourceVersion: "2022598" selfLink: /apis/core.oam.dev/v1alpha1/namespaces/default/applicationconfigurations/first-app uid: 2ea9f384-993c-42b0-803a-43a1c273d291spec: components: - instanceName: first-app-helloworld-python-v1 componentName: helloworld-python-v1 parameterValues: - name: target value: World - name: port value: "9999" traits: - name: ingress parameterValues: - name: hostname value: oamexample.com - name: path value: / - name: service_port value: 9999status: components: helloworld-python-v1: deployment/first-app-helloworld-python-v1: running ingress/first-app-helloworld-python-v1-trait-ingress: Created service/first-app-helloworld-python-v1: created phase: synced您可以看到欄位已更改。再次,通過執行以下命令獲取應用程式URL:
export POD_NAME=$(kubectl get pods -l "oam.dev/instance-name=first-app-helloworld-python-v1,app.kubernetes.io/name=first-app" -o jsonpath="{.items[0].metadata.name}")echo "Visit http://127.0.0.1:9999 to use your application"kubectl port-forward $POD_NAME 9999:9999讓我們再次訪問該Web應用程式並找到以下結果:
Hello World!響應表明我們的環境更改成功。
更改升級後的元件
假設已經過去了幾天,並且開發人員已經開發了Web應用程式的新版本例如,我們將響應的字首從Hello更改為Goodbye,然後製作一個名為helloworld-python-v2的新元件。您可以在升級元件中找到有關我們如何建立它的更多詳細資訊。
更改並應用應用程式配置檔案
我們需要更改並應用配置檔案以使元件升級工作。
apiVersion: core.oam.dev/v1alpha1kind: ApplicationConfigurationmetadata: name: first-appspec: components:- - componentName: helloworld-python-v1+ - componentName: helloworld-python-v2- instanceName: first-app-helloworld-python-v1+ instanceName: first-app-helloworld-python-v2 parameterValues: - name: target value: World - name: port value: '9999' traits: - name: ingress parameterValues: - name: hostname value: oamexample.com - name: path value: / - name: service_port value: 9999應用它:
$ kubectl apply -f examples/first-app-config.yamlapplicationconfiguration.core.oam.dev/first-app configured檢查升級結果
您可以自己再次檢查應用的yaml。您應該找到元件名稱已更改。 讓我們直接訪問該網站:
$ curl oamexample.comGoodbye World!更新的Web應用程式執行良好!現在,我們已經成功地使我們的新元件正常工作。這可能更容易,因為開發人員只需要關心元件更新,而操作員只需要關心應用程式配置。
解除安裝應用程式
$ kubectl delete configuration first-appconfiguration.core.oam.dev "first-app" deleted這將刪除您的應用程式和所有相關資源。它不會刪除特徵和元件,它們很高興在下一個應用程式配置中等待您的使用
$ kubectl get traits,componentsNAME AGEtrait.core.oam.dev/autoscaler 31mtrait.core.oam.dev/empty 31mtrait.core.oam.dev/ingress 31mtrait.core.oam.dev/manual-scaler 31mNAME AGEcomponent.core.oam.dev/alpine-replicable-task 19hcomponent.core.oam.dev/alpine-task 19hcomponent.core.oam.dev/hpa-example-replicated 19hcomponent.core.oam.dev/nginx-replicated 19hcomponent.core.oam.dev/nginx-singleton 19hrudr基於OAM集成了雲原生應用程式所需要的ingress,scale,volume等周邊的管理功能,從而更加快捷的進行定義