文章目录
- 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
查看所有挂载方式
配置
Secret创建
官方文档 secret命令创建有三种类型:
docker-registry(私有仓库拉镜像的密钥配置),generic(一般配置,base64编码),tls(htts证书配置)
细分类型:
docker-registry 示例
请查看,使用密钥拉取私有仓库部分
generic
密钥为普通字符串
命令: kubectl create secret generic mysecret --from-literal=username=xxxx --from-literal=password=xxxx
yaml:
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
挂载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是外部挂载的
临时存储
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
持久存储
存储策略:
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 ,可以在图示地方修改
示例:
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