k8s 文件 目录挂载
- 1.环境说明
- 2.HostPath 挂载至宿主机
- 3.挂载至nfs
- 3.1 第一种
- 3.2 第二种
- 3.3 volumeClaimTemplates 挂载模板
- 4.emptyDir-临时数据卷
- 5.未完待续
1.环境说明
k8s 1.24.3
2.HostPath 挂载至宿主机
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
-image: k8s.gcr.io/test-webserver
name: test-container
volumeMounts:
- mountPath: /test-pd
name: test-volume
volumes:
- name: test-volume
hostPath:
# directory location on host
path: /data
# this field is optional
type: Directory
path: 配置宿主机目录
type:
- DirectoryOrCreate:意思是我们要挂载的路径在宿主机上是个已经存在的目录,不存在就创建一个新的目录。
- Directory:宿主机上必须实现存在目录,如果不存在就报错
- FileOrCreate:表示挂载的是文件,如果不存在就挂载一个文件。文件也可以当做存储挂载的
- File:表示要挂载的文件必须事先存在,否则就报错。
- Socket:表示必须是一个Socket类型的文件。
- CharDevice:表示是一个字符类型的设备文件。
- BlockDevice:表示的是一个块类型的设备文件。
3.挂载至nfs
3.1 第一种
以下是挂载日志文件的例子
apiVersion: apps/v1
kind: Deployment
metadata:
name: {APP_NAME}-deployment
labels:
app: {APP_NAME}
namespace: sr
spec:
replicas: 2
revisionHistoryLimit: 3
selector:
matchLabels:
app: {APP_NAME}
template:
metadata:
labels:
app: {APP_NAME}
spec:
hostNetwork: false
containers:
- name: {APP_NAME}
image: {IMAGE_URL}/{IMAGE_PROGECT}/{APP_NAME}:{IMAGE_TAG}
imagePullPolicy: Always
resources:
limits:
cpu: '4'
memory: 5Gi
requests:
cpu: 100m
memory: 100Mi
ports:
- containerPort: {APP_PORT}
env:
- name: SPRING_PROFILES_ACTIVE
value: {SPRING_PROFILE}
volumeMounts:
- mountPath: /sx/logs/sx-gateway
name: log-volume
imagePullSecrets:
- name: harbor-key
volumes:
- name: log-volume
nfs:
server: 10.10.xx.xx #nfs服务主机IP或主机名
path: /nfs/data/sr/gatewaylog #挂载的目录
readOnly: false
注意:当有多个pod 副本时,日志文件的命名要用到pod相关的变量,如 hostname,这样共享nfs文件夹时就不会共同写入同一文件了。如下:
<!-- 系统日志输出 -->
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/info-${HOSTNAME}.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/info-${HOSTNAME}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
<maxFileSize>10MB</maxFileSize>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 -->
<level>INFO</level>
<!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
3.2 第二种
定义pv pvc
cat nfs-pv-pvc.yaml
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-malico # pv 名字
namespace: sharenfs
labels:
app: nfs-malico # 定义 labels ap: nfs-malico
spec:
capacity:
storage: 20Gi # 定义容量
accessModes:
- ReadWriteMany # 访问模式RWX
persistentVolumeReclaimPolicy: Retain # 回收策略 保留数据,需要管理员手工清理数据
storageClassName: nfs # 定义 storageClassName 只有相同名字的才能绑定在一起
nfs:
path: /data/sharedir/ngpvc
server: 10.4.11.11
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: nfs-malico # pvc 名字
namespace: sharenfs
spec:
storageClassName: nfs # Name of Storage Class Name, use same class name defined in pv
accessModes:
- ReadWriteMany
resources:
requests:
storage: 20Gi # amout of Storage request
selector:
matchLabels:
app: nfs-malico # 指定 pv 的标签 nfs-malico
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-pvc
namespace: sharenfs
spec:
replicas: 1
selector:
matchLabels:
app: nginx-pvc
template:
metadata:
labels:
app: nginx-pvc
spec:
containers:
- name: nginx
image: nginx:1.20
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
name: web
volumeMounts:
- name: nfs-malico
mountPath: /usr/share/nginx/html
volumes:
- name: nfs-malico
persistentVolumeClaim:
claimName: nfs-malico
3.3 volumeClaimTemplates 挂载模板
在实际工作中,使用 StorageClass 更多的是 StatefulSet 类型的服务,StatefulSet类型的服务我们也可以通过一个volumeClaimTemplates属性来直接使用 StorageClass,如下:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
selector:
matchLabels:
app: nginx
serviceName: "nginx"
replicas: 2
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
name: web
volumeMounts:
- name: disk-ssd
mountPath: /data
volumeClaimTemplates:
- metadata:
name: disk-ssd
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "course-nfs-storage"
resources:
requests:
storage: 20Gi
这样会动态生成两个挂载目录,而且pod被重新创建也会挂载到同一目录上
4.emptyDir-临时数据卷
emptyDir卷:是一个临时存储卷,与Pod生命周期绑定一起,如果Pod删除了卷也会被删除。
应用场景:Pod中容器之间数据共享
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: write
image: centos
command: ["bash","-c","for i in {1..100};do echo $i >> /data/hello;sleep 1;done"]
volumeMounts:
- name: data
mountPath: /data
- name: read
image: centos
command: ["bash","-c","tail -f /data/hello"]
volumeMounts:
- name: data
mountPath: /data
volumes:
- name: data
emptyDir: {}
查看容器read的值,如下: