摘要
Pod的器皿若宕机,数据信息将随之丢失。储存卷为Pod提供数据存储,emptyDir、hostPath、NFS、云储存等多种选择。Kubernetes集群的储存难题,储存卷解决。
正文
大量k8s內容,请关心威信和权威公众好:新猿技术性生态链
一、数据信息分布式锁
Pod是由器皿构成的,而器皿服务器宕机或终止以后,数据信息就随着丢失,那麼这也就代表着我们在做Kubernetes集群的情况下就迫不得已考虑到储存的难题,而储存卷便是为了更好地Pod储存数据信息为之的。储存卷的种类有很多,
# 一般有四种:emptyDir,hostPath,NFS及其云储存(ceph, glasterfs...)等。
1、emptyDir(不可以用于做数据分布式锁)
# emptyDir:是pod调度至连接点处时建立的一个空目录,当pod被删掉时,emptydir中数据也随着删掉,emptydir常见于器皿间共享文档,或是用以建立临时性文件目录。
#案例
# 1、撰写配备明细
[root@k8s-m-01 k8s]# vim emptydir.yaml
kind: Deployment
apiVersion: apps/v1
metadata:
name: emptydir
spec:
selector:
matchLabels:
app: emptydir
template:
metadata:
labels:
app: emptydir
spec:
containers:
- name: Nginx
image: nginx
volumeMounts:
- mountPath: /data/ #nginx初始化文件目录
name: emptydir-name
- name: php
image: registry.cn-shanghai.aliyuncs.com/aliyun_mm/Discuz:php-v1
volumeMounts:
- mountPath: /opt/ # php初始化文件目录
name: emptydir-name
volumes:
- name: emptydir-name
emptyDir: {}
# 2、查看pod
[root@k8s-m-01 k8s]# kubectl get pod
NAME READY STATUS RESTARTS AGE
emptydir-6ffc884879-rqlnw 2/2 Running 0 3m52s
# 认证器皿间的数据信息共享
# 3、进到nginx器皿初始化的文件目录,创建文件
[root@k8s-m-01 k8s]# kubectl exec -it emptydir-6ffc884879-rqlnw -c nginx -- bash
root@emptydir-6ffc884879-rqlnw:/# df
/dev/mapper/centos-root 103754244 5333064 98421180 6% /data
root@emptydir-6ffc884879-rqlnw:/# cd /data/
root@emptydir-6ffc884879-rqlnw:/data# ls
root@emptydir-6ffc884879-rqlnw:/data# echo 111 > 1.tt
root@emptydir-6ffc884879-rqlnw:/data# ls
1.tt
# 4、进到php初始化的文件目录查询是不是也是有建立的文档
[root@k8s-m-01 k8s]# kubectl exec -it emptydir-6ffc884879-rqlnw -c php -- bash
[root@emptydir-6ffc884879-rqlnw html]# df
/dev/mapper/centos-root 103754244 5333092 98421152 6% /opt
[root@emptydir-6ffc884879-rqlnw html]# cd /opt/
[root@emptydir-6ffc884879-rqlnw opt]# ls
1.tt
[root@emptydir-6ffc884879-rqlnw opt]# cat 1.tt
111
2、hostpath
hostPath种类则是投射node系统文件中的文档或是文件目录到pod里。在应用hostPath种类的储存卷时,还可以设定type字段名,适用的种类有文档、文件目录、File、Socket、CharDevice和BlockDevice。
# hostPath类似docker -v主要参数,将寄主服务器中的文档初始化pod中,可是hostPath比docker -v主要参数更强劲,(Pod调度至哪一个连接点,则立即初始化到当今连接点上)
#案例
# 1、撰写配备明细
[root@k8s-m-01 k8s]# vim hostpath.yaml
kind: Deployment
apiVersion: apps/v1
metadata:
name: hostpath
spec:
selector:
matchLabels:
app: hostpath
template:
metadata:
labels:
app: hostpath
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- mountPath: /opt/ # 当地务必存有的文件目录
name: hostpath-name
volumes:
- name: hostpath-name
hostPath:
path: /opt/hostpath # 任意在node连接点建立
type: DirectoryOrCreate # 种类:沒有就建立,有也不建立
# 2、查看pod
[root@k8s-m-01 k8s]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
hostpath-54859ffd84-cqssj 1/1 Running 0 3m40s 10.244.1.25 k8s-n-01 <none> <none>
# 3、进到器皿建立(在node连接点/opt/文件目录建立一样)
root@k8s-m-01 opt]# kubectl exec -it hostpath-54859ffd84-cqssj -- bash
root@hostpath-54859ffd84-cqssj:/# df
/dev/mapper/centos-root 103754244 5333132 98421112 6% /opt
root@hostpath-54859ffd84-cqssj:/opt# ls
root@hostpath-54859ffd84-cqssj:/opt# echo 111 > 1.tt
root@hostpath-54859ffd84-cqssj:/opt# ls
1.tt
# 4、node连接点查询
[root@k8s-n-01 ~]# cd /opt/
[root@k8s-n-01 opt]# ll
drwxr-xr-x 2 root root 18 Aug 9 15:24 hostpath # 默认设置管理权限755
[root@k8s-n-01 opt]# cd hostpath/
[root@k8s-n-01 hostpath]# ll
total 4
-rw-r--r-- 1 root root 4 Aug 9 15:24 1.tt
[root@k8s-n-01 hostpath]# cat 1.tt
111
1、hostpath 的type的类型
3、NFS
nfs促使我们可以初始化早已存有的共享资源搭到大家的pod中
和emptydir不一样的是,当pod被删掉时,emptydir也会被删掉。
nfs不容易被删掉,只是是消除挂在情况罢了,这就代表着NFS可以容许大家提早对数据信息开展解决,并且这种数据信息能够在pod中间相互之间传送,而且nfs能够与此同时被好几个pod初始化并开展读写能力。
# 1、布署NFS(全部连接点)
[root@k8s-m-01 k8s]# yum install nfs-utils.x86_64 -y
# 2、配备
[root@k8s-m-01nfs]# mkdir -p /nfs/v{1..10}
[root@k8s-m-01nfs]# cat > /etc/exports <<EOF
/nfs/v1 192.168.15.0/16(rw,sync,all_squash)
/nfs/v2 192.168.15.0/16(rw,sync,all_squash)
/nfs/v3 192.168.15.0/16(rw,sync,all_squash)
/nfs/v4 192.168.15.0/16(rw,sync,all_squash)
/nfs/v5 192.168.15.0/16(rw,sync,all_squash)
EOF
# 3、查询結果
[root@k8s-m-01 k8s]# exportfs -arv
exporting192.168.15.0/16:/nfs/v5
exporting192.168.15.0/16:/nfs/v4
exporting192.168.15.0/16:/nfs/v3
exporting192.168.15.0/16:/nfs/v2
exporting192.168.15.0/16:/nfs/v1
[root@k8s-m-01 k8s]# showmount -e
Export list for k8s-m-01:
/nfs/v5 192.168.15.0/24
/nfs/v4 192.168.15.0/24
/nfs/v3 192.168.15.0/24
/nfs/v2 192.168.15.0/24
/nfs/v1 192.168.15.0/24
# 4、运行nfs(全部连接点)
[root@k8s-m-01 k8s]# systemctl enable --now nfs
# 5、检测k8s应用nfs
apiVersion: apps/v1
kind: Deployment
metadata:
name: nfs
spec:
selector:
matchLabels:
app: nfs
template:
metadata:
labels:
app: nfs
spec:
nodeName: gdx3
containers:
- name: mysql
image: mysql:5.7
env:
- name: MYSQL_ROOT_PASSWORD
value: "123456"
volumeMounts:
- mountPath: /var/lib/mysql
name: nfs
volumes:
- name: nfs
nfs:
path: /nfs/v1
server: 192.168.15.111
# 6、认证nfs挂载
#进到到nfs数据库查询
[root@k8s-m-01 k8s]# kubectl get pods
NAME READY STATUS RESTARTS AGE
emptydir-5dc7dcd9fd-zrb99 2/2 Running 0 9h
nfs-85dff7bb6b-8pgrp 1/1 Running 0 60m
statefulset-test-0 1/1 Running 0 27h
test-6799fc88d8-t6jn6 1/1 Running 0 142m
test-tag 1/1 Running 0 3d15h
WordPress-test-0 2/2 Running 0 26h
[root@k8s-master1 v1]# kubectl exec -it nfs-85dff7bb6b-8pgrp -- bash
root@nfs-85dff7bb6b-8pgrp:/# mysql -u root -p123456
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.33 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> create database discuz; #建立一个数据库查询
Query OK, 1 row affected (0.01 sec)
mysql> show databases;
--------------------
| Database |
--------------------
| information_schema |
| discuz |
| mysql |
| performance_schema |
| sys |
--------------------
5 rows in set (0.00 sec)
#到宿主机的初始化文件目录下查询
[root@k8s-m-01 k8s]# cd /nfs/v1
[root@k8s-master1 v1]# ll
总使用量 188484
-rw-r----- 1 polkitd ssh_keys 56 4月 4 19:06 auto.cnf
-rw------- 1 polkitd ssh_keys 1680 4月 4 19:06 ca-key.pem
-rw-r--r-- 1 polkitd ssh_keys 1112 4月 4 19:06 ca.pem
-rw-r--r-- 1 polkitd ssh_keys 1112 4月 4 19:06 client-cert.pem
-rw------- 1 polkitd ssh_keys 1680 4月 4 19:06 client-key.pem
drwxr-x--- 2 polkitd ssh_keys 20 4月 4 21:07 discuz #数据库查询文件目录早已存有
-rw-r----- 1 polkitd ssh_keys 692 4月 4 20:04 ib_buffer_pool
-rw-r----- 1 polkitd ssh_keys 79691776 4月 4 20:04 ibdata1
-rw-r----- 1 polkitd ssh_keys 50331648 4月 4 20:04 ib_logfile0
-rw-r----- 1 polkitd ssh_keys 50331648 4月 4 19:06 ib_logfile1
-rw-r----- 1 polkitd ssh_keys 12582912 4月 4 20:05 ibtmp1
drwxr-x--- 2 polkitd ssh_keys 4096 4月 4 19:06 mysql
drwxr-x--- 2 polkitd ssh_keys 8192 4月 4 19:06 performance_schema
-rw------- 1 polkitd ssh_keys 1680 4月 4 19:06 private_key.pem
-rw-r--r-- 1 polkitd ssh_keys 452 4月 4 19:06 public_key.pem
-rw-r--r-- 1 polkitd ssh_keys 1112 4月 4 19:06 server-cert.pem
-rw------- 1 polkitd ssh_keys 1680 4月 4 19:06 server-key.pem
drwxr-x--- 2 polkitd ssh_keys 8192 4月 4 19:06 sys
# 7、检测删掉pod
[root@k8s-master1 discuz]# kubectl delete pods nfs-85dff7bb6b-8pgrp
pod "nfs-85dff7bb6b-8pgrp" deleted
#在回宿主机初始化文件目录查询discuz数据库查询文件目录依然是存有的
4.PV/PVC
# 1、PersistentVolume(PV)是群集中已由管理人员配备的一段网络存储。
群集中的資源如同一个连接点是一个群集資源。 PV是例如卷这类的卷软件,可是具备单独于应用PV的一切单独pod的生命期。 该API目标捕捉储存的完成关键点,即NFS,iSCSI或云服务提供商特殊的分布式存储 。
# 2、PersistentVolumeClaim(PVC)是客户储存的要求。
PVC的应用逻辑性:在pod中界定一个储存卷(该储存卷种类为PVC),界定的情况下立即特定尺寸,pvc务必与相匹配的pv创建关联,pvc会依据界定去pv申请办理,而pv是由储存空间建立出去的。pv和pvc是kubernetes抽象性出去的一种服务器资源。
1)PV 的浏览方式(accessModes)
方式 | 表述 |
---|---|
ReadWriteOnce(RWO) | 可写应写,但只适用被单独连接点初始化。 |
ReadOnlyMany(ROX) | 写保护,能够被好几个连接点初始化。 |
ReadWriteMany(RWX) | 多通道可写应写。这类储存能够以读写能力的方法被好几个连接点共享资源。并不是每一种储存都适用这三种方法,像共享资源方法,现阶段适用的还较为少,较为常见的是 NFS。在 PVC 关联 PV 时一般依据2个标准来关联,一个是储存的尺寸,另一个便是浏览方式。 |
2)PV的回收利用对策(persistentVolumeReclaimPolicy)
对策 | 表述 |
---|---|
Retain | 不清除, 保存 Volume(必须 手动式清除) |
Recycle | 删掉数据信息,即 rm -rf /thevolume/*(仅有 NFS 和 HostPath 适用) |
Delete | 删掉服务器资源,例如删掉 AWS EBS 卷(仅有 AWS EBS, GCE PD, Azure Disk 和 Cinder 适用) |
3)PV的情况
情况 | 表述 |
---|---|
Available | 可以用 |
Bound | 早已分派给 PVC。 |
Released | PVC 解绑但还未实行回收利用对策。 |
Failed | 产生不正确 |
# 1、建立pv (PV群集级資源)
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv1
spec:
nfs:
path: /nfs/v2
server: 172.16.1.11
capacity:
storage: 20Gi
persistentVolumeReclaimPolicy: Retain #特定pv的回收利用对策:不清除保存volume
accessModes: #特定pv的浏览方式
- "ReadWriteOnce" #可写应写,但只适用单独连接点初始化
- "ReadWriteMany" #多通道可写应写
# 2、查看pv
[root@k8s-m-01 k8s]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv1 20Gi RWO,RWX Retain Available 53s
4)PVC特定应用的PV (PVC名字室内空间级資源)
# 1、建立PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc1
spec:
accessModes:
- "ReadWriteMany" #此內容要在pv的浏览方式中包括
resources:
requests:
storage: "6Gi" #此值能包括在pv的尺寸内
# 2、再查看pv
[root@k8s-m-01 k8s]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv1 20Gi RWO,RWX Retain Bound default/pvc1 29m
#注:这时pv已经是关联pv1的情况
# 3、查看pvc
[root@k8s-m-01 k8s]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
pvc1 Bound pv1 20Gi RWO,RWX 2m42s
二、布署discuz(应用pv/pvc管理方法nfs)
# 1、全部设备安裝nfs
# 2、撰写nfs环境变量并运行
# 3、提交编码包
# 4、撰写mysql的yaml文档
# 5、撰写discuz的yaml文档
# 6、转化成yaml文档并查看更多
# 7、Ip浏览
# 8、常见故障清查
1、全部设备安裝nfs
[root@k8s-m-01 k8s]# yum -y install nfs-utils
2、撰写nfs环境变量并运行
# 1、建立文件目录
[root@k8s-m-01 k8s]# mkdir -p /nfs/v{1..10}
# 2、撰写nfs文件
[root@k8s-m-01 k8s]# vim /etc/exports
/nfs/v1 192.168.15.0/24(rw,sync,all_squash)
/nfs/v2 192.168.15.0/24(rw,sync,all_squash)
/nfs/v3 192.168.15.0/24(rw,sync,all_squash)
/nfs/v4 192.168.15.0/24(rw,sync,all_squash)
/nfs/v5 192.168.15.0/24(rw,sync,all_squash)
# 3、运行nfs
[root@k8s-m-01 k8s]# systemctl enable --now nfs
3、提交编码包
# 1、提交编码包
[root@k8s-m-01 k8s]# wget http://www.mmin.xyz:81/package/blog/Discuz_X3.4_SC_UTF8_20210320.zip
# 2、缓解压力
[root@k8s-m-01 k8s]# unzip Discuz_X3.4_SC_UTF8_20210320.zip
# 3、更名
[root@k8s-m-01 k8s]# mv upload/ discuz
# 4、挪动到初始化文件目录
[root@k8s-m-01 k8s]# mv discuz/* /nfs/v2
[root@k8s-m-01 k8s]# rm -rf discuz
# 5、受权
[root@k8s-m-01 v2]# chmod 777 -R ./
# 6、查询文档
[root@k8s-m-01 v2]# ll
total 68
-rwxrwxrwx 1 root root 2834 Mar 22 19:44 admin.php
drwxrwxrwx 9 root root 135 Mar 22 19:44 api
-rwxrwxrwx 1 root root 727 Mar 22 19:44 api.php
drwxrwxrwx 2 root root 23 Mar 22 19:44 archiver
drwxrwxrwx 2 root root 141 Aug 9 21:28 config
-rwxrwxrwx 1 root root 1040 Mar 22 19:44 connect.php
-rwxrwxrwx 1 root root 106 Mar 22 19:44 crossdomain.xml
drwxrwxrwx 15 root root 285 Aug 9 21:28 data
-rwxrwxrwx 1 root root 5558 Mar 20 10:36 favicon.ico
-rwxrwxrwx 1 root root 2245 Mar 22 19:44 forum.php
-rwxrwxrwx 1 root root 821 Mar 22 19:44 group.php
-rwxrwxrwx 1 root root 1280 Mar 22 19:44 home.php
-rwxrwxrwx 1 root root 6472 Mar 22 19:44 index.php
drwxrwxrwx 5 root root 64 Mar 22 19:44 install
drwxrwxrwx 2 root root 23 Mar 22 19:44 m
-rwxrwxrwx 1 root root 1025 Mar 22 19:44 member.php
-rwxrwxrwx 1 root root 2371 Mar 22 19:44 misc.php
-rwxrwxrwx 1 root root 1788 Mar 22 19:44 plugin.php
-rwxrwxrwx 1 root root 977 Mar 22 19:44 portal.php
-rwxrwxrwx 1 root root 582 Mar 22 19:44 robots.txt
-rwxrwxrwx 1 root root 1155 Mar 22 19:44 search.php
drwxrwxrwx 10 root root 168 Mar 22 19:44 source
drwxrwxrwx 7 root root 86 Mar 22 19:44 static
drwxrwxrwx 3 root root 38 Mar 22 19:44 template
drwxrwxrwx 7 root root 106 Mar 22 19:44 uc_client
drwxrwxrwx 13 root root 241 Mar 22 19:44 uc_server
4、撰写mysql的yaml文档
[root@k8s-m-01 ~]# vim mysql.yaml
kind: Namespace
apiVersion: v1
metadata:
name: mysql
---
kind: Deployment
apiVersion: apps/v1
metadata:
name: mysql
namespace: mysql
spec:
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:5.7
env:
- name: MYSQL_ROOT_PASSWORD
value: "123"
- name: MYSQL_DATABASE
value: discuz
livenessProbe:
exec:
command:
- "/bin/sh"
- "-c"
- "cat /etc/mysql/my.cnf"
initialDelaySeconds: 0
periodSeconds: 3
timeoutSeconds: 1
successThreshold: 1
failureThreshold: 3
readinessProbe:
tcpSocket:
port: 3306
initialDelaySeconds: 30
periodSeconds: 1
timeoutSeconds: 1
successThreshold: 3
failureThreshold: 1
---
kind: Service
apiVersion: v1
metadata:
name: mysql
namespace: mysql
spec:
ports:
- port: 3306
targetPort: 3306
protocol: TCP
name: mysql
selector:
app: mysql
5、撰写discuz的yaml文档
[root@k8s-m-01 ~]# vim discuz.yaml
kind: Namespace
apiVersion: v1
metadata:
name: web
---
kind: PersistentVolume
apiVersion: v1
metadata:
name: discuz
labels:
app: discuz
spec:
nfs:
path: /nfs/v2/
server: 192.168.15.111
accessModes:
- "ReadWriteMany"
capacity:
storage: '10Gi'
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: discuz
namespace: web
spec:
accessModes:
- "ReadWriteMany"
resources:
requests:
storage: '5Gi'
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: discuz
namespace: web
spec:
replicas: 1
selector:
matchLabels:
app: discuz
template:
metadata:
labels:
app: discuz
spec:
containers:
- name: php
image: registry.cn-hangzhou.aliyuncs.com/k8sos/web:discuz-php-v1
imagePullPolicy: Always
volumeMounts:
- mountPath: /usr/share/nginx/html/
name: discuz
livenessProbe:
exec:
command:
- "/bin/sh"
- "-c"
- "cat /etc/php-fpm.d/www.conf"
initialDelaySeconds: 0
periodSeconds: 3
timeoutSeconds: 1
successThreshold: 1
failureThreshold: 3
readinessProbe:
tcpSocket:
port: 9000
initialDelaySeconds: 10
periodSeconds: 1
timeoutSeconds: 1
successThreshold: 3
failureThreshold: 1
- name: nginx
image: registry.cn-hangzhou.aliyuncs.com/k8sos/web:discuz-v1
imagePullPolicy: Always
volumeMounts:
- mountPath: /usr/share/nginx/html/
name: discuz
livenessProbe:
exec:
command:
- "/bin/sh"
- "-c"
- "cat /etc/nginx/nginx.conf"
initialDelaySeconds: 0
periodSeconds: 3
timeoutSeconds: 1
successThreshold: 1
failureThreshold: 3
readinessProbe:
tcpSocket:
port: 80
initialDelaySeconds: 30
periodSeconds: 1
timeoutSeconds: 1
successThreshold: 3
failureThreshold: 1
volumes:
- name: discuz
persistentVolumeClaim:
claimName: discuz
---
kind: Service
apiVersion: v1
metadata:
name: discuz
namespace: web
spec:
ports:
- port: 80
targetPort: 80
protocol: TCP
name: http
selector:
app: discuz
type: NodePort
6、转化成yaml文档并查看更多
# 1、转化成yaml文档
[root@k8s-m-01 ~]# kubectl apply -f mysql.yaml
[root@k8s-m-01 ~]# kubectl apply -f discuz.yaml
# 2、查询详请
[root@k8s-m-01 ~]# kubectl get pod -n web
NAME READY STATUS RESTARTS AGE
discuz-fb75c6498-mvjgv 2/2 Running 0 53s
[root@k8s-m-01 ~]# kubectl get pod -n mysql
NAME READY STATUS RESTARTS AGE
mysql-6f9b947c9f-hmdvh 1/1 Running 0 64s
7、Ip浏览
# 1、查看svc
[root@k8s-m-01 ~]# kubectl get svc -n web discuz
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
discuz NodePort 10.106.220.40 <none> 80:31706/TCP 69s
# 2、IP浏览
192.168.15.111:31706
8、常见故障清查
# 1、处理BUG
# 2、仅仅由于服务器端沒有安裝nfs
[root@k8s-m-01 k8s]# yum -y install nfs-utils
# 1、没法页面访问
# 2、处理
[root@k8s-m-01 ~]# vim discuz.yaml |grep v2
path: /nfs/v2/ # 在初始化文件目录中写相对路径 /nfs/v2/
# 也有一种可能是编码包的难题
# 1、无法连接到数据信息款
# 2、处理
也有一种可能是编码包的难题,重新上传一个包就可以
大量k8s內容,请关心威信和权威公众好:新猿技术性生态链
大量k8s內容,请关心威信和权威公众好:新猿技术性生态链
大量k8s內容,请关心威信和权威公众好:新猿技术性生态链
关注不迷路
扫码下方二维码,关注宇凡盒子公众号,免费获取最新技术内幕!
温馨提示:如果您访问和下载本站资源,表示您已同意只将下载文件用于研究、学习而非其他用途。
评论0