K8S实战 之 数据库部署

本文以MySQL部署为例

目录

PV

什么是持久卷(PV)?

  • 持久卷(Persistent Volume)是集群中的一块存储

为什么需要持久卷(PV)?

  • 当Pod不再存在时 K8S会销毁临时卷 但不会销毁持久卷
1
vim pv.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv
labels:
type: local
spec:
storageClassName: manual
capacity:
storage: 20Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/mnt/data"
1
2
3
kubectl apply -f pv.yml

kubectl get pv
1
2
NAME       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
mysql-pv 20Gi RWO Retain Available manual 30s

PVC

什么是持久卷申领(PVC)?

  • 持久卷申领(Persistent Volume Claim)表达的是用户对存储的请求
1
vim pvc.yml
1
2
3
4
5
6
7
8
9
10
11
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pvc
spec:
storageClassName: manual
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
1
2
3
kubectl apply -f pvc.yml

kubectl get pvc
1
2
NAME        STATUS   VOLUME     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
mysql-pvc Bound mysql-pv 20Gi RWO manual 11s

Secret

1
2
3
kubectl create secret generic mysql-secrets --from-literal=ROOT_PASSWORD=123456

kubectl get secret mysql-secrets -o yaml
1
2
3
4
5
6
7
8
9
10
11
12
apiVersion: v1
data:
ROOT_PASSWORD: MTIzNDU2
kind: Secret
metadata:
creationTimestamp: "2021-09-24T03:41:55Z"
name: mysql-secrets
namespace: default
resourceVersion: "106265"
selfLink: /api/v1/namespaces/default/secrets/mysql-secrets
uid: f2202426-45a9-4671-8181-61406d2b224e
type: Opaque

Deployment

1
vim deploy.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
spec:
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- image: mysql:5.7
name: mysql
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secrets
key: ROOT_PASSWORD
volumes:
- name: mysql-data
persistentVolumeClaim:
claimName: mysql-pvc
1
2
3
kubectl apply -f deploy.yml

kubectl get pods
1
2
NAME                    READY   STATUS    RESTARTS   AGE
mysql-78b5646c6-t6wgq 1/1 Running 0 115s

Service

1
vim service.yml
1
2
3
4
5
6
7
8
9
10
11
12
apiVersion: v1
kind: Service
metadata:
name: mysql-service
spec:
type: NodePort
selector:
app: mysql
ports:
- protocol: TCP
port: 3306
targetPort: 3306
1
2
3
kubectl apply -f service.yml

kubectl get svc mysql-service
1
2
NAME            TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
mysql-service NodePort 10.100.130.112 <none> 3306:30653/TCP 165m
  • 使用
1
kubectl run -it --rm --image=mysql:5.7 --restart=Never mysql-client -- mysql -h 10.100.130.112 -p123456
1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE DATABASE IF NOT EXISTS test_db DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

USE test_db;

CREATE TABLE IF NOT EXISTS `test_tb`(
`id` INT UNSIGNED AUTO_INCREMENT,
`data` VARCHAR(100) NOT NULL,
PRIMARY KEY ( `id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO test_tb ( data ) VALUES ('hello world');

SELECT * FROM test_tb;
1
2
3
4
5
6
+----+-------------+
| id | data |
+----+-------------+
| 1 | hello world |
+----+-------------+
1 row in set (0.00 sec)

清理

1
2
3
4
5
6
7
8
9
kubectl delete -f service.yml

kubectl delete -f deploy.yml

kubectl delete secret mysql-secrets

kubectl delete -f pvc.yml

kubectl delete -f pv.yml

参考