有别于《研发工程师玩转Kubernetes——emptyDir》一文中介绍的emptyDir,hostPath可以在同一个Node的不同Pod间共享卷。
下面的清单文件利用了Pod亲和性,让Pod集中到一个Node上。
apiVersion: apps/v1
kind: Deployment
metadata:name: hostpath-deployment
spec:selector:matchLabels:app: hostpath-containerreplicas: 2template:metadata:labels:app: hostpath-containerspec:affinity:podAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: appoperator: Invalues:- hostpath-containertopologyKey: "kubernetes.io/hostname"containers:- name: hostpath-containerimage: busyboxcommand: ["/bin/sh", "-c" ,"if [ -f /tempdir/lockfile ] && ! { set -C; 2>/dev/null >/tempdir/lockfile; }; then tail -f /tempdir/lockfile; else exec 3>/tempdir/lockfile; if [ -n \"$POD_NAME\" ]; then name=$POD_NAME; else name=\"unknown\"; fi; while true; do echo \"this is $name.$name write something to lockfile\"; echo \"$name write something to lockfile\" >&3; sleep 5; done; fi"]volumeMounts:- name: hostpath-volumemountPath: /tempdirenv:- name: POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.namevolumes:- name: hostpath-volumehostPath:path: /tmptype: Directory
我们观察创建的两个Pod中文件的内容
kubectl exec pods/hostpath-deployment-65cddc7df8-9qtlv -it -- tail -f /tempdir/lockfile
hostpath-deployment-65cddc7df8-9qtlv write something to lockfile
hostpath-deployment-65cddc7df8-9qtlv write something to lockfile
hostpath-deployment-65cddc7df8-9qtlv write something to lockfile
……
kubectl exec pods/hostpath-deployment-65cddc7df8-ltbgs -it -- tail -f /tempdir/lockfile
hostpath-deployment-65cddc7df8-9qtlv write something to lockfile
hostpath-deployment-65cddc7df8-9qtlv write something to lockfile
hostpath-deployment-65cddc7df8-9qtlv write something to lockfile
……
可以看到它们的文件内容一样,即可以证明它们可以共享同一个文件。
我们在hostpath映射的宿主机目录/tmp下可以找到lockfile文件,且其内容也是明文可读的。
参考资料
- https://kubernetes.io/zh-cn/docs/concepts/storage/volumes/#hostPath