文章目录

  • volume挂载分类
  • 配置
  • Secret创建
  • docker-registry 示例
  • generic
  • tls
  • Secret 使用
  • env环境变量引用(secret修改,pod内不生效):
  • volume挂载使用(热更新,也就是外面的secret修改,容器内生效)
  • 挂载secret的所有项目
  • 挂载secret的某一项
  • Configmap 创建
  • Configmap 使用
  • subPath的使用
  • 临时存储
  • Emptydir
  • hostpath
  • 持久存储
  • nfs
  • Persistent Volume
  • PersistentVolumeClaim
  • 动态供应


volume挂载分类

使用 kubectl explain pod.spec.volumes 查看所有挂载方式

k8s nfs 挂载权限 k8s挂载后容器权限拒绝_kubernetes

配置

Secret创建

官方文档 secret命令创建有三种类型:

docker-registry(私有仓库拉镜像的密钥配置),generic(一般配置,base64编码),tls(htts证书配置)

细分类型:

k8s nfs 挂载权限 k8s挂载后容器权限拒绝_docker_02

docker-registry 示例

请查看,使用密钥拉取私有仓库部分

generic

密钥为普通字符串
命令kubectl create secret generic mysecret --from-literal=username=xxxx --from-literal=password=xxxxyaml:

apiVersion: v1
kind: Secret
metadata: 
  name: mysecret
type: Opaque
data:
  username: YMRtaW4=   ## 这里要写base64编码后的
  password: MWYyZDF1MmU2N2Rm  ## 这里要写base64编码后的

密钥为文件:
命令:

kubectl create secret generic db-user-pass \
--from-file=./username.txt \
--from-file=./psw.txt

默认密钥的key是文件名,如果要配置密钥名称,使用–from-fil=[key=]source

kubectl create secret generic db-user-pass \
--from-file=myname=./username.txt \
--from-file=myname2=./psw.txt
tls

代补充

Secret 使用

env环境变量引用(secret修改,pod内不生效):
apiVersion: v1
kind: Pod
metadata:
  name: "pod-secret"
  namespace: default
  labels:
    app: "pod-secret"
spec:
  containers:
  - name: pod-secret
    resources:
      limits:
        cpu: 10m
      requests:
        cpu: 5m
    image: "alpine"
    command: 
    - /bin/sh
    - -c
    - echo "${USER} ${POD_NAME} ${LIMIT}";sleep 36000
    env:
    - name: USER
      valueFrom:
        secretKeyRef:
          name: mysecret
          key: username   # 自动base64解码
    - name: POD_NAME
      valueFrom:
        fieldRef:
          fieldPath: metadata.name    # 取出资源对象的信息
    - name: LIMIT
      valueFrom:
        resourceFieldRef:
          containerName: pod-secret   ## 取出指定的容器的资源值
          resource: limits.cpu
volume挂载使用(热更新,也就是外面的secret修改,容器内生效)

注意:如果使用子路径挂载,无法热更新

挂载secret的所有项目
apiVersion: v1
kind: Pod
metadata:
  name: "pod-volume"
  namespace: default
  labels:
    app: "pod-volume"
spec:
  containers:
  - name: pod-volume
    image: "alpine"
    command: ["bin/sh","-c","sleep 360000"]
    volumeMounts:                  # pod内声明
    - name: vost
      mountPath: /etc/secret
  volumes:                       # pod外声明
    - name: vost
      secret:
        secretName: mysecret

在容器内secret的key成为文件名,value成为文件内容,并且secret改了,容器内也跟着改

在pod内查看:kubectl exec -it pod-volume -- sh

k8s nfs 挂载权限 k8s挂载后容器权限拒绝_kubernetes_03

挂载secret的某一项

在容器外可以改,容器内改不了

apiVersion: v1
kind: Pod
metadata:
  name: "pod-volume2"
  namespace: default
  labels:
    app: "pod-volume2"
spec:
  containers:
  - name: pod-volume2
    image: "alpine"
    volumeMounts:                  # pod内声明
    - name: vost
      mountPath: /etc/secret
    command: ["/bin/sh","-c","sleep 3333333"]
  volumes:                       # pod外声明
    - name: vost
      secret:
        secretName: mysecret 
        items:               # # 指定mysecret下的某一项
        - key: password   # 指定mysecret下的某一个key
          path: psw.md   # 指定新名字

Configmap 创建

使用 kubectl create configmap -h 查看示例
待补充,和secret的Opaque类型一样,只是没有base64编码

Configmap 使用

注意:如果使用子路径挂载,无法热更新
待补充,和secret的Opaque类型一样

subPath的使用

这个作者写的很详细 重要应用示例:挂载主机的configMap配置文件,但是又不想删除容器原有目录下的文件

kind: ConfigMap
apiVersion: v1
metadata:
  name: cm1
  namespace: default
data:
  index.html: "111111111 nginx"
  in.html: "slfjdf"
---
apiVersion: v1
kind: Pod
metadata:
  name: "config-nginx"
  namespace: default
  labels:
    app: "config-nginx"
spec:
  containers:
  - name: config-nginx
    image: "nginx"
    ports:
    - containerPort:  80
      name:  http
    volumeMounts:
    - name: localtime
      mountPath: /etc/localtime
    - name: html
      mountPath: /usr/share/nginx/html/index.html
      subPath: index.html
    - name: html
      mountPath: /usr/share/nginx/html/in.html
      subPath: in.html
  volumes:
    - name: localtime
      hostPath:
        path: /usr/share/zoneinfo/Asia/Shanghai
    - name: html
      configMap: 
        name: cm1

可以看到,原有文件50x.html没有删除,index.html和in.html是外部挂载的

k8s nfs 挂载权限 k8s挂载后容器权限拒绝_kubernetes_04

临时存储

Emptydir

代补充

hostpath

apiVersion: v1
kind: Pod
metadata:
  name: "hostpath"
  namespace: default
  labels:
    app: "hostpath"
spec:
  containers:
  - name: hostpath
    image: "alpine"
    volumeMounts:
    - name: localtime
      mountPath: /etc/localtime
  volumes:
    - name: localtime
      hostPath:
        path: /usr/share/zoneinfo/Asia/Shanghai

持久存储

存储策略:

k8s nfs 挂载权限 k8s挂载后容器权限拒绝_k8s nfs 挂载权限_05

nfs

待补充

Persistent Volume

持久化卷供应

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-volume-50m
  labels:
    type: local
spec:
  storageClassName: pv-nfs-storage   # 存储类的名字,pvc的是从存储类申请空间
  capacity:
    storage: 50m
  accessModes:
  - ReadWriteOnce
  nfs:
    server: 10.170.11.8   # nfs的server所在机器的内网地址
    path: /nfs/data/haha   # 存储路径
PersistentVolumeClaim

持久卷申领,一般和pod写在一个文件,做到一起创建,一起销毁

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: myclaim
  namespace: default
  labels:
    app: myclaim
spec:
  storageClassName: pv-nfs-storage   # 存储类名
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 30m  # 申请多大存储
---
apiVersion: v1
kind: Pod
metadata:
  name: "test"
  namespace: default
  labels:
    app: "test"
spec:
  containers:
  - name: sleep
    image: "nginx"
    resources:
    volumeMounts:
    - name: localtime
      mountPath: /etc/localtime
    - name: html
      mountPath: /etc/usr/share/nginx/html
  volumes:
    - name: localtime
      hostPath:
        path: /usr/share/zoneinfo/Asia/Shanghai
    - name: html
      persistentVolumeClaim:
        claimName: myclaim	# PersistentVolumeClaim的name,(申请书名)
  restartPolicy: Always
动态供应

动态供应,不用实现指定pv,避免了资源浪费,由供应商根据pvc(持久卷申请)动态创建pv(持久卷)

此时回收策略RECLAIM POLICY是: Delete ,可以在图示地方修改

k8s nfs 挂载权限 k8s挂载后容器权限拒绝_容器_06

示例:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: auto-pvc
  namespace: default
  labels:
    app: auto-pvc
spec:
  # storageClassName: managed-nfs-storage  # 不用指定,默认就是这个,storageClass 指定了default 类
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 30m