部署 Apache Camel K | 从 master 分支源码构建并部署 Camel K 平台

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

上一篇文章基于 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

环境准备

基于源码构建的环境需求

可以参考文档: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.0
  • adoptopenjdk/openjdk8:slim

如果当前网络环境从 quay.io 拉取镜像比较艰难,有两种方式可以解决:

  • quay.azk8s.cnquay-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/snapshots
  • https://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 的标签

可以基于文件:
https://raw.githubusercontent.com/kubernetes/minikube/master/deploy/addons/registry/registry-rc.yaml.tmpl

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 安装在 namespace camel-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(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wuweijie@apache.org

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值