kunpengcompute / kunpengcompute.github.io

Kunpeng Tech Blog: https://kunpengcompute.github.io/
Apache License 2.0
17 stars 5 forks source link

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

Open zhaorenhai opened 3 years ago

zhaorenhai commented 3 years ago

作者: zhaorenhai

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

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

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

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

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,然后创建了一个默认用户,再把数据库重新在前台启动而已。各位有兴趣的小伙伴可以自行添加其他较复杂的功能):

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"]
#!/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镜像:

docker build -t openeulermariadb:latest . 

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

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

docker run -itd 253e90ce4419 /bin/bash

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

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

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的节点上运行:

---

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

然后执行

kubectl create -f  openeulermariadb.yaml

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

namespace/mariadb created
service/mariadb-svc created
deployment.apps/mariadb created

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

kubectl get services -n mariadb
kubectl get pods -n mariadb

输出分别如下:

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

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

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

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

至此整个流程基本完毕。