上一篇文章基于
camel-k:1.0.0-RC2编写,部署到一半,遇到很多问题卡住了
有些问题修改一下项目比较容易解决,而且也不能干等下一个 Release 版本发布
因此选择从 master 分支构建 camel k (开发者在 Issue 中也是这么建议的)
官方文档:Camel K - Apache Camel
GitHub: camel-k
附:基于 Release 1.0.0-RC2 搭建 Camel K 文章的地址: 部署 Apache Camel K | 基于 K8S 搭建 Serverless Camel EIP 框架实践
注意:本文编写时,master 分支最新的 commit 为:
remove dynamicrestmapper which is deprecated (#2544)
https://github.com/operator-framework/operator-sdk/commit/501f753aecdc61eb4d916f5a0ea3728b83a01279
基于源码构建 Camel K
环境准备
基于源码构建的环境需求
可以参考文档:CONTRIBUTING TO CAMEL K
需要以下环境:
- Golang 1.13+: 用于编译和测试项目,可以到 https://golang.google.cn/ 下载
- Operator SDK v0.9.0+: 用于构建 Operator 和 Docker 镜像,GitHub地址:https://github.com/operator-framework/operator-sdk ,Release 页面有直接可用的二进制可执行文件下载
- GNU Make: 执行项目中定义好的构建行为,一般 Linux 发行版会自带或者可以直接从包管理器安装 https://www.gnu.org/software/make/
- JDK 1.8+: 用于构建 Camel 项目本身
- Docker 17.03+
- (可选) podman v1.2.0+
- (可选) buildah v1.7+
- kubectl v1.12.0+: 除了客户端,当然还要有可用的 Server
本文实践环境
软件环境:
- Linux server-sia 5.3.0-42-generic #34~18.04.1-Ubuntu SMP Fri Feb 28 13:42:26 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
- Docker CE 19.03.5
- Kubernetes: Server Version: version.Info{Major:“1”, Minor:“17”, GitVersion:“v1.17.4”, GitCommit:“8d8aa39598534325ad77120c120a22b3a990b5ea”, GitTreeState:“clean”, BuildDate:“2020-03-12T20:55:23Z”, GoVersion:“go1.13.8”, Compiler:“gc”, Platform:“linux/amd64”}
- go1.14.1 linux/amd64
- Java HotSpot™ 64-Bit Server VM 18.9 (build 11.0.6+8-LTS, mixed mode)
- operator-sdk version: “v0.16.0-dirty”, commit: “55f1446c5f472e7d8e308dcdf36d0d7fc44fc4fd”, go version: “go1.13.8 linux/amd64”
硬件环境:
- 6C12T
- 32G
获取源码
git clone https://github.com/apache/camel-k.git
编译
截至本文编写时间,官方文档上的 make 相关命令不适用于 master 分支最新的 Makefile
(可选)提前准备镜像或修改源码
项目默认使用的镜像:
quay.io/buildah/stable:v1.14.0adoptopenjdk/openjdk8:slim
如果当前网络环境从 quay.io 拉取镜像比较艰难,有两种方式可以解决:
- 从
quay.azk8s.cn或quay-mirror.qiniu.com拉取镜像,并打上quay.io的 tag - 替换项目源码中所有
quay.io仓库地址
以本文所需的 quay.io/buildah/stable:v1.14.0 镜像为例:
docker pull quay.azk8s.cn/buildah/stable:v1.14.0
docker tag quay.azk8s.cn/buildah/stable:v1.14.0 quay.io/buildah/stable:v1.14.0
(可选)打开 make 过程中 maven 下载过程输出,以便于跟踪进度
需要修改项目文件 script/package_maven-artifacts.sh,删除 mvnw 的参数 --no-transfer-progress
开始构建
构建开发版本的 camel-k ,执行以下命令:
make images-dev
这个 maven 的构建过程比较漫长,项目脚本屏蔽了 maven 的下载过程输出。
(可能出现的状况)本地仓库目录下依赖文件齐全,Maven 仍然找不到依赖
项目默认使用的 snapshots 仓库有:
https://oss.sonatype.org/content/repositories/snapshotshttps://repository.apache.org/content/repositories/snapshots
如果是因为网络,删除依赖所在文件夹的 _remote.repositories 文件,即可解决问题。
本人曾到 https://maven.aliyun.com/repository/apache-snapshots 查找相关依赖,发现较新版本的 snapshots 依赖在阿里源上不存在。
构建完成
make images-dev 构建完成后,docker 镜像列表中可以看到相关的镜像:
REPOSITORY TAG IMAGE ID CREATED SIZE
apache/camel-k 1.0.0-SNAPSHOT 33370e00da28 5 hours ago 560MB
在 camel-k 项目的目录下,会多出一个二进制可执行文件 kamel,后续的操作都会基于这个 CLI 工具进行。
运行 camel k 平台
前期准备
Registry 搭建
由于 camel-k 依赖 Registry,现有多种打开方式:
- 若非生产用途,可以在 K8S 集群中搭建临时 Registry,并通过 Label 伪装为 Minikube 的插件,kamel 可以自动发现 Registry
kamel install相关参数指定 Registry
(可能不适用于生产)在 K8S 集群中搭建 Registry 并添加 Minikube 的标签
registry-rc.yaml.tmpl
apiVersion: v1
kind: ReplicationController
metadata:
labels:
kubernetes.io/minikube-addons: registry
addonmanager.kubernetes.io/mode: Reconcile
name: registry
namespace: kube-system
spec:
replicas: 1
selector:
kubernetes.io/minikube-addons: registry
template:
metadata:
labels:
actual-registry: "true"
kubernetes.io/minikube-addons: registry
addonmanager.kubernetes.io/mode: Reconcile
spec:
containers:
- image: registry.hub.docker.com/library/registry:2.7.1
imagePullPolicy: IfNotPresent
name: registry
ports:
- containerPort: 5000
protocol: TCP
env:
- name: REGISTRY_STORAGE_DELETE_ENABLED
value: "true"
基于链接执行命令 :
kubectl create -f https://raw.githubusercontent.com/kubernetes/minikube/master/deploy/addons/registry/registry-rc.yaml.tmpl -n kube-system
或者基于本地文件:
kubectl create -f registry-rc.yaml.tmpl -n kube-system
创建 Service,文件 registry-svc.yaml:
apiVersion: v1
kind: Service
metadata:
name: registry
namespace: kube-system
labels:
kubernetes.io/minikube-addons: registry
kubernetes.io/cluster-service: "true"
spec:
selector:
kubernetes.io/minikube-addons: registry
ports:
- name: registry
port: 5000
protocol: TCP
执行:
kubectl create -f registry-svc.yaml -n kube-system
(可选)为容器内的 Maven 指定配置
如果网络条件有限,访问中央仓库下载速度较慢,可以通过创建一个 configmap,指定容器内的 Maven 配置。
settings.xml 配置参考:
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
<localRepository>/tmp/artifacts/m2</localRepository>
<repositories>
<repository>
<id>spring</id>
<url>https://maven.aliyun.com/repository/spring</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>apache-snapshots</id>
<url>https://repository.apache.org/content/groups/snapshots</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
</settings>
使用 settings.xml 创建一个 configmap:
kubectl create configmap maven-settings --from-file=settings.xml -n camel-k
注意
** kamel install 的参数 --maven-settings 和 --maven-repository 互斥,只能二选一**
(可选)创建 namespace
kubectl create ns camel-k
在 K8S 集群中安装 Camel K
参数说明:
--build-timeout 1h建议指定,默认构建时间为5m,超过时间则会对构建 signal killed,如果非网络与硬件条件极好,需要显式声明-n camel-k将 camel-k 安装在 namespacecamel-k中
kamel install --registry-insecure --maven-settings=configmap:maven-settings/settings.xml --build-timeout 1h -n camel-k
此时,camel-k 命名空间中,存在这个 pod
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
camel-k-operator-56db68bb8-hh84h 1/1 Running 0 95s 10.240.0.59 sia.lo <none> <none>
运行 integration Demo
改一改项目中的 integration 示例文件 examples/Sample.java:
import org.apache.camel.builder.RouteBuilder;
public class Sample extends RouteBuilder {
@Override
public void configure() throws Exception {
from("timer:tick")
.log(

本文介绍如何从master分支构建CamelK,包括环境需求、源码获取、编译步骤及常见问题解决方案。
最低0.47元/天 解锁文章
2648

被折叠的 条评论
为什么被折叠?



