笔记系列k8s编排MySQL容器-有状态的容器创建过程

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

挖坑不断!有人看就来填,没人看就是我自己的笔记,看心情填。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值