起因

之前部署的云笔记系统的存储卷太小了,当用户数量增加的时候,笔记及用户信息会增大,这有可能会引起内存爆掉的情况。存储用户信息的 mysql和存储笔记信息的 mongodb在部署的时候我都设置了 1G的存储卷,这是远远不够的,因此需对其进行扩容。

根据老师要求,需将内存从 1G扩展到 50G,这是针对存笔记系统的 mongodb,为了更加稳妥,跟学弟协商后决定将存用户数据的 mysql也扩充到 10G

大体思路:

  1. 确定 mongodbmysqlpod所在的 node节点。
  2. 备份数据
  3. 删除旧的 pod
  4. 分别修改 mongodbmysqlpvpvc50Gi10Gi
  5. 指定 mongodbmysqlpvpvcmongodbmysql部署的亲和性,让其部署在指定 node节点,便于扩容。
  6. 重新部署相应 pod
  7. 扩容指定的 mongodbmysql部署的节点的虚拟机。

注:本笔记图片里的 deployment的编号等信息可能会不一样,因为自己操作的时候可能会删了pod在重建导致其编号及时间等不一样,图片仅用于描述过程及结果。

1. 确定pod所在的node节点

首先远程连接 131服务器。

云笔记系统有 6pod,在 note空间里,如下所示:

1
kubectl get pod -n note

pod

需确定 mongodbmysql所在的 node节点,命令如下:

1
kubectl get pod -n note -o wide

pod-node

由上图可知, mongodbmysqlpod分别被部署到了 k8s-node6k8s-node7节点。

2. 备份数据

问学长得知, k8s-node6k8s-node7节点位于 122服务器

远程连接 122服务器后,打开 VMWare Workstation Pro,登录 node6节点:

vmware

账号密码为 root 123456,登陆后如下:

login

按下面命令将数据拷贝到 tmp/backup文件夹下进行备份:

backup

node7下的 mysql进行同样操作,不再赘述。

为了保险起见,使用 xShell中的 xftp将备份的文件再备份到桌面一份:

xftp

打开 xshell点击新建文件传输,将 /home下的 mongodb文件夹拖动到桌面。

backup-desktop

node7下的 mysql进行同样操作,不再赘述。

3. 删除旧的pod

删除旧的 pod

1
2
3
4
kubectl delete -f note-mysql-pvc.yaml -n note
kubectl delete -f note-mysql.yaml -n note
kubectl delete -f note-mongodb-pvc.yaml -n note
kubectl delete -f note-mongodb.yaml -n note

delete-pod

此时查看 pod结果:

1
kubectl get pod -n note

pod-after-deleted

mongodbmysqlpod已经被删掉。

4. 修改pv、pvc

将相关的 yaml文件修改为如下内容:

note-mongodb-pvc.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
apiVersion: v1
kind: PersistentVolume
metadata:
name: note-mongodb-pv
spec:
capacity:
storage: 50Gi
accessModes:
- ReadWriteOnce
hostPath:
path: /home/mongodb/data # 主机上的数据存储路径
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: note-mongodb-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 50Gi
storageClassName: ""
volumeName: note-mongodb-pv

note-mysql-pvc.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
apiVersion: v1
kind: PersistentVolume
metadata:
name: note-mysql-pv
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
hostPath:
path: /home/mysql/data # 主机上的数据存储路径
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: note-mysql-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: ""
volumeName: note-mysql-pv

yaml文件里已经将内存修改为目标内存。

5. 指定亲和性

这里的亲和性是 Affinity,指定了这个后会让其部署在指定标签的 node节点上。这样仅需将指定的 node节点的虚拟机扩容即可。

首先需要为 node节点添加标签。如下所示:

1
2
3
4
5
kubectl get nodes --show-labels

# 为节点6和7添加label
kubectl label nodes k8s-node6 notelabel=mongodb
kubectl label nodes k8s-node7 notelabel=mysql

add-labels

指定完标签就可以添加亲和性了,如下:

note-mongodb-pvc.yaml

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
apiVersion: v1
kind: PersistentVolume
metadata:
name: note-mongodb-pv
spec:
capacity:
storage: 50Gi
accessModes:
- ReadWriteOnce
hostPath:
path: /home/mongodb/data # 主机上的数据存储路径
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: notelabel
operator: In
values:
- mongodb
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: note-mongodb-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 50Gi
storageClassName: ""
volumeName: note-mongodb-pv

note-mysql-pvc.yaml

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
apiVersion: v1
kind: PersistentVolume
metadata:
name: note-mysql-pv
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
hostPath:
path: /home/mysql/data # 主机上的数据存储路径
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: notelabel
operator: In
values:
- mysql
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: note-mysql-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: ""
volumeName: note-mysql-pv

note-mongodb.yaml

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
apiVersion: apps/v1
kind: Deployment
metadata:
name: note-mongodb-deployment
spec:
replicas: 1
selector:
matchLabels:
app: note-mongodb-pod
template:
metadata:
labels:
app: note-mongodb-pod
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: notelabel
operator: In
values:
- mongodb
containers:
- name: note-mongodb
image: registry.cn-hangzhou.aliyuncs.com/lucas-njfu/note-mongodb:v1.1.0
imagePullPolicy: IfNotPresent
ports:
- containerPort: 27017
env:
- name: MONGO_INITDB_ROOT_USERNAME
value: admin
- name: MONGO_INITDB_ROOT_PASSWORD
value: 5c8b18289f7848e9b0af98e81562649d
volumeMounts:
- name: note-mongodb-persistent-storage
mountPath: /data/db
volumes:
- name: note-mongodb-persistent-storage
persistentVolumeClaim:
claimName: note-mongodb-pvc
---
apiVersion: v1
kind: Service
metadata:
name: note-mongodb-service
spec:
selector:
app: note-mongodb-pod
type: NodePort # service类型
ports:
- port: 27017
nodePort: 30017 # 指定绑定的node的端口(默认的取值范围是:30000-32767),如果不指定,会默认分配
targetPort: 27017

note-mysql.yaml

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
apiVersion: apps/v1
kind: Deployment
metadata:
name: note-mysql-deployment
spec:
replicas: 1
selector:
matchLabels:
app: note-mysql-pod
template:
metadata:
labels:
app: note-mysql-pod
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: notelabel
operator: In
values:
- mysql
containers:
- name: note-mysql
image: registry.cn-hangzhou.aliyuncs.com/lucas-njfu/note_mysql:v1.1.0
imagePullPolicy: IfNotPresent
env:
- name: MYSQL_ROOT_PASSWORD
value: dfa6f1b032ee42ed95d12647225f2ff4
ports:
- containerPort: 3306
volumeMounts:
- name: note-mysql-persistent-storage
mountPath: /var/lib/mysql
volumes:
- name: note-mysql-persistent-storage
persistentVolumeClaim:
claimName: note-mysql-pvc # 使用之前创建的持久卷声明
---
apiVersion: v1
kind: Service
metadata:
name: note-mysql-service
spec:
selector:
app: note-mysql-pod
type: NodePort # service类型
ports:
- port: 3306
nodePort: 30006 # 指定绑定的node的端口(默认的取值范围是:30000-32767), 如果不指定,会默认分配
targetPort: 3306

这样,亲和性就修改完毕了。

6. 重新部署相应的pod

接下来按 5. 指定亲和性 所修改的 yaml重新进行 pod部署:

1
2
3
4
kubectl create -f note-mysql-pvc.yaml -n note
kubectl create -f note-mysql.yaml -n note
kubectl create -f note-mongodb-pvc.yaml -n note
kubectl create -f note-mongodb.yaml -n note

pod-deploy

查看部署的结果:

1
kubectl get pod -n note -o wide

pod-after-deploy

可以看到已经将 mongodbmysql分别部署到了节点 67上。

7. 扩容节点的虚拟机

远程连接 122服务器后,打开 VMWare Workstation Pro,如下:

vmware

对于 sx-k8s-node6,先双击,然后点击上面的橙色运行按钮右边的下拉倒三角,关机。

shutdown

然后右键 sx-k8s-node6,点设置

setting

点击硬盘后点击右下角扩展

expand

对硬盘容量进行修改。

这里原本是 40G,我增加了 50G后变为了 90G

sx-k8s-node7的操作类似,不再赘述。

此时打开网址,访问成功!扩容成功!

访问

访问(连校园网,关梯子):

http://192.10.84.209:33395/cloudNote/

账号:姓名小写拼音

密码:123456

效果:

6