(二十三)、k8s(minikube) 部署mysql

1、安装

1.1、环境

docker 部署 minikube,minikube 中部署 mysql
Mac,注意芯片类型 和 workbench 版本适配(workbench最新版 8.0.40,对于image mysql:version, version 的值 M2 版本 8.0.30, Intel 芯片 8.0)

1.2、workbench 崩溃问题

在 MySQL Workbench 中,点击 Help 菜单,然后选择 About MySQL Workbench 查看版本

kubectl exec -it – mysql --version 查看k8s 中 mysql 版本

1.1、deployment.yaml 文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql-deployment
  labels:
    app: mysql
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:8.0  # M2 版本 8.0.30,目前最新 workbench 最高到 8  #非 arm 架构芯片可以写 image: mysql:8.0
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: rootadmin  # 设置 root 用户密码
        ports:
        - containerPort: 3306
        volumeMounts:
        - name: mysql-storage
          mountPath: /var/lib/mysql  # MySQL 数据存储路径
      volumes:
      - name: mysql-storage
        persistentVolumeClaim:
          claimName: mysql-pvc  # 使用 PVC
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi  # 请求的存储大小
  storageClassName: standard  # 确保与您的 PV 的存储类匹配
---
apiVersion: v1
kind: Service
metadata:
  name: mysql-service
spec:
  type: NodePort  # 设置为 NodePort 类型
  selector:
    app: mysql  # 选择与 Deployment 中相同的标签
  ports:
    - port: 3306  # Service 的端口
      targetPort: 3306  # Pod 中的端口
      nodePort: 30002  # 自定义 NodePort(可选,范围是 30000-32767)

1.2、运行

kubectl apply -f mysql-deployment.yaml         

1.3、启动隧道,从宿主机直接访问 k8s 中的mysql

minikube get services
minikube service mysql-service

2、完整卸载 mysql(pod/deployment/service/pvc)

➜  simpled git:(security) ✗ kubectl get pods                            
NAME                                READY   STATUS    RESTARTS      AGE
mysql-deployment-848886474f-6q94t   1/1     Running   0             3m54s
redis-559d94f9bc-mgfxt              1/1     Running   1 (32m ago)   4h57m
➜  simpled git:(security) ✗ kubectl delete pod mysql-deployment-848886474f-6q94t 
pod "mysql-deployment-848886474f-6q94t" deleted
➜  simpled git:(security) ✗ kubectl get deployments                              
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
mysql-deployment   0/1     1            0           4m19s
redis              1/1     1            1           4h57m
➜  simpled git:(security) ✗ kubectl delete deployment mysql-deployment 
deployment.apps "mysql-deployment" deleted
➜  simpled git:(security) ✗ kubectl get services
NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
kubernetes      ClusterIP   10.96.0.1       <none>        443/TCP          5h1m
mysql-service   NodePort    10.106.158.26   <none>        3306:30002/TCP   4m44s
redis-service   NodePort    10.108.203.83   <none>        6379:30001/TCP   4h58m
➜  simpled git:(security) ✗ kubectl delete service mysql-service 
service "mysql-service" deleted
➜  simpled git:(security) ✗ kubectl get pvc
NAME        STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
mysql-pvc   Bound    pvc-59ff2870-64c4-46ca-a74d-b36380ceca0c   1Gi        RWO            standard       <unset>                 5m20s
➜  simpled git:(security) ✗ kubectl delete mysql-pvc
error: the server doesn't have a resource type "mysql-pvc"
<think>首先,用户的问题是关于在Kubernetes(K8s)上部署MySQL的详细步骤和方法。我需要基于提供的引用内容来回答。参考的引用包括: - [1] 讨论了MySQLK8s上的部署优势,如资源隔离、动态弹性扩缩容、环境一致性和运维方便。 - [2] 提到了部署MySQL集群时遇到的错误,并基于某个基础进行了修改。 - [3] 描述了安装MySQL的步骤,包括创建部署文件、服务文件和测试。 - [4] 提供了部署单机MySQL的说明,使用hostPath作为PV,并建议使用NFS。 - [5] 讨论了部署MySQL应用时处理冗余的问题,如多pod方法。 用户的问题是:“我想查找k8s部署mysql的方法 请问k8s部署mysql的详细步骤和方法”。所以,我需要提供一个详细的步骤指南。 我的回答必须结构化、清晰,帮助用户逐步解决问题。确保真实可靠。 回答结构: 1. **引言**:简要介绍在K8s部署MySQL的好处,基于引用[1]。 2. **准备工作**:列出部署前的准备事项,如K8s集群设置、存储类配置等。 3. **详细步骤**:分步描述部署过程。参考引用[3]和[4],包括创建命名空间、部署文件、服务文件等。 - 使用YAML文件示例。 - 注意存储问题,PV和PVC的使用。引用[4]提到使用hostPath或NFS。 4. **测试和验证**:如何测试部署,确保MySQL运行正常。 5. **优化和注意事项**:基于引用[2]和[5],讨论集群部署、冗余处理等。引用[2]提到错误处理,引用[5]讨论多pod冗余。 6. **常见问题**:简要提及可能的问题和解决方案。 最后,生成相关问题,如系统指令要求。 确保使用中文回答。 遵循LaTeX格式:行内数学表达式用$...$,独立公式用$$...$$。但在这个主题中,可能不需要数学表达式,除非涉及计算。 引用标识:在段落末尾自然地添加引用,如[^1]。 生成相关问题:至少3个,基于内容。 详细步骤大纲: 1. **创建命名空间(Namespace)**:参考引用[2]和[3],使用namespace.yaml。 2. **配置存储**:创建PersistentVolume (PV) 和 PersistentVolumeClaim (PVC)。引用[4]使用hostPath,但建议NFS。 3. **创建部署文件(Deployment)**:定义MySQL容器、卷挂载等。参考引用[3]。 4. **创建服务文件(Service)**:暴露MySQL服务,可能使用NodePort或ClusterIP。 5. **测试部署**:连接到MySQL实例验证。 对于集群部署,参考引用[5],使用StatefulSet和冗余机制。 YAML示例:提供代码块,如引用[3]中的。 确保语法正确。 最终回答结构: - **引言** - **步骤1: 准备工作** - **步骤2: 创建命名空间** - **步骤3: 配置存储** - **步骤4: 创建MySQL部署** - **步骤5: 创建服务** - **步骤6: 测试部署** - **优化建议** - **常见问题** 结束生成相关问题。 </think> ### Kubernetes 部署 MySQL 的详细步骤与方法 在 Kubernetes(K8s)上部署 MySQL 可以提供资源隔离、动态弹性扩缩容、环境一致性和运维便捷性等优势[^1]。以下基于引用内容,详细介绍单机 MySQL部署步骤(适用于测试或开发环境)。部署过程涉及创建命名空间、配置存储、定义部署和服务文件。所有步骤使用 YAML 配置文件,并确保高可靠性。 #### 步骤 1: 准备工作 在开始前,确保满足以下条件: - 已安装并配置好 Kubernetes 集群(如使用 Minikube 或云服务商提供的 K8s)。 - 安装 kubectl 命令行工具。 - 准备存储解决方案:推荐使用 NFS 或云存储(如 AWS EBS),避免使用 hostPath 在生产环境中(因其依赖节点本地路径,可能导致数据丢失)[^4]。 - 下载 MySQL Docker 镜像(如官方镜像 `mysql:8.0`)。 #### 步骤 2: 创建命名空间(Namespace) 创建一个隔离的命名空间,便于管理 MySQL 资源。新建文件 `namespace.yaml`: ```yaml apiVersion: v1 kind: Namespace metadata: name: mysql-ns ``` 应用配置文件: ```bash kubectl apply -f namespace.yaml ``` 此步骤确保 MySQL 资源在独立空间中运行,避免与其他应用冲突[^2][^3]。 #### 步骤 3: 配置存储(PersistentVolume 和 PersistentVolumeClaim) MySQL 需要持久化存储数据。使用 PersistentVolume (PV) 和 PersistentVolumeClaim (PVC) 来实现: - **PV**:定义存储资源(如 NFS 卷)。 - **PVC**:请求存储资源供 MySQL 使用。 新建文件 `storage.yaml`(以 NFS 为例,替换 `your-nfs-server-ip` 和 `/path/to/nfs`): ```yaml # 定义 PersistentVolume apiVersion: v1 kind: PersistentVolume metadata: name: mysql-pv namespace: mysql-ns spec: capacity: storage: 5Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain nfs: server: your-nfs-server-ip path: /path/to/nfs --- # 定义 PersistentVolumeClaim apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mysql-pvc namespace: mysql-ns spec: accessModes: - ReadWriteOnce resources: requests: storage: 5Gi ``` 应用配置文件: ```bash kubectl apply -f storage.yaml ``` 注意:如果使用 hostPath(仅限测试),PV 需指定节点路径(如 `/opt/mysql`),但需固定 Pod 到特定节点以避免数据不一致[^4]。 #### 步骤 4: 创建 MySQL 部署(Deployment) 使用 Deployment 定义 MySQL 容器,挂载 PVC 存储,并设置环境变量(如 root 密码)。新建文件 `deployment.yaml`: ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: mysql-deployment namespace: mysql-ns spec: replicas: 1 # 单机部署,集群部署需用 StatefulSet selector: matchLabels: app: mysql template: metadata: labels: app: mysql spec: containers: - name: mysql image: mysql:8.0 env: - name: MYSQL_ROOT_PASSWORD value: "your-root-password" # 替换为安全密码 ports: - containerPort: 3306 volumeMounts: - name: mysql-storage mountPath: /var/lib/mysql volumes: - name: mysql-storage persistentVolumeClaim: claimName: mysql-pvc ``` 应用配置文件: ```bash kubectl apply -f deployment.yaml ``` 此部署确保 MySQL 数据持久化,并设置 root 密码环境变量[^4]。 #### 步骤 5: 创建服务(Service) 暴露 MySQL 服务,以便集群内外访问。使用 NodePort 类型方便测试。新建文件 `service.yaml`: ```yaml apiVersion: v1 kind: Service metadata: name: mysql-service namespace: mysql-ns spec: selector: app: mysql ports: - protocol: TCP port: 3306 targetPort: 3306 type: NodePort # 可选 ClusterIP 用于内部访问 ``` 应用配置文件: ```bash kubectl apply -f service.yaml ``` 获取服务端口: ```bash kubectl get svc -n mysql-ns ``` #### 步骤 6: 测试部署 验证 MySQL 是否正常运行: 1. 连接到 MySQL Pod: ```bash kubectl exec -it -n mysql-ns $(kubectl get pods -n mysql-ns -l app=mysql -o jsonpath='{.items[0].metadata.name}') -- mysql -u root -p ``` 输入密码后,执行 SQL 命令(如 `SHOW DATABASES;`)。 2. 外部访问(如果使用 NodePort): - 获取节点 IP 和端口:`kubectl get svc -n mysql-ns`。 - 使用 MySQL 客户端连接:`mysql -h <node-ip> -P <node-port> -u root -p`。 #### 优化与注意事项 - **集群部署**:对于生产环境,使用 StatefulSet 替代 Deployment 以支持多副本和有序部署(如主从复制)。引用[5]建议通过多 Pod 冗余提高可用性[^5]。 - **存储优化**:避免 hostPath,改用动态存储类(StorageClass)以实现自动卷管理[^4]。 - **错误处理**:部署时常见错误包括 YAML 语法错误或存储配置不匹配。引用[2]强调需根据环境调整配置文件(如修改镜像版本或资源限制)。 - **监控**:集成 Prometheus 和 Grafana 监控 MySQL 性能指标。 通过以上步骤,您可以在 K8s 上成功部署单机 MySQL。如需高可用集群,参考 MySQL 官方文档或社区方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值