笔记系列k8s编排MySQL容器-有状态的容器创建过程
文章目录0.目标1.环境准备2.数据库建表文件3. 创建安装脚本4.创建自定义mysql镜像5.创建persitentVolume文件6.创建pvc7.创建deployment与service9.看成果10. 总结0.目标使用k8s创建一个有个人定义的mysql的环境,默认创建一个表phone,并且能将数据持久化存储下来。1.环境准备docker19.03k8s 1.18.13minikube v
·
文章目录
0.目标
使用k8s创建一个有个人定义的mysql的环境,默认创建一个表phone,并且能将数据持久化存储下来。
1.环境准备
- docker 19.03
- k8s 1.18.13
- minikube v1.14
- mysql 镜像
2.数据库建表文件
文件名为:create_phone.sql
CREATE DATABASE IF NOT EXISTS `test`;
USE `test`;
DROP TABLE IF EXISTS `phone`;
CREATE TABLE `phone` (
`id` INT(10) NOT NULL AUTO_INCREMENT,
`brand` VARCHAR(50) NOT NULL ,
`name` VARCHAR(50) NOT NULL,
`price` INT(10) NOT NULL,
PRIMARY KEY (`id`) USING BTREE
)ENGINE=InnoDB DEFAULT CHARSET=UTF8MB4;
3. 创建安装脚本
文件名为:install_data.sh
#!/bin/bash
mysql -uroot -p$MYSQL_ROOT_PASSWORD <<EOF
source $WORK_PATH/$FILE_0;
4.创建自定义mysql镜像
创建Dockerfile文件
FROM mysql:latest
MAINTAINER yuanyaosmile@gmail.com
ENV WORK_PATH /usr/yy/test/work
ENV AUTO_RUN_DIR /docker-entrypoint-initdb.d
ENV FILE_0 create_phone.sql
ENV INSTALL_DATA_SHELL install_data.sh
RUN mkdir -p $WORK_PATH
COPY ./$FILE_0 $WORK_PATH
COPY ./$INSTALL_DATA_SHELL $AUTO_RUN_DIR/
RUN chmod a+x $AUTO_RUN_DIR/$INSTALL_DATA_SHELL
创建完成之后使用如下指令打包镜像
docker build -t yy-msql:0.0.8 .
注意最后的点不要落下。
5.创建persitentVolume文件
先要创建一个msql-pv.yaml文件
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-mysql
spec:
accessModes:
- ReadWriteMany
capacity:
storage: 5Gi
claimRef:
name: pvc-mysql
namespace: default
hostPath: # NOTE The mariadb requires the ownership of this directory, hence set the owner to uid:gid as 999:999
path: /home/yayuan/yy-k8s/db/mysql-data/
persistentVolumeReclaimPolicy: Retain
#storageClassName: slow
创建完成后使用如下指令来声明PV
kubectl apply -f mysql-pv.yaml
6.创建pvc
创建声明文件mysql-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-mysql
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
volumeName: pv-mysql
注意:这里的volumeName就是前面声明的pv的名字。
然后也使用如下指令声明好:
kubectl apply -f mysql-pvc.yaml
7.创建deployment与service
文件名就为:deployment-service.yaml
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
type: NodePort
ports:
- port: 3306
nodePort: 30306
targetPort: mysql
selector:
app: mysql
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
spec:
selector:
matchLabels:
app: mysql
strategy:
type: Recreate
template:
metadata:
labels:
app: mysql
spec:
containers:
- image: yy-mysql:0.0.8
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
value: root
- name: MYSQL_USER
value: user
- name: MYSQL_PASSWORD
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
- name: mysql-config
mountPath: /etc/mysql/conf.d/my.cnf
subPath: my.cnf
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: pvc-mysql
- name: mysql-config
configMap:
name: mysql-db-config
items:
- key: my.cnf
path: my.cnf
依旧还是
kubectl apply -f deployment-service.yaml
9.看成果
这个时候应该已经创建完成了,那么来看一下效果
yayuan@host-192-168-0-26:~/yy-k8s/k8s$ kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv-mysql 5Gi RWX Retain Terminating default/pvc-mysql 16h
yayuan@host-192-168-0-26:~/yy-k8s/k8s$ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
pvc-mysql Bound pv-mysql 5Gi RWX standard 16h
yayuan@host-192-168-0-26:~/yy-k8s/k8s$ kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 29d
mysql NodePort 10.103.78.144 <none> 3306:30306/TCP 20h
yayuan@host-192-168-0-26:~/yy-k8s/k8s$ kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
mysql 1/1 1 1 20h
yayuan@host-192-168-0-26:~/yy-k8s/k8s$ kubectl get pod -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
mysql-54ddf6cf-lghfj 1/1 Running 0 56m 172.17.0.7 host-192-168-0-26 <none> <none>
yayuan@host-192-168-0-26:~/yy-k8s/k8s$ kubectl exec -it mysql-54ddf6cf-lghfj bin/bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl kubectl exec [POD] -- [COMMAND] instead.
root@mysql-54ddf6cf-lghfj:/# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 8.0.23 MySQL Community Server - GPL
Copyright (c) 2000, 2021, 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> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test |
+--------------------+
5 rows in set (0.00 sec)
mysql> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| phone |
+----------------+
1 row in set (0.00 sec)
mysql> show create phone;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'phone' at line 1
mysql> show create table phone;
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| phone | CREATE TABLE `phone` (
`id` int NOT NULL AUTO_INCREMENT,
`brand` varchar(50) NOT NULL,
`name` varchar(50) NOT NULL,
`price` int NOT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql>
插入数据后,即时pod生命周期结束,数据依然存储在磁盘上。
10. 总结
这里还缺少一些内容,包括但不限于:
- configMap
- secret
- storageClass
挖坑不断!有人看就来填,没人看就是我自己的笔记,看心情填。
更多推荐
已为社区贡献2条内容
所有评论(0)