k8s部署mysql服务
一、创建pv和pvc
容器创建后,没有pv (PersistentVolume 持久卷)和pvc (PersistentVolumeClaim 持久卷生命)挂载存储相应数据,在删除容器后所有数据都会被清空回到初始状态。生产环境会因为数据丢失导致系统崩坏,服务不能启动等问题,因此需要先挂载pv和pvc。
mysql-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv # pv的名称
namespace: zhongchuan141 #pv所属命名空间
spec:
capacity:
storage: 10Gi #pv提供的存储容量 10G
accessModes:
- ReadWriteOnce
#访问模式:单节点访问 ReadWriteOnce 多节点只读 ReadOnlyMany 多节点读写 ReadWriteMany
persistentVolumeReclaimPolicy: Retain
#回收策略:保留 Retain 自动删除 Delete 自动格式化 Recycle
storageClassName: mysql-storage #存储类 用于区分存储卷及匹配相同类名的生命
hostPath:
path: /home/data/mysql/data #挂载的本地目录
type: DirectoryOrCreate #目录类型:若不存在则会自动创建
mysql-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pvc
namespace: zhongchuan141
spec:
accessModes: #访问模式:单节点读写,要与pv兼容
- ReadWriteOnce
resources:
requests:
storage: 10Gi # 存储空间 10G
storageClassName: mysql-storage #匹配的存储类名称
使用 命令 kubectl apply -f mysql-pv.yaml 和 kubectl apply -f mysql-pvc.yaml 应用
二、 创建mysql数据库配置
配置文件用于对MySQL数据库进行一些定制化配置,无配置时默认使用初始配置,容易导致sql语句报错。配置文件可通过vim手动创建或者将已有的配置文件直接应用
my.cnf
[mysqld]
server-id=5
long_query_time=1
log_output=FILE
ssl=OFF
explicit_defaults_for_timestamp=ON
sql_mode=NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
lower_case_table_names=1
log_timestamps=SYSTEM
symbolic-links=0
max_connections=1000
max_connect_errors=1000
单个配置文件可采用创建configMap的方式实现,用携程yaml文件
kubectl create configmap mysql-config -n zhongchuan141 --from-file=my.cnf=./my.cnf
#格式
#kubectl create configmap <cm名称> -n <命名空间> --from-file=<cm中的键名>=<本地文件目录>
三、创建deployment和service文件
deployment.yaml用于创建和管理pod,pod的增加、减少、资源调整都需要用pod
service.yaml用于暴露pod对外的端口
apiVersion: apps/v1
kind: Deployment
metadata:
name: zhongchuan141-mysql #deployment的名称,用于标识这个部署
namespace: zhongchuan141
spec:
replicas: 1 #运行的容器资源
selector:
matchLabels:
app: zhongchuan141-mysql # 用于匹配Pod的标签,与pod模板中的labels对应
template: #pod的模板
metadata:
labels:
app: zhongchuan141-mysql #pod的标签,需要与deployment的selector匹配
spec:
containers:
- name: zhongchuan141-mysql #容器名称
image: dockerhub.kubekey.local/tiangang/mysql:5.7.34 #镜像名称及版本
ports:
- containerPort: 3306 #容器内暴露的端口
env: #环境变量
- name: MYSQL_ROOT_PASSWORD
value: "root123456"
volumeMounts: #容器内挂载的卷
- name: mysql-data #mysql存储卷
mountPath: /var/lib/mysql
- name: mysql-config #mysql配置卷
mountPath: /etc/mysql/my.cnf
volumes: #定义pod使用的卷(关联外部存储或配置)
- name: mysql-data
persistentVolumeClaim:
claimName: mysql-pvc
#关联之前创建的mysql-pvc(pvc和pv会根据类或者资源情况自动匹配)
- name: mysql-config
configMap:
name: mysql-config
#关联之前创建的mysql-config (通过configMap注入my.cnf)
---
apiVersion: v1
kind: Service
metadata:
name: zhongchuan141-mysql #Service名称,与deployment名称保持一致,便于管理
namespace: zhongchuan141 #与deployment相同的命名空间
spec:
type: NodePort
#服务类型
selector:
app: zhongchuan141-mysql #关联标签为app:xxx的pod,即deployment中创建的pod
ports:
- port: 3306 #Service自身的端口,集群内其他服务访问时使用此端口
targetPort: 3306 #映射到pod的端口,需要与pod和containerPort一致
nodePort: 30278 #节点暴露的固定端口 (范围时30000~32767)
service的类型
- ClusterIP(默认类型)
- 定义:为 Service 分配一个集群内部唯一的虚拟 IP(ClusterIP),仅能在集群内部访问。
- 特点:
- 不暴露到集群外部,仅集群内的 Pod、容器或其他 Service 可访问。
- 自动分配 IP(也可通过
spec.clusterIP手动指定,需确保未被占用)。
- 适用场景:仅需集群内部通信的服务(如后端 API、数据库等,不对外暴露)。
-
NodePort
- 定义:在
ClusterIP基础上,为 Service 在集群的每个节点上开放一个静态端口(NodePort),外部可通过 “节点 IP:NodePort” 访问服务。 - 特点:
- 同时具备 ClusterIP 的内部访问能力(集群内仍可用 ClusterIP:port 访问)。
- NodePort 端口范围固定(30000-32767,由 K8s 默认限制,避免与节点其他端口冲突)。
- 无论 Pod 调度到哪个节点,所有节点都会开放该端口(访问任意节点的 NodePort 均可转发到目标 Pod)。
- 适用场景:测试环境中需要简单暴露服务到集群外部(如临时让外部客户端访问)。
- LoadBalancer
- 定义:结合云服务提供商(如 AWS、GCP、阿里云等)的负载均衡器,自动创建一个外部负载均衡器,并将流量转发到 Service。
- 特点:
- 依赖云厂商的负载均衡器支持(自建 K8s 集群可能不生效)。
- 云厂商会分配一个外部 IP(或域名),外部可通过该 IP 直接访问服务。
- 底层基于
NodePort和ClusterIP实现(自动创建 NodePort 和 ClusterIP)。
- 适用场景:生产环境中需要稳定的外部访问入口(如公网可访问的 Web 服务)。
四、相关命令
kubectl apply -f mysql-141.yaml 应用yaml文件
kubectl get pods -n zhongchuan141 查看对应命名空间下的pod
kubectl get svc -n zhongchuan141 查看service暴露的端口
kubectl cp /本地路径/数据.sql <容器名>:/tmp/数据.sql
kubectl exec -it -n zhongchuan141 zhongchuan141-mysql-687f67c6b8-2dcc6 bash 导入数据
效果:

更多推荐

所有评论(0)