• minikube 实战篇 - mysql部署 - 1


    在项目的开发中肯定是需要使用数据库进行数据化持久操作。在JAVA项目中使用比较多的数据库是mysql,这篇文章主要描述怎么在minikube中安装mysql数据库。

    mysql部署

    1、获取mysql镜像

    可以在dockerhub中搜索镜像地址,首先打开“Docker Hub”,在搜索框中输入mysql,找到mysql官方发布的docker镜像地址为“mysql”,mysql的端口为3306。按照之前部署demo的操作,重写一下执行命令。如下:

    kubectl create deployment mysql --image=mysql 
    kubectl expose deployment mysql --type=NodePort --port=3306
    
    • 1
    • 2

    重写完成之后在控制台执行查看

    2、创建mysql pod

    执行之后通过get pod查看是否创建成功

    C:\Users\smy1102>kubectl get pods
    NAME                          READY   STATUS              RESTARTS        AGE
    docker-demo-864cc5fb9-rrd59   1/1     Running             0               5h45m
    mysql-77db55c6db-22lxf        0/1     CrashLoopBackOff   0               47s
    
    • 1
    • 2
    • 3
    • 4

    生成了一条mysql-77db55c6db-22lxf 记录,pod的状态为CrashLoopBackOff。

    3、CrashLoopBackOff问题梳理

    我之前发布了一篇文章“minikube 快速使用入门 - pod - 外传”,这里面有详细记录pod的状态信息,找到相关说明。如下:

    状态描述
    CrashLoopBackOff容器退出,kubelet 正在将它重启

    上面显示的状态不是running,这个肯定是部署的时候出现问题才会出现的。这时候应该排查一下问题,如:查看这个pod的执行日志是否正常,查看这个pod的详细情况。这些命令,我在文章“minikube 快速使用入门 - 命令篇 - 4”也有记录。如下:

    # 查看 pod 详情
    kubectl describe pod {{PodName}}
    # 查看 log
    kubectl logs {{PodName}}
    
    • 1
    • 2
    • 3
    • 4

    首先执行一下“查看pod详情”:

    C:\Users\smy1102>kubectl describe pod mysql-77db55c6db-22lxf
    Name:         mysql-77db55c6db-22lxf
    Namespace:    default
    Priority:     0
    Node:         minikube/192.168.49.2
    Start Time:   Fri, 12 Aug 2022 14:04:36 +0800
    Labels:       app=mysql
                  pod-template-hash=77db55c6db
    Annotations:  <none>
    Status:       Running
    IP:           172.17.0.5
    IPs:
      IP:           172.17.0.5
    Controlled By:  ReplicaSet/mysql-77db55c6db
    Containers:
      mysql:
        Container ID:   docker://df31a04e1ced939cbf238fb9003a1b6057ffbc80b5767f6a31b3ac2e8af50142
        Image:          mysql
        Image ID:       docker-pullable://mysql@sha256:ce2ae3bd3e9f001435c4671cf073d1d5ae55d138b16927268474fc54ba09ed79
        Port:           <none>
        Host Port:      <none>
        State:          Waiting
          Reason:       CrashLoopBackOff
        Last State:     Terminated
          Reason:       Error
          Exit Code:    1
          Started:      Fri, 12 Aug 2022 14:08:11 +0800
          Finished:     Fri, 12 Aug 2022 14:08:11 +0800
        Ready:          False
        Restart Count:  5
        Environment:    <none>
        Mounts:
          /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-x6gj7 (ro)
    Conditions:
      Type              Status
      Initialized       True
      Ready             False
      ContainersReady   False
      PodScheduled      True
    Volumes:
      kube-api-access-x6gj7:
        Type:                    Projected (a volume that contains injected data from multiple sources)
        TokenExpirationSeconds:  3607
        ConfigMapName:           kube-root-ca.crt
        ConfigMapOptional:       <nil>
        DownwardAPI:             true
    QoS Class:                   BestEffort
    Node-Selectors:              <none>
    Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                                 node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
    Events:
      Type     Reason     Age                    From               Message
      ----     ------     ----                   ----               -------
      Normal   Scheduled  5m41s                  default-scheduler  Successfully assigned default/mysql-77db55c6db-22lxf to minikube
      Normal   Pulled     5m37s                  kubelet            Successfully pulled image "mysql" in 3.559175s
      Normal   Pulled     5m33s                  kubelet            Successfully pulled image "mysql" in 3.5035799s
      Normal   Pulled     5m15s                  kubelet            Successfully pulled image "mysql" in 5.3749663s
      Normal   Created    4m36s (x4 over 5m37s)  kubelet            Created container mysql
      Normal   Started    4m36s (x4 over 5m37s)  kubelet            Started container mysql
      Normal   Pulled     4m36s                  kubelet            Successfully pulled image "mysql" in 8.1586183s
      Normal   Pulling    3m42s (x5 over 5m41s)  kubelet            Pulling image "mysql"
      Warning  BackOff    33s (x22 over 5m33s)   kubelet            Back-off restarting failed container
    
    • 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
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62

    查看pod详情,在详情最后有“Back-off restarting failed container”,这意思应该是重启一下错误的容器。这个mysql容器出现了异常,需要重启。那到底是什么异常导致的,还不知道。这个时候应该去查看一下容器执行日志看看是否是部署执行的时候出现了什么异常情况。执行命令"kubectl logs "。

    C:\Users\smy1102>kubectl logs  mysql-77db55c6db-22lxf
    2022-08-12 06:16:13+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.30-1.el8 started.
    2022-08-12 06:16:13+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
    2022-08-12 06:16:13+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.30-1.el8 started.
    2022-08-12 06:16:13+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified
        You need to specify one of the following:
        - MYSQL_ROOT_PASSWORD
        - MYSQL_ALLOW_EMPTY_PASSWORD
        - MYSQL_RANDOM_ROOT_PASSWORD
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    执行“kubectl logs mysql-77db55c6db-22lxf”之后,日志里面有异常提示“[ERROR] [Entrypoint]: Database is uninitialized and password option is not specified You need to specify one of the following:
    - MYSQL_ROOT_PASSWORD” 按这个意思来说,应该是数据库没有初始化密码,需要对它进行初始化及设置MYSQL_ROOT_PASSWORD参数等。初始化密码,这个要怎么设置就成了一下问题。我参考了一下相关资料,原来是要编写一个部署文件。

    4、编写部署文件

    根据启动日志的描述,缺少初始化密码。首先在执行部署的时候设置初始密码。执行文件如下:

    apiVersion: apps/v1
    kind: Deployment # 
    metadata:
      name: mysql #名称,全局唯一
      namespace: default # 默认空间
    spec:
      replicas: 1 #Pod 副本的期待数量
      selector:
        matchLabels:
          app: mysql # 符合目标的Pod拥有此标签
      template: # 根据此模版创建Pod的副本
        metadata:
          labels:
            app: mysql # Pod副本拥有的标签,对应Selector
        spec:
          containers: # Pod的内容的定义部分
            - name: mysql # 容器的名称
              image: mysql # 容器对应的Docker Image
              ports:
                - containerPort: 3306 # 容器应用监听的端口号
              env:
                - name: MYSQL_ROOT_PASSWORD # 设置mysql的初始化密码
                  value: "123456" # 设置mysql的初始化密码
    ---
    apiVersion: v1
    kind: Service # 表明是Kubernetes Service
    metadata:
      name: mysql # Service 的全局唯一名称
    spec:
      type: NodePort
      selector:
        app: mysql
      ports: # Service 提供服务的端口
        - port: 3306 # Service 对应的Pod拥有这里定义的标签
    
    • 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

    以上就是配置文件需要准备的配置,上面有一些注释,可以详细了解。配置上已经加入“MYSQL_ROOT_PASSWORD”的初始化,可以把它保存为一个yaml的文件,如mysql-k8s.yaml。

    5、部署之前,先删除之前部署的mysql

    在执行配置文件之前,需要先把之前部署的mysql删除掉.如下:

    smy1102@LAPTOP-7HC3FEQ9 C:\Users\smy1102>kubectl delete deployment mysql
    deployment.apps "mysql" deleted
    
    smy1102@LAPTOP-7HC3FEQ9 C:\Users\smy1102>kubectl delete svc mysql
    service "mysql" deleted
    
    • 1
    • 2
    • 3
    • 4
    • 5

    删除之后,就可以开始部署mysql了。

    6、执行部署mysql

    进入到存放mysql-k8s.yaml的文件夹下执行“kubectl apply -f mysql-k8s.yaml”,可以参考文章“minikube 快速使用入门 - 命令篇 - 4”,如下:

    smy1102@LAPTOP-7HC3FEQ9 D:\minikube\source_data>kubectl apply -f mysql-k8s.yaml
    deployment.apps/mysql created
    service/mysql created
    
    • 1
    • 2
    • 3

    执行完成之后,控制台显示创建成功,需要查看一下pod的状态是否出现异常。

    smy1102@LAPTOP-7HC3FEQ9 D:\minikube\source_data>kubectl get pods
    NAME                          READY   STATUS    RESTARTS      AGE
    docker-demo-864cc5fb9-rrd59   1/1     Running   0             27h
    mysql-5fd99bf785-pdvhx        1/1     Running   0             2m21s
    
    • 1
    • 2
    • 3
    • 4

    Pod的状态显示“Running”,说明pod现在是正在运行的状态。然后需要把mysql的端口进行“port-forward”,“port-forward”之后就可以在宿主机上连接测试了。可以参考文章“minikube 快速使用入门 - 命令篇 - 4”

    # 把集群内端口映射到节点 把8080端口映射到7080
    kubectl port-forward mysql-5fd99bf785-pdvhx 3306:3306
    
    • 1
    • 2

    执行之后本地测试一下mysql客户端是否链接正常
    在这里插入图片描述

    提示“连接成功”。
    mysql部署已经完成。

  • 相关阅读:
    地址标准化服务AI深度学习模型推理优化实践
    网络安全(黑客)自学
    2024年阿里云2核4G配置服务器测评_ECS和轻量性能测评
    java毕业设计大学生心愿墙系统Mybatis+系统+数据库+调试部署
    绝绝让你明白跨域cores
    构建SpringBoot项目时报错 SocketTimeoutException connect timed out
    ARM编程模型-寄存器组
    云南民族文化旅游网页设计制作 简单静态HTML网页作品 我的家乡网页作业成品 学生旅游网站模板
    二叉树习题总结
    Nginx的重写功能——Rewrite
  • 原文地址:https://blog.csdn.net/exception_class/article/details/126340680