当前位置: 首页 > news >正文

[MYSQL/K8s] 基于 Kubenetes 集群安装 MYSQL

0 序

  • 本篇的目的不在于安装mysql,而在于安装部署完成K8s后,以MYSQL为例展示如何基于K8s集群部署一个程序服务。

1 部署步骤

step1 配置 mysql.yaml

mkdir -p ~/k8s-deployments/touch ~/k8s-deployments/mysql.yaml
vim ~/k8s-deployments/mysql.yaml

编辑内容:

# mysql-configmap.yaml | ConfigMap: MySQL 配置
apiVersion: v1
kind: ConfigMap
metadata:name: mysql-confignamespace: mysql
data:my.cnf: |[mysqld]character-set-server=utf8mb4collation-server=utf8mb4_unicode_cimax_connections=200innodb_buffer_pool_size=256M---# mysql-secret.yaml | Secret: MySQL 密码(生产环境建议使用 Vault 或 External Secrets)
apiVersion: v1
kind: Secret
metadata:name: mysql-secretnamespace: mysql
type: Opaque
stringData:MYSQL_ROOT_PASSWORD: "YourStrongPassword123!"MYSQL_USER: "appuser"MYSQL_PASSWORD: "AppUserPass123!"---# mysql-pvc.yaml | PVC: 数据存储(使用 local-path-provisioner )
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: mysql-pvcnamespace: mysql
spec:# 指定 local-path-provisionerstorageClassName: local-pathaccessModes:# MySQL 单实例只需 RWO- ReadWriteOnceresources:requests:# 根据实际需求调整storage: 20Gi---
# mysql-statefulset.yaml | StatefulSet: MySQL 有状态的工作负载 (与 无状态的 Deployment 相对)
apiVersion: apps/v1
kind: StatefulSet
metadata:name: mysqlnamespace: mysql
spec:serviceName: mysqlreplicas: 1selector:matchLabels:app: mysqltemplate:metadata:labels:app: mysqlspec:containers:- name: mysqlimage: mysql:8.0ports:- containerPort: 3306name: mysqlenv:- name: MYSQL_ROOT_PASSWORDvalueFrom:secretKeyRef:name: mysql-secretkey: MYSQL_ROOT_PASSWORD- name: MYSQL_DATABASEvalue: "app_database"volumeMounts:- name: mysql-datamountPath: /var/lib/mysql    # MySQL 数据目录- name: mysql-configmountPath: /etc/mysql/conf.dresources:requests:memory: "512Mi"cpu: "500m"limits:memory: "1Gi"cpu: "1000m"livenessProbe:exec:command: ["mysqladmin", "ping", "-p${MYSQL_ROOT_PASSWORD}"]initialDelaySeconds: 30periodSeconds: 10readinessProbe:exec:command: ["mysqladmin", "ping", "-p${MYSQL_ROOT_PASSWORD}"]initialDelaySeconds: 5periodSeconds: 2volumes:- name: mysql-datapersistentVolumeClaim:# 引用上面定义的 PVCclaimName: mysql-pvc- name: mysql-configconfigMap:name: mysql-config---# mysql-service.yaml | Service: 暴露 MySQL 端口
apiVersion: v1
kind: Service
metadata:name: mysqlnamespace: mysql
spec:selector:app: mysqlports:- port: 3306targetPort: 3306type: ClusterIP

当然,也可将本文件分拆为几个文件来进行部署:

mysql-deployment.yaml

mysql-secret.yaml
mysql-configmap.yaml

mysql-namespace.yaml

mysql-pv-pvc.yaml

mysql-service.yaml

...

step2 基于 mysql.yaml 部署/启动运行

kubectl create -f mysql.yaml
或 kubectl apply -f mysql.yaml[补充] kubectl delete -f mysql.yaml

step3 查验 MYSQL 的运行情况

查验 k8s 的 service/pod/statefulset、secret、pv/pvc

//查看 service/pod/statefulset/
# kubectl get all --namespace mysql
NAME          READY   STATUS    RESTARTS   AGE
pod/mysql-0   1/1     Running   0          4h14mNAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
service/mysql   ClusterIP   10.100.xxx.19   <none>        3306/TCP   4h14mNAME                     READY   AGE
statefulset.apps/mysql   1/1     4h14m//查看 secret
# kubectl get secret --namespace mysql
NAME           TYPE     DATA   AGE
mysql-secret   Opaque   3      4h15m//查看 pv / pvc
# kubectl get pv --namespace mysql
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM             STORAGECLASS   REASON   AGE
pvc-10e35004-c24f-443d-9268-e5603172c382   20Gi       RWO            Delete           Bound    mysql/mysql-pvc   local-path              4h17m
# kubectl get pvc --namespace mysql
NAME        STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
mysql-pvc   Bound    pvc-10e35004-c24f-443d-9268-e5603172c382   20Gi       RWO            local-path     4h18m

获取 Kubernetes 中 MySQL Pod 的连接信息

1. 查看 Pod 的 IP 和端口

# 获取 Pod 的详细信息,包括 IP 地址
kubectl get pod <mysql-pod-name> -o wide# 查看 Pod 的详细描述(包含端口映射)
kubectl describe pod <mysql-pod-name>

2. 查看 Service 信息(推荐方式)

通常 MySQL 会通过 Service 暴露,这样更稳定:

# 列出所有 Service
kubectl get svc# 查看 MySQL Service 详情
kubectl describe svc <mysql-service-name># 获取 Service 的 ClusterIP 和端口
kubectl get svc <mysql-service-name> -o jsonpath='{.spec.clusterIP}:{.spec.ports[0].port}'

3. 通过环境变量查看(若是通过 Secret 配置的)

# 查看 Pod 的环境变量
kubectl exec <mysql-pod-name> -- env | grep -i mysql# 查看 Secret 中的连接信息
kubectl get secret <mysql-secret-name> -o yaml
# 解码 base64 密码
echo "<base64-encoded-password>" | base64 -d

4. 查看 ConfigMap 或部署配置

# 查看使用的 ConfigMap
kubectl get configmaps --namespace <mysql-namespace>
kubectl get configmap <mysql-configmap> --namespace <mysql-namespace> -o yaml# 查看 Deployment/StatefulSet 的配置
kubectl get deployments --namespace <mysql-namespace>
kubectl get deployment <mysql-deployment> --namespace <mysql-namespace> -o yamlkubectl get statefulsets --namespace <mysql-namespace>
//如: kubectl get statefulsets -n mysql
//NAME    READY   AGE
//mysql   1/1     4h39m
kubectl get statefulset <mysql-statefulset> --namespace <mysql-namespace> -o yaml

5. 端口转发(本地测试用)

# 将本地端口映射到 Pod 端口
kubectl port-forward <mysql-pod-name> 3306:3306# 然后本地可以用 localhost:3306 连接
mysql -h localhost -P 3306 -u root -p

典型连接信息示例

信息项 获取方式
主机地址 Service 的 ClusterIP 或 Service 名称
端口 默认 3306,查看 kubectl get svc
用户名 通常是 root 或自定义用户,查看 Secret/环境变量
密码 查看 Secret:kubectl get secret

最佳实践建议

  1. 使用 Service DNS 连接:在集群内通过 <service-name>.<namespace>.svc.cluster.local 连接
  2. 使用 Secret 管理凭证:不要硬编码密码
  3. 考虑使用 Helm Chart:如 bitnami/mysql,会自动配置好连接信息

连接验证

  • 安装 MYSQL 客户端 (可忽略此步骤,跳过即可)

    • 详情参见: MYSQL之数据库管理篇-安装客户端 - 博客园/千千寰宇
  • 推荐方式: 直接进入Pod内

    • kubectl exec -it <mysql-pod-name> --namespace mysql -- mysql --port=3306 -u root -p
[root@vm-a k8s-deployments]# kubectl exec -it mysql-0 -n mysql  -- mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8568
Server version: 8.0.45 MySQL Community Server - GPLCopyright (c) 2000, 2026, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> SELECT user, host FROM mysql.user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| root             | %         |
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+
5 rows in set (0.00 sec)mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| app_database       |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)
  • 推荐方式: 直接进入Pod内
# 找到 mysql 相关的 pod
kubectl get pods -n mysql -l app=mysql# 进入 pod 内部,然后在 pod 里连接 mysql
kubectl exec -it <mysql-pod-name> -n mysql -- /bin/bash# 在 pod 内部使用服务名连接
mysql -h mysql.mysql.svc.cluster.local -P 3306 -u root -p如: 
[root@vm-a k8s-deployments]# kubectl exec -it mysql-0 -n mysql -- /bin/bash
bash-5.1# mysql -h mysql.mysql.svc.cluster.local -P 3306 -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10316
Server version: 8.0.45 MySQL Community Server - GPLCopyright (c) 2000, 2026, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> exit;

Z FAQ for K8s 安装部署 MYSQL

Q: service 的 type 为 ClsuterIP ,无法基于<serviceName>.<namespace>.svc.cluster.local的【服务域名】在宿主机上访问,如何解决?

问题描述

[root@vm-a k8s-deployments]# ssh mysql.mysql.svc.cluster.local -p 3306 -v
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips  26 Jan 2017
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 58: Applying options for *
ssh: Could not resolve hostname mysql.mysql.svc.cluster.local: Name or service not known

原因分析

这个错误表明 DNS 解析失败,无法找到 mysql.mysql.svc.cluster.local 这个域名。

mysql.mysql.svc.cluster.local 是 Kubernetes 集群内部的 DNS 名称,只能在 Pod 内部或通过集群 DNS 解析。你的宿主机(vm-a)无法直接解析这个域名。

解决方案

方案 1:进入 Pod 内部执行(推荐)

# 找到 mysql 相关的 pod
kubectl get pods -n mysql -l app=mysql# 进入 pod 内部,然后在 pod 里连接 mysql
kubectl exec -it <mysql-pod-name> -n mysql -- /bin/bash# 在 pod 内部使用服务名连接
mysql -h mysql.mysql.svc.cluster.local -P 3306 -u root -p

方案 2:使用 kubectl port-forward 转发端口

# 将本地端口映射到 mysql 服务
kubectl port-forward svc/mysql 3306:3306 -n mysql# 然后在另一个终端连接本地端口
mysql -h 127.0.0.1 -P 3306 -u root -p

方案 3:直接使用 Pod IP(临时方案)

# 获取 mysql pod 的 IP
kubectl get pods -n mysql -o wide# 使用 Pod IP 连接(不推荐,IP 会变)
mysql -h <pod-ip> -P 3306 -u root -p

方案 4:使用 NodePort 或 LoadBalancer 暴露服务

如果你确实需要从集群外部访问,可以修改 Service 类型:

# 查看当前 service 类型
kubectl get svc mysql -n mysql# 修改为 NodePort(示例)
kubectl patch svc mysql -n mysql -p '{"spec":{"type":"NodePort"}}'# 或者使用 LoadBalancer(如果有云提供商支持)
kubectl patch svc mysql -n mysql -p '{"spec":{"type":"LoadBalancer"}}'

快速排查命令

# 确认 mysql 服务是否存在
kubectl get svc -n mysql# 确认 DNS 服务是否正常
kubectl get pods -n kube-system -l k8s-app=kube-dns# 测试集群 DNS 解析(在 pod 内执行)
kubectl run -it --rm debug --image=busybox:1.28 --restart=Never -- nslookup mysql.mysql.svc.cluster.local

总结

场景 推荐方案
临时调试 kubectl exec 进入 Pod
本地开发 kubectl port-forward
生产环境外部访问 NodePort / LoadBalancer / Ingress

Y 推荐文献

  • K8s概述 - 博客园/千千寰宇
  • [K8s] Kubernetes 安装部署指南(V2) - 博客园/千千寰宇
  • [云原生] K8s 核心组件使用指南 - 博客园/千千寰宇
  • MYSQL之数据库管理篇 - 博客园/千千寰宇
    • MYSQL之数据库管理篇-安装客户端 - 博客园/千千寰宇

X 参考文献

http://www.jsqmd.com/news/668848/

相关文章:

  • 实战指南|3类高频软件漏洞,从识别到修复一步到位
  • 7岁、10岁、14岁开始学C++,收益与必要性有何不同?
  • Spring Boot 条件装配入门:一文搞懂 @ConditionalOnClass(附实战)
  • 2026年泰迪杯A完整题解方案-详细解题思路和论文+完整项目代码+全套资源
  • C语言之Redis源码阅读学习顺序
  • 2026市场岗位学数据分析的价值分析
  • Windows (PowerShell)安装部署OpenClaw
  • 从CTFHub靶场实战出发:手把手教你用Gopher协议打穿SSRF(附BurpSuite配置)
  • 瓶子倒水二分法:最大化最小值
  • 下篇:Python 多任务编程入门(二)—— 进程同步、进程池与注意事项
  • leetcode热题 - 3
  • 力扣-142.环形指针
  • Delphi 10.4.2 实战:手把手教你用FMXLinux在Ubuntu上跑通第一个GUI程序
  • 从kHz到EHz:揭秘频率单位阶梯的换算逻辑与工程应用场景
  • Django 后台导出数据功能的实现
  • Gemini出点问题-----解决
  • 手写一个最小 Starter:从 0 到能看懂
  • 考研复习Day 16 | 数据结构与算法 --树与二叉树(上)
  • AI Agent Harness Engineering 的部署架构:单体部署、分布式部署与混合云
  • 终极BT下载加速指南:每天更新的Tracker列表让你的下载速度翻倍
  • FastAPI 项目 PyInstaller 打包 exe 全踩坑根治教程(Windows 全电脑通用分发)
  • 企业云盘选型标准合同条款:数据归属/服务等级/SLA全解析
  • 探究分享从对话到执行:OpenTiny NEXT 如何重塑前端智能化开发范式
  • STM32 IAP升级踩坑实录:BootLoader跳转失败、向量表重置、Flash分区冲突,我是如何解决的?
  • ControlSizePyQt - PyQt 版本的统一尺寸和颜色管理系统
  • 网络工程师必看:H3C与华为认证体系的前世今生及备考选择指南
  • 淘一个二手铷原子钟并用起来的过程
  • 从卖不出去到月入15000,贵阳这两家公司凭什么让销售翻身? - 精选优质企业推荐官
  • 一文看懂推荐系统:排序09:Field-aware Factorization Machines (FFM) 的工业界冷思考:为何从FM到FFM的改进叫好不叫座?
  • uni-app怎么实现弹窗 uni-app自定义模态框遮罩层【代码】