RK3588 + 银河麒麟部署 swarm 集群指南-续(自己应用程序部署)
RK3588 + 银河麒麟部署 swarm 集群指南
继上面的swarm部署demo程序hello-world之后,本文介绍并记录了自己的应用程序在集群中部署的过程。
一、创建应用程序
源码见:udp_client.c。功能为通过udp周期性(5s)的给192.168.137.1的8888端口发送消息。使用rk3588的交叉编译环境编译生成udp_client。
二、创建docker
创建一个Dockerfile来打包应用。
0、确保打包的文件权限
chmod 777 udp_client
1、创建Dockerfile
内容如下:# 使用scratch基础镜像(完全空镜像)FROM scratch# 复制可执行文件COPY udp_client /udp_client# 设置启动命令(注意:scratch镜像没有shell,必须使用JSON格式)CMD ["/udp_client"]
2、构建镜像
docker build -t udp-client:latest . //注意“.”不要忘记
3、验证镜像
docker images | grep udp-client打印如下:udp-client latest 1511c5cf5392 13 seconds ago 652kB
三、搭建私有仓
1、 配置所有节点允许不安全的registry
# 在每个节点上编辑Docker配置文件sudo vi /etc/docker/daemon.json添加{"insecure-registries": ["192.168.137.224:5000"]}sudo systemctl daemon-reloadsudo systemctl restart dockerdocker info # 验证配置生效
2、创建Registry服务
//拉取,如果拉取失败,可以在pc平台拉取,但是要加上--platform arm64docker pull registry:latestdocker pull swr.cn-east-2.myhuaweicloud.com/library/registry:latest# 创建挂载目录sudo mkdir -p /var/lib/registry# 设置权限(registry 容器以非 root 用户运行)sudo chown -R 1000:1000 /var/lib/registry# 验证目录存在ls -ld /var/lib/registrydocker run -d \--name registry \-p 5000:5000 \-v /var/lib/registry:/var/lib/registry \-e REGISTRY_HTTP_ADDR=0.0.0.0:5000 \registry:latest//验证仓 curl http://localhost:5000/v2/_catalog打印如下:{"repositories":[""]}
3、 标记并推送镜像到本地Registry
# 标记镜像指向本地registrydocker tag udp-client:latest 192.168.137.224:5000/udp-client:latest# 推送镜像到registrydocker push 192.168.137.224:5000/udp-client:latest# 验证推送成功,在所有的节点访问curl http://192.168.137.224:5000/v2/_catalog打印如下:{"repositories":["udp-client"]}
四、在swarm集群中部署
1、本地镜像方式部署服务
如果没有私有仓,可以是把应用包分发到每一个节点上。# 将镜像保存为 tar 文件sudo docker save udp-client:latest > udp-client.tar# 查看生成的文件ls -lh udp-client.tar//每个节点本地镜像导入# 从 tar 文件导入镜像docker load -i udp-client.tar# 每个节点验证镜像已导入docker images | grep udp-client# 使用service方式部署docker service create --name udp-client --replicas 3 --restart-condition any udp-client:latest# 查看服务状态docker service ls# 查看具体服务详情docker service ps udp-client# 查看服务日志docker service logs udp-client
2、私有仓方式部署服务
前提:参考一、二。三、四、完成应用“udp-v2”的docker镜像制作,私有仓搭建,镜像上传私有仓。# 部署服务 docker service create --name udp-v2 --replicas 3 --restart-condition any 192.168.137.224:5000/udp-v2:latest打印如下:22qskkbjme4lgp4zam46sfhhxoverall progress: 3 out of 3 tasks 1/3: running [==================================================>] 2/3: running [==================================================>] 3/3: running [==================================================>] verify: Service converged 注:要点时间。# 查看服务状态 docker service ls打印如下:ID NAME MODE REPLICAS IMAGE PORTS22qskkbjme4l udp-v2 replicated 3/3 192.168.137.224:5000/udp-v2:latest # 查看具体服务详情 docker service ps udp-v2打印如下:ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTSx6h3lqqhso1r udp-v2.1 192.168.137.224:5000/udp-v2:latest worker-2 Running Running less than a second ago 7efawg6x749a udp-v2.2 192.168.137.224:5000/udp-v2:latest worker-1 Running Running less than a second ago bgtttbytfzyb udp-v2.3 192.168.137.224:5000/udp-v2:latest master-node Running Running 8 minutes ago 注:由于我的三个节点时间不一致,导致“CURRENT”的显示也有点怪。master-node的时间为:2021年 01月 01日 星期五 12:57:29 CSTworker-1的时间为:2021年 01月 01日 星期五 20:25:10 CSTworker-1的时间为:2021年 01月 01日 星期五 20:25:13 CST# 查看服务日志 docker service logs udp-v2无打印。
3、电脑端验证
UDP-v2代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>#define SERVER_IP "192.168.137.1"//pc
#define PORT 8888
#define MESSAGE_PREFIX "v2 send : "
#define INTERVAL 5 // 发送间隔(秒)int main() {int sockfd;struct sockaddr_in server_addr;char buffer[256];int seq = 1;// 创建UDP套接字if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {perror("Socket creation failed");exit(EXIT_FAILURE);}memset(&server_addr, 0, sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_port = htons(PORT);if (inet_pton(AF_INET, SERVER_IP, &server_addr.sin_addr) <= 0) {perror("Invalid address / Address not supported");close(sockfd);exit(EXIT_FAILURE);}while (1) {sprintf(buffer, "%s%08d.", MESSAGE_PREFIX, seq++);if (sendto(sockfd, buffer, strlen(buffer), 0, (const struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {perror("Send failed");} else {printf("Sent: %s\n", buffer);}sleep(INTERVAL);}close(sockfd);return 0;
}
wireshark抓包如下:

