⚠️ 本篇博客仅是自我学习过程,如果有哪些步骤不对,或者哪些步骤冗余了,非常欢迎各位大佬给我提出见解~
🐷 实际上我是先在本机的docker中部了mysql,但是在一个web端做数据库连接测试的时候,我一直测试失败,从未成功过,别的小伙伴测试我的数据库有的时候会成功,不过成功率仅有15%。
实在受不了这样的情况,所以后来我又在其他k8s集群上部署了一次mysql。总的来说,踩的坑不少,但是还有很多坑没踩到,所以领悟到的东西也不是很多,但对我这种小白来说,也可以了。
因为docker比较久之前部署的,所以就先写k8s上部署啦👏。

一、k8s上部署mysql

😊 前提:已经部署了k8s集群

1 新建一个专属的namespace(master节点上)

kubectl create namespace XXX

或者是(namespace缩写ns)

kubectl create ns XXX

执行后,输入以下语句查看是否成功(三种)
✅ 下面都可以使用缩写,方便一些
我创建的namespace为test-zlh

kubectl get namespaces

在这里插入图片描述

2 下载镜像

🐷 我是在work节点上下载的镜像,我也不知道我yaml文件中定义的image地址,是不是自动查找集群中的镜像还是仅当前机器下的镜像(我偏向整个集群下) 这个问题先留着,待更新🤔️🤔️🤔️
在这里插入图片描述
我是从Daocloud hub下拉取的镜像:http://hub.daocloud.io,搜索栏输入mysql即可,侧边会给出拉取镜像的语句。

3 新建depolyment的yaml文件

  • master节点新建文件夹(✅用途:放yaml文件)
  • 在文件夹下编写Deployment的yaml文件
  • mysql-deployment.yaml(名字随意取)
vim mysql-deployment.yaml

yaml文件如下所示(相关注释等后期维护🤔️):

apiVersion: apps/v1 
kind: Deployment # 表明是Deployment
metadata: # deployment的元数据
  name: mysql-deployment # deployment的名称,全局唯一
  namespace: test-zlh # 前面创建的namespace
spec: # 详细描述
  replicas: 1 #pod副本期待数量
  selector: 
    matchLabels:
      app: mysql-zlh # 符合目标的pod拥有此标签
  strategy:
    type: Recreate # pod的重启策略
  template: # 根据此模版创建pod的副本(实例)。当pod的数量小于预期数量时,用于创建新pod的pod模板
    metadata:
      labels: # pod副本拥有的标签,对应着selector中的标签,用于筛选目标pod的Label Selector
        app: mysql-zlh 
    spec:
      containers: # pod内容器的定义部分
      - name: mysql-zlh # 容器的名称
        image: daocloud.io/library/mysql:5.7.5-m15 # 容器对应的docker镜像
        imagePullPolicy: IfNotPresent # 镜像拉取策略,如果本地没有该镜像,那么就从网上拉取(如果不设定拉取策略的话,默认为always的策略,总是从网络上拉取镜像)
        resources:
          limits: # 资源限制
            cpu: 200m
            memory: 512Mi
          requests:
            cpu: 200m
            memory: 512Mi
        ports:
        - containerPort: 3306 # 容器暴露的端口号
        env:
        - name: MYSQL_ROOT_PASSWORD 
          value: "123456" #root用户的密码,设置为123456

强制保存并退出 先按esc,再输入:wq!

4 新建service的yaml文件,

  • 在同样的文件夹下编写Service的yaml文件
  • mysql-svc.yaml(名字随意取)
    yaml文件如下所示(相关注释等后期维护🤔️):
apiVersion: v1
kind: Service # 表明是Service
metadata:
  name: mysql-svc # service名称全局唯一
  namespace: test-zlh #前面创建的namespace
  labels:
    app: mysql-zlh
spec:
  type: NodePort # 开启NodePort方式的外网访问模式
  ports:
  - port: 3306 # service提供服务的端口号
    protocol: TCP # 协议,默认为TCP
    targetPort: 3306 # 需要转发给后端pod的端口号
    nodePort: 31234  #开放给外部使用的端口号
  selector:
    app: mysql-zlh # service对应pod拥有这里定义的标签

5 创建资源

5.1 创建deploy

在master节点输入以下语句:

kubectl create -f mysql-deployment.yaml

创建一个Deployment对象来生成对应的Replica Set并完成Pod副本的创建过程。

5.2 创建service

在master节点输入以下语句:

kubectl create -f mysql-svc.yaml

5.3 执行后查看是否创建成功(需要指定所在的namespace)

  • 查看deploy
kubectl get deploy -n test-zlh
  • 查看rs
kubectl get rs -n test-zlh
  • 查看pod
kubectl get po -n test-zlh
  • 查看svc
kubectl get svc -n test-zlh

🀄️结果如下显示:
在这里插入图片描述

5.3 问题排查

在这个过程中我出现了无数的坑!!!

5.3.1 yaml文件格式问题

yaml文件中的锁进问题,出现三四次报错。
解决方式:缩进一定要正确(重要的是要明白每个key之间的对应关系,我是小白,跟着别人的语句写的,导致缩进有问题)

5.3.2 单词编写错误

部分单词编写错误还好,重点是kind部分value需要开头大写,例如Deployment,Service等。

5.3.3 未设置每个pod的资源,导致报错“ OOMKilled ”

错误原因:容器使用的内存资源超过了限制
在这里插入图片描述
解决方法:
1、修改yaml,增大内存的限制大小
2、直接修改deploy,增加内存的限制大小

kubectl edit deploy mysql-deployment
5.3.4 创建deployment成功,但是查看不到pod

修改了deployment的yaml文件,添加了limit和request资源,再重建deployment之后,发现deployment创建好了,但是查看不到pod。因此,就去查看一下rs的细节:

kubectl describe rs mysql-deployment-7c68c9c7f -n test-zlh

(mysql-deployment-7c68c9c7f是查看到的失败的rs名称)
执行后可以看到Event中的报错提示:
在这里插入图片描述
发现我写资源时候写错了,太粗心大意了😂
在这里插入图片描述
解决方法:
1、修改yaml,增大内存的限制大小
2、直接修改deploy,增加内存的限制大小

kubectl edit deploy mysql-deployment

6 数据库测试连接

以上都成功了之后,使用数据库可视化工具DataGrip进行测试连接(或者Navicat都行)
Host中输入pod所在node的ip,端口填入service的yaml文件中设置的nodePort:31234(每人设置不一样,我设置的是31234)。
之后成功连接即可。
在这里插入图片描述

二、docker中部署mysql
😊 前提:已经安装了docker
mysql镜像网址:https://hub.daocloud.io/repos/fa51c1d6-9dc2-49d9-91ac-4bbfc24a1bda
其实这个界面都给出了如何运行mysql实例,比较好的一点
在这里插入图片描述
1 pull镜像

docker pull daocloud.io/library/mysql:5.7.5-m15

2 pull完成后查看镜像

docker images

3 启动mysql容器实例

docker run -itd --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 daocloud.io/library/mysql:5.7.5-m15

在上述命令中,mysql-test 指定了该容器的名字(可自己随意更换),p指定开放端口3306进行映射(-P 也行,就是随机的端口映射,后面就不需要加端口号,直接是 --name mysql-test -P -e),123456 指定了 root 用户的密码(可自己随意更换),tag 参数指定了你想要的 MySQL 版本(设置启动的镜像版本,一般也就是pull的镜像版本)。
4 进入容器实例
(个人理解是,进入了非常简易的一个linux环境)

docker exec -it mysql-test bash 

🎬补充:为了解决docker内运行mysql无法输入中文的问题,可在进入容器实例的时候,设置一个中文环境,如下

docker exec -it mysql env LANG=C.UTF-8 /bin/bash

5 命令行登录mysql
(在刚刚进入的简易linux环境中再登录mysql)

mysql -uroot -p

⚠️ 此处输入密码123456
6 进入之后就显示mysql的命令行语句了
在这里插入图片描述
7 可视化工连接该mysql

  • 查看正在运行的容器
docker ps

在这里插入图片描述

  • 查看端口,是3306(如果上文映射端口时是-P,这里显示会是随机的端口号)
  • 打开数据库可视化工具,输入信息
    主机:localhost
    用户名:root
    密码:123456
  • 可正确连接,接下来就正常使用就行

8 退出mysql
需要exit2次,一次是退出mysql,一次是退出实例
在这里插入图片描述

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐