在arm64平台上创建MariaDB的Docker镜像并在K8S环境上部署

作者: zhaorenhai

本文计划在arm64平台上创建MariaDB的Docker镜像,并在K8S环境上部署起来。测试一下整个流程,以验证下MariaDB在arm64平台上的容器相关的功能也都是正常的。

测试平台选择华为云鲲鹏虚拟机,OS采用openEuler20.03版本,MariaDB就用openEuler自带的10.3.9版本,镜像版本我们计划采用openEuler20.09的OS镜像作为基础镜像。

首先确保在虚拟机上安装好了docker

然后下载openEuler基础镜像,并用docker加载:

1
2
curl -L -O https://repo.openeuler.org/openEuler-20.09/docker_img/aarch64/openEuler-docker.aarch64.tar.xz
docker load --input openEuler-docker.aarch64.tar.xz

然后在同一目录下编辑一个Dockerfile文件和entrypoint.sh文件

内容分别如下(本文主要演示使用,内容较简单,仅仅是在OS镜像的基础上安装了一个数据库,并自动拉起,简单等待了10s,然后创建了一个默认用户,再把数据库重新在前台启动而已。各位有兴趣的小伙伴可以自行添加其他较复杂的功能):

1
2
3
4
5
6
7
8
9
10
11
FROM openeuler-20.09:latest

RUN set -ex; \
yum update -y; \
yum install -y mariadb-server;\
yum install -y expect
RUN mysql_install_db --user=mysql --skip-test-db
COPY entrypoint.sh /opt/entrypoint.sh
RUN chmod +x /opt/entrypoint.sh
EXPOSE 3306
ENTRYPOINT ["/opt/entrypoint.sh"]
1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
mysqld_safe &
sleep 10
if [ ! -f /opt/mypasswordfile ]; then
mkpasswd -s 0 > /opt/mypasswordfile
fi
MYPASSWORD=$(cat /opt/mypasswordfile|head -1)
mysql -uroot -e "Create user 'openeulermariadb'@'%' identified by '$MYPASSWORD' ;"
mysql -uroot -e "grant all privileges on *.* to 'openeulermariadb'@'%';"
mysqladmin -uroot shutdown
mysqld_safe

然后在这两个文件所在的目录下执行如下命令,创建一个docker镜像:

1
docker build -t openeulermariadb:latest .

如果没有错误,用docker images命令可以看到刚刚创建的镜像,找到其中的镜像ID。

然后执行如下命令运行一个容器,这样MariaDB服务就运行起来了。

1
docker run -itd 253e90ce4419 /bin/bash

然后执行docker ps -a 可以看到刚刚起来的容器,找到其中的容器ID。

然后执行如下命令,进入容器,并测试相关数据库功能,是否都正常。

1
docker exec -it 44d3c508436e /bin/bash

如果一切正常,就可以参考如下链接:https://support.huaweicloud.com/usermanual-swr/swr_01_0011.html

将镜像上传到华为云的SWR镜像服务里面去。

并在SWR镜像管理页面,将私有镜像改为公开的。

然后我们尝试将此镜像在K8S里面部署。

首先确保K8S相关环境已安装,并正常运行。本文不是K8S指导文档,部署步骤在此略过。

然后创建一个内容如下的openeulermariadb.yaml文件,注意其中的镜像的地址就是刚刚上传到SWR的镜像地址,另外特意加了nodeSelector,选择arm64架构的节点,确保此容器只在arm64的节点上运行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
---

apiVersion: v1
kind: Namespace
metadata:

name: mariadb
---

apiVersion: v1
kind: Service
metadata:
name: mariadb-svc
namespace: mariadb
labels:
app: mariadb
spec:
type: NodePort
ports:

- port: 3306
targetPort: 3306
name: mariadb3306
selector:
app: mariadb

---

apiVersion: apps/v1
kind: Deployment
metadata:
name: mariadb
namespace: mariadb
spec:
replicas: 1
selector:
matchLabels:
app: mariadb
strategy:
type: Recreate
template:
metadata:
labels:
app: mariadb
spec:
nodeSelector:
kubernetes.io/arch: arm64
containers:

- image: swr.cn-north-4.myhuaweicloud.com/kunpengcompute/openeulermariadb:latest
name: mariadb
ports:
- containerPort: 3306
name: mariadb3306

然后执行

1
kubectl create -f  openeulermariadb.yaml

在K8S里面部署,提示如下代表部署成功

1
2
3
namespace/mariadb created
service/mariadb-svc created
deployment.apps/mariadb created

然后用如下命令可以查看部署成功的服务和POD

1
2
kubectl get services -n mariadb
kubectl get pods -n mariadb

输出分别如下:

1
2
NAME          TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
mariadb-svc NodePort 10.106.88.47 <none> 3306:30977/TCP 2m5s
1
2
NAME                       READY   STATUS    RESTARTS   AGE
mariadb-6cf778c658-wphnq 1/1 Running 0 2m33s

如果在K8S的容器内部网络,可以通过IP 10.106.88.47,端口3306访问数据库,如果是在容器外部网络,可以通过K8S的Master的IP地址和端口号30977来访问数据库。

也可以执行如下命令,进入容器,测试各项功能。

1
kubectl exec -it mariadb-6cf778c658-wphnq -n mariadb -- /bin/bash

至此整个流程基本完毕。

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×