| 介绍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
 先决条件 安装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.gz
 tar xf helm-v3.0.0-linux-amd64.tar.gz
 cp helm /usr/local/bin/helm
 helm 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 helm delete rudr
 这样删除将保留CRD,可以通过以下命令删除CRD 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 AGE
 helloworld-python-v1 14s
 
 您可以查看单个组件 $ kubectl get componentschematic helloworld-python-v1 -o yamlapiVersion: core.oam.dev/v1alpha1
 kind: ComponentSchematic
 metadata:
 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 AGE
 autoscaler 19m
 ingress 19m
 manual-scaler 19m
 volume-mounter 19m
 
 您可以像研究组件一样查看单个特征: $ kubectl get trait ingress -o yamlapiVersion: core.oam.dev/v1alpha1
 kind: Trait
 metadata:
 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-3ecfd47879f9
 spec:
 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: ApplicationConfiguration
 metadata:
 name: first-app
 spec:
 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 AGE
 first-app 4m23s
 $ kubectl get configuration first-app -o yaml
 apiVersion: core.oam.dev/v1alpha1
 kind: ApplicationConfiguration
 metadata:
 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-43a1c273d291
 spec:
 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: 9999
 status:
 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服务 在不同平台上,访问Web应用程序的方式可能有所不同让我们使用端口转发通过运行以下命令来帮助我们获取应用程序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
 
kubectl port-forward 命令将阻塞并处理您的请求。您将获得以下输出:
 Hello Rudr!
 升级应用程序配置文件 现在,我们已经成功安装了Web应用程序并检查了结果,该应用程序运行良好。但是总有一天,操作员可能需要更改某些内容。例如: hostname:可能是因为与其他应用程序发生冲突,假设我们将主机名更改为oamexample.com。env(target): 假设我们将目标的值更改为World,这可能代表一些正常的更新情况
 更改应用程序配置文件 因此,您可以如下更改first-app-config.yaml: apiVersion: core.oam.dev/v1alpha1kind: ApplicationConfiguration
 metadata:
 name: first-app
 spec:
 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/v1alpha1
 kind: ApplicationConfiguration
 metadata:
 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-43a1c273d291
 spec:
 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: 9999
 status:
 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: ApplicationConfiguration
 metadata:
 name: first-app
 spec:
 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轻松删除配置 $ kubectl delete configuration first-appconfiguration.core.oam.dev "first-app" deleted
 
 这将删除您的应用程序和所有相关资源。它不会删除特征和组件,它们很高兴在下一个应用程序配置中等待您的使用
 $ kubectl get traits,componentsNAME AGE
 trait.core.oam.dev/autoscaler 31m
 trait.core.oam.dev/empty 31m
 trait.core.oam.dev/ingress 31m
 trait.core.oam.dev/manual-scaler 31m
 NAME AGE
 component.core.oam.dev/alpine-replicable-task 19h
 component.core.oam.dev/alpine-task 19h
 component.core.oam.dev/hpa-example-replicated 19h
 component.core.oam.dev/nginx-replicated 19h
 component.core.oam.dev/nginx-singleton 19h
 
 rudr基于OAM集成了云原生应用程序所需要的ingress,scale,volume等周边的管理功能,从而更加快捷的进行定义  |