在一般的大型IT组织中,很少有人会构建完全隔离的新应用程序,而该应用程序会与所有其他旧系统或新系统完全分离。许多实时用例要求新旧系统共享和交换数据。
Apache Camel是可帮助您集成系统的开源框架。 Apache Camel允许集成系统在它们之间生成和使用数据。它提供了300多个组件,其中包括与TCP,ActiveMQ,FTP, http://Salesforce.com 之类的源的集成连接器,这使得集成异构系统变得更加容易。企业集成模式(EIP)提供了许多常见集成问题的解决方案,Apache Camel通过其丰富的领域特定语言(DSL)提供了这些模式的实现,从而使开发人员更容易轻松地应用EIP。
Apache Camel-K旨在简化Apache Camel集成的编程和部署模型。通过使用Apache Camel-K,集成开发人员现在可以专注于使用Java,JavaScript,Groovy,XML或YAML中的Camel DSL编写集成,而无需担心如何打包和部署它们。
下图说明了Camel K的基本概念。
实际情况是该脚本被包装到“集成”自定义资源中并添加到Kubernetes命名空间中。然后,Camel K Operator(基于operator SDK)将检测到新的Integration并将其具体化为正在运行的容器。通常,Camel K实现与Kubernetes部署的集成,但是在Knative上运行时,它使用自动缩放服务。
Camel-K 如何与Knative集成那?主要体现在下面两个方面。
1:部署Apache Camel K
在要运行Camel源的任何命名空间中安装Apache Camel K Operator。
与Camel来源兼容的首选版本是 Camel K v1.0.0-M4 。
Apache Camel K手册中提供了 安装说明 。文档包括针对常见Kubernetes环境(包括开发集群)的特定说明。
2:从“事件源” 发布页面 中的camel.yaml安装Camel源:
kubectl apply --filename camel.yaml
我们查看一下camel.yam的具体内容:
# Copyright 2019 The Knative Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. apiVersion: v1 kind: Namespace metadata: name: knative-sources labels: contrib.eventing.knative.dev/release: "v0.14.1" --- # Copyright 2019 The Knative Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. apiVersion: v1 kind: ServiceAccount metadata: name: camel-controller-manager namespace: knative-sources labels: contrib.eventing.knative.dev/release: "v0.14.1" --- # Copyright 2019 The Knative Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: camel-controller labels: contrib.eventing.knative.dev/release: "v0.14.1" rules: - apiGroups: - apps resources: - deployments verbs: &everything - get - list - watch - create - update - patch - delete - apiGroups: - rbac.authorization.k8s.io resources: - clusterroles verbs: - list - apiGroups: - "" resources: - events - configmaps verbs: *everything - apiGroups: - sources.knative.dev resources: - camelsources verbs: *everything - apiGroups: - sources.knative.dev resources: - camelsources/status - camelsources/finalizers verbs: - get - update - patch - apiGroups: - camel.apache.org resources: - '*' verbs: *everything --- # The role is needed for the aggregated role source-observer in knative-eventing to provide readonly access to "Sources". # See https://github.com/knative/eventing/blob/master/config/200-source-observer-clusterrole.yaml. kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: name: eventing-contrib-camel-source-observer labels: eventing.knative.dev/release: devel duck.knative.dev/source: "true" rules: - apiGroups: - "sources.knative.dev" resources: - "camelsources" verbs: - get - list - watch --- # Copyright 2019 The Knative Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: camel-controller-rolebinding labels: contrib.eventing.knative.dev/release: "v0.14.1" roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: camel-controller subjects: - kind: ServiceAccount name: camel-controller-manager namespace: knative-sources --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: eventing-sources-camel-controller-addressable-resolver labels: contrib.eventing.knative.dev/release: "v0.14.1" subjects: - kind: ServiceAccount name: camel-controller-manager namespace: knative-sources # An aggregated ClusterRole for all Addressable CRDs. # Ref: https://github.com/knative/eventing/blob/master/config/200-addressable-resolvers-clusterrole.yaml roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: addressable-resolver --- # Copyright 2019 The Knative Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: camel-source-observer labels: contrib.eventing.knative.dev/release: "v0.14.1" duck.knative.dev/source: "true" rules: - apiGroups: - sources.knative.dev resources: - camelsources verbs: - get - list - watch --- # Copyright 2019 The Knative Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: labels: contrib.eventing.knative.dev/release: "v0.14.1" eventing.knative.dev/source: "true" duck.knative.dev/source: "true" knative.dev/crd-install: "true" name: camelsources.sources.knative.dev spec: group: sources.knative.dev names: categories: - all - knative - eventing - sources kind: CamelSource plural: camelsources scope: Namespaced subresources: status: {} additionalPrinterColumns: - name: Ready type: string JSONPath: '.status.conditions[?(@.type=="Ready")].status' - name: Reason type: string JSONPath: '.status.conditions[?(@.type=="Ready")].reason' - name: Age type: date JSONPath: .metadata.creationTimestamp validation: openAPIV3Schema: properties: apiVersion: type: string kind: type: string metadata: type: object spec: properties: sink: type: object description: "Reference to an object that will resolve to a domain name to use as the sink." ceOverrides: type: object description: "Defines overrides to control modifications of the event sent to the sink." source: properties: flow: type: object integration: type: object type: object required: - source type: object status: properties: conditions: items: properties: lastTransitionTime: type: string message: type: string reason: type: string severity: type: string status: type: string type: type: string required: - type - status type: object type: array sinkUri: type: string type: object version: v1alpha1 --- # Copyright 2019 The Knative Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. apiVersion: v1 kind: Service metadata: labels: contrib.eventing.knative.dev/release: "v0.14.1" control-plane: camel-controller-manager name: camel-controller-manager namespace: knative-sources spec: selector: control-plane: camel-controller-manager ports: - name: https-camel port: 443 --- # Copyright 2019 The Knative Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. apiVersion: apps/v1 kind: StatefulSet metadata: labels: contrib.eventing.knative.dev/release: "v0.14.1" control-plane: camel-controller-manager name: camel-controller-manager namespace: knative-sources spec: selector: matchLabels: control-plane: camel-controller-manager serviceName: camel-controller-manager template: metadata: labels: control-plane: camel-controller-manager spec: containers: - image: gcr.io/knative-releases/knative.dev/eventing-contrib/camel/source/cmd/controller@sha256:a1dc668acca5be07e290131d7497eb5ad2f0fe44b53aaac210afbe3401d25158 name: manager resources: requests: cpu: 20m memory: 20Mi env: - name: SYSTEM_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace - name: CONFIG_LOGGING_NAME value: config-logging - name: CONFIG_OBSERVABILITY_NAME value: config-observability - name: CONFIG_LEADERELECTION_NAME value: config-leader-election-camel - name: METRICS_DOMAIN value: knative.dev/sources serviceAccount: camel-controller-manager terminationGracePeriodSeconds: 10 --- # Copyright 2020 The Knative Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. apiVersion: v1 kind: ConfigMap metadata: name: config-logging namespace: knative-sources labels: contrib.eventing.knative.dev/release: "v0.14.1" data: # Common configuration for all Knative codebase zap-logger-config: | { "level": "info", "development": false, "outputPaths": ["stdout"], "errorOutputPaths": ["stderr"], "encoding": "json", "encoderConfig": { "timeKey": "ts", "levelKey": "level", "nameKey": "logger", "callerKey": "caller", "messageKey": "msg", "stacktraceKey": "stacktrace", "lineEnding": "", "levelEncoder": "", "timeEncoder": "iso8601", "durationEncoder": "", "callerEncoder": "" } } # Log level overrides # For all components changes are be picked up immediately. loglevel.controller: "info" loglevel.webhook: "info" --- # Copyright 2020 The Knative Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. apiVersion: v1 kind: ConfigMap metadata: name: config-observability namespace: knative-sources labels: contrib.eventing.knative.dev/release: "v0.14.1" data: _example: | ################################ # # # EXAMPLE CONFIGURATION # # # ################################ # This block is not actually functional configuration, # but serves to illustrate the available configuration # options and document them in a way that is accessible # to users that `kubectl edit` this config map. # # These sample configuration options may be copied out of # this example block and unindented to be in the data block # to actually change the configuration. # metrics.backend-destination field specifies the system metrics destination. # It supports either prometheus (the default) or stackdriver. # Note: Using stackdriver will incur additional charges metrics.backend-destination: prometheus # metrics.request-metrics-backend-destination specifies the request metrics # destination. If non-empty, it enables queue proxy to send request metrics. # Currently supported values: prometheus, stackdriver. metrics.request-metrics-backend-destination: prometheus # metrics.stackdriver-project-id field specifies the stackdriver project ID. This # field is optional. When running on GCE, application default credentials will be # used if this field is not provided. metrics.stackdriver-project-id: "<your stackdriver project id>" # metrics.allow-stackdriver-custom-metrics indicates whether it is allowed to send metrics to # Stackdriver using "global" resource type and custom metric type if the # metrics are not supported by "knative_broker", "knative_trigger", and "knative_source" resource types. # Setting this flag to "true" could cause extra Stackdriver charge. # If metrics.backend-destination is not Stackdriver, this is ignored. metrics.allow-stackdriver-custom-metrics: "false" # profiling.enable indicates whether it is allowed to retrieve runtime profiling data from # the pods via an HTTP server in the format expected by the pprof visualization tool. When # enabled, the Knative Eventing pods expose the profiling data on an alternate HTTP port 8008. # The HTTP context root for profiling is then /debug/pprof/. profiling.enable: "false" ---
所有CamelSource示例都使用一些测试资源来显示生成的事件。需要创建以下资源:
camel-test
部署 显示服务:
kubectl apply --filename display_resources.yaml
我们查看一下display_resources.yaml的内容:
# Channel for testing events. apiVersion: messaging.knative.dev/v1alpha1 kind: InMemoryChannel metadata: name: camel-test --- # Subscription from the CamelSource's output Channel to the Knative Service below. apiVersion: messaging.knative.dev/v1alpha1 kind: Subscription metadata: name: camel-source-display spec: channel: apiVersion: messaging.knative.dev/v1alpha1 kind: InMemoryChannel name: camel-test subscriber: ref: apiVersion: serving.knative.dev/v1 kind: Service name: camel-event-display --- # This is a very simple Knative Service that prints the input event to its log. apiVersion: serving.knative.dev/v1 kind: Service metadata: name: camel-event-display spec: template: spec: containers: - image: gcr.io/knative-releases/knative.dev/eventing-contrib/cmd/event_display@sha256:f4628e97a836c77ed38bd3b6fd3d0b06de4d5e7db6704772fe674d48b20bd477
本文简单介绍了一下Camel K以及Camel K 如何与Knative的集成。
后续待对Camel K 有了一些实战经验,再详细些一些。