本文记录将 eclipse 的物联网开源应用 kapua 容器化为 kubernetes charts 的要点。 项目demo也在我的github上面:kelvinblood/kapua-kubernetes

首先我们在官网上 -started.php 看到 kapua 的启动命令:

$ docker run -td --name kapua-sql -p 8181:8181 -p 3306:3306 kapua/kapua-sql:0.3.2$ docker run -td --name kapua-elasticsearch -p 9200:9200 -p 9300:9300 elasticsearch:5.4.0 -Ecluster.name=kapua-datastore -Ediscovery.type=single-node -Etransport.host=_site_ -Etransport.ping_schedule=-1 -Etransport.tcp.connect_timeout=30s$ docker run -td --name kapua-broker --link kapua-sql:db --link kapua-elasticsearch:es --env commons.db.schema.update=true -p 1883:1883 -p 61614:61614 kapua/kapua-broker:0.3.2$ docker run -td --name kapua-console --link kapua-sql:db --link kapua-broker:broker --link kapua-elasticsearch:es --env commons.db.schema.update=true -p 8080:8080 kapua/kapua-console:0.3.2$ docker run -td --name kapua-api --link kapua-sql:db --link kapua-broker:broker --link kapua-elasticsearch:es --env commons.db.schema.update=true -p 8081:8080 kapua/kapua-api:0.3.2在这里可以看到 kapua 一共分成五个组件:

我们先将这几个命令行组合起了成为一个 docker-compose 文件,便于管理:

version: '2'services:  kapua-sql:    image: iot/kapua-sql:0.3.2    restart: always  kapua-elasticsearch:    image: elasticsearch:5.4.0    restart: always    command:    - -Ecluster.name=kapua-datastore    - -Ediscovery.type=single-node    - -Etransport.host=_site_    - -Etransport.ping_schedule=-1    - -Etransport.tcp.connect_timeout=30s  kapua-broker:    image: iot/kapua-broker:0.3.2    restart: always    links:      - kapua-sql:db      - kapua-elasticsearch:es    environment:      - commons.db.schema.update=true      - DB_PORT_3306_TCP_PORT=3306    ports:      - "1883:1883"      - "61614:61614"  kapua-console:    image: iot/kapua-console:0.3.2    restart: always    links:      - kapua-sql:db      - kapua-elasticsearch:es      - kapua-broker:broker    environment:      - commons.db.schema.update=true    ports:      - "8080:8080"  kapua-api:    image: iot/kapua-api:0.3.2    restart: always    links:      - kapua-sql:db      - kapua-elasticsearch:es      - kapua-broker:broker    environment:      - commons.db.schema.update=true    ports:      - "8080:8080"有了这个文件,在单机上我们可以直接使用 docker-compose up -d 部署应用。

对于新手来说,有一个很好的应用,可以快速辅助你将 docker-compose 文件转换成 kubernetes 的应用—— kompose 。使用方法也很简单

# Linuxcurl -L .0/kompose-linux-amd64 -o kompose# macOScurl -L .0/kompose-darwin-amd64 -o komposechmod +x komposesudo mv ./kompose /usr/local/bin/kompose以上安装完成后使用以下命令转换

kompose convert -f docker-compose.yaml 即可将文件转换成 kubernetes chart 文件。下图就是使用命令转换后的文件列表(templates目录)。

之后,我们使用 helm 创建 charts 的命令行创建chart,清空 templates 目录后将刚才的文件挪进去。

不过使用 kompose 转换的文件还是有一些问题的,直接放到文件夹中并不好用。比如它没有使用values.yaml,没有生成namespace,没有资源限制等等,我们需要用以下的方式将其改造的更符合我们的要求。

注意事项:

name: 字段不允许使用骆驼峰模式,可使用分隔符 -,英文需要全部小写。

value.yaml中的变量,不要使用分隔符 - ,会与变量解释器产生冲突,编译的时候报错。可以使用骆驼峰。

注意缩进问题,缩进不对或者带tab也会报错。

接下来做一些改造:

在 template 文件夹中使用_helpers.tpl文件,以便在 yaml 文件中使用重复的字段。

我做了一个简单的小改造:

这里面定义了两个变量,name和fullname,可以在yaml文件中直接使用:

使用 ingress:

我这里使用的是traefik作为ingress的实现方式,需要事先安装好traefik。ingress.yaml 配置如下:

创建 namespace

配置灵活的 values.yaml,将镜像前缀设置成可配的(方便内网应用部署)

为Java虚拟机 jvm 做资源限制,以console作为例子

在values.yaml中配置如下:

kapuaConsole:  containerPort: 8080  javaOpts: -Xms80m -Xmx80m -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -Xmn10m -XX:PermSize=16M -XX:MaxPermSize=64M  service:    type: NodePort使用service的name为服务创建别名,以broker作为例子:

限制pod和container的资源

「滋磁一下」