k8s 文件 目录挂载

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

k8s 文件 目录挂载

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

  1. DirectoryOrCreate意思是我们要挂载的路径在宿主机上是个已经存在的目录不存在就创建一个新的目录。
  2. Directory宿主机上必须实现存在目录如果不存在就报错
  3. FileOrCreate表示挂载的是文件如果不存在就挂载一个文件。文件也可以当做存储挂载的
  4. File表示要挂载的文件必须事先存在否则就报错。
  5. Socket表示必须是一个Socket类型的文件。
  6. CharDevice表示是一个字符类型的设备文件。
  7. 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的值如下
在这里插入图片描述

5.未完待续

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: k8s