OAM是构建云原生应用程序的规范
专注于分离开发和运营需求,Open Application Model将模块化,
可扩展和可移植的设计引入到Kubernetes等平台上,以构建和交付应用程序。
rudr是开放应用模型规范(oam)的Kubernetes实现,允许用户轻松地在任何Kubernetes集群上部署和管理应用程序,
而无需担心应用程序开发人员和运营商的问题
Rudr目前处于Alpha状态。它可能反映了我们纳入Open App Model规范之前正在审查的API或功能
用户希望专注于轻松地描述和构建应用程序,
但是使用Kubernetes直接实现这一点很复杂。
从本质上讲,容器编排平台将应用程序原语与基础结构原语密不可分。
开发人员和操作人员等不同角色必须彼此关注彼此域中的问题,以便了解底层基础结构的整体情况。
深入了解容器基础架构的要求为应用程序部署和管理引入了以下问题
在本教程中,我们将构建一个用Python编写的简单Web应用程序组件,
您可以将其用于测试。它读取一个环境变量TARGET并显示”Hello $ {TARGET}!”。
如果未指定TARGET,它将使用”world”作为TARGET
先决条件
安装rudr
安装rudr,kubectl,helm
git clone https://github.com/oam-dev/rudr.git
curl -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.dev
kubectl 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。
一旦安装了Rudr,就可以开始创建和部署应用程序。
部署应用程序的第一步是部署其组成组件。在部署组件的父应用程序之前,
该组件实际上不会运行。但是,必须先部署它,然后再部署应用程序
首先,安装示例组件:
$ kubectl apply -f examples/helloworld-python-component.yaml
该组件声明了一个用Python编写的简单Web应用程序。您可以阅读Scratch文档中的创建组件以了解我们如何构建它。
之后,您可以使用kubectl列出所有可用的组件:
$ kubectl get componentschematics
NAME AGE
helloworld-python-v1 14s
您可以查看单个组件
$ kubectl get componentschematic helloworld-python-v1 -o yaml
apiVersion: 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 traits
NAME AGE
autoscaler 19m
ingress 19m
manual-scaler 19m
volume-mounter 19m
您可以像研究组件一样查看单个特征:
$ kubectl get trait ingress -o yaml
apiVersion: 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/v1alpha1
kind: 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.yaml
configuration.core.oam.dev/first-app created
您需要等待一两分钟才能完全部署它。
在幕后,Rudr正在创建所有必要的对象。 完全部署后,您可以看到您的配置:
$ kubectl get configurations
NAME 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应用程序并检查了结果,该应用程序运行良好。但是总有一天,操作员可能需要更改某些内容。例如:
更改应用程序配置文件
因此,您可以如下更改first-app-config.yaml:
apiVersion: core.oam.dev/v1alpha1
kind: 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.yaml
applicationconfiguration.core.oam.dev/first-app configured
检查更新的应用
然后先检查应用的Yaml:
$ kubectl get configuration first-app -o yaml
apiVersion: 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/v1alpha1
kind: 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.yaml
applicationconfiguration.core.oam.dev/first-app configured
检查升级结果
您可以自己再次检查应用的yaml。您应该找到组件名称已更改。 让我们直接访问该网站:
$ curl oamexample.com
Goodbye World!
更新的Web应用程序运行良好!
现在,我们已经成功地使我们的新组件正常工作。
这可能更容易,因为开发人员只需要关心组件更新,而操作员只需要关心应用程序配置。
卸载应用程序
您可以使用kubectl轻松删除配置
$ kubectl delete configuration first-app
configuration.core.oam.dev "first-app" deleted
这将删除您的应用程序和所有相关资源。
它不会删除特征和组件,它们很高兴在下一个应用程序配置中等待您的使用
$ kubectl get traits,components
NAME 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等周边的管理功能,从而更加快捷的进行定义
推荐阅读:洗袜子机