kubernets可以通過(guò)emptyDir實(shí)現(xiàn)在同一Pod的不同容器間共享文件系統(tǒng)。
正如它的名字,當(dāng)Pod被創(chuàng)建時(shí),emptyDir卷會(huì)被創(chuàng)建,這個(gè)時(shí)候它是一個(gè)空的文件夾;當(dāng)Pod被刪除時(shí),emptyDir卷也會(huì)被永久刪除。
同一Pod上不同容器之間共享
# bash
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
pod_name=$POD_NAME
else
pod_name="unknown_pod"
fi
if [ -n "$CONTAINER_NAME" ]; then
container_name=$CONTAINER_NAME
else
container_name="unknown_container"
fi
while true; do
echo "$pod_name $container_name write something to lockfile" >&3
sleep 5
done
fi
我們使用上面這段腳本,會(huì)檢測(cè)/tempdir/lockfile文件是否存在。如果不存在則創(chuàng)建這個(gè)文件,并獲取Pod和Container名稱(chēng),然后每隔5秒鐘在/tempdir/lockfile寫(xiě)入一句話;如果存在,則不停打印新寫(xiě)入這個(gè)文件的內(nèi)容。
然后使用下面的清單文件創(chuàng)建一個(gè)deployment
# emptydir_same_pod.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: emptydir-deployment
spec:
selector:
matchLabels:
app: emptydir-container
replicas: 1
template:
metadata:
labels:
app: emptydir-container
spec:
containers:
- name: emptydir-container1
image: busybox
command: ["/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 pod_name=$POD_NAME; else pod_name=\"unknown_pod\"; fi; if [ -n \"$CONTAINER_NAME\" ]; then container_name=$CONTAINER_NAME; else container_name=\"unknown_container\"; fi; while true; do echo \"$pod_name $container_name write something to lockfile\" >&3; sleep 5; done; fi;"]
volumeMounts:
- name: emptydir-volume
mountPath: /tempdir
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: CONTAINER_NAME
value: emptydir-container1
- name: emptydir-container2
image: busybox
command: ["/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 pod_name=$POD_NAME; else pod_name=\"unknown_pod\"; fi; if [ -n \"$CONTAINER_NAME\" ]; then container_name=$CONTAINER_NAME; else container_name=\"unknown_container\"; fi; while true; do echo \"$pod_name $container_name write something to lockfile\" >&3; sleep 5; done; fi;"]
volumeMounts:
- name: emptydir-volume
mountPath: /tempdir
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: CONTAINER_NAME
value: emptydir-container2
volumes:
- name: emptydir-volume
emptyDir:
medium: Memory
sizeLimit: 1Gi
這個(gè)Deployment會(huì)創(chuàng)建一個(gè)Pod,這個(gè)Pod會(huì)含有兩個(gè)容器:emptydir-container1和emptydir-container2。
使用下面命令創(chuàng)建這個(gè)部署
kubectl create -f emptydir_same_pod.yaml
deployment.apps/emptydir-deployment created
然后登錄到容器中查看/tempdir/lockfile文件的內(nèi)容
kubectl exec pods/emptydir-deployment-75c6545df5-slznj --container emptydir-container1 -it -- tail -f /tempdir/lockfile
emptydir-deployment-75c6545df5-slznj emptydir-container1 write something to lockfile
emptydir-deployment-75c6545df5-slznj emptydir-container1 write something to lockfile
emptydir-deployment-75c6545df5-slznj emptydir-container1 write something to lockfile
……
kubectl exec pods/emptydir-deployment-75c6545df5-slznj --container emptydir-container2 -it -- tail -f /tempdir/lockfile
emptydir-deployment-75c6545df5-slznj emptydir-container1 write something to lockfile
emptydir-deployment-75c6545df5-slznj emptydir-container1 write something to lockfile
emptydir-deployment-75c6545df5-slznj emptydir-container1 write something to lockfile
……
可以看到emptydir-container1容器在持續(xù)寫(xiě)入內(nèi)容;emptydir-container2因?yàn)闄z測(cè)到/tempdir/lockfile文件存在,就不會(huì)寫(xiě)入文件。
通過(guò)下面指令可以看到emptydir-container2的輸出
kubectl logs pods/emptydir-deployment-75c6545df5-slznj --container emptydir-container2
emptydir-deployment-75c6545df5-slznj emptydir-container1 write something to lockfile
emptydir-deployment-75c6545df5-slznj emptydir-container1 write something to lockfile
emptydir-deployment-75c6545df5-slznj emptydir-container1 write something to lockfile
……
同一個(gè)Node的不同Pod間不可以共享
我們應(yīng)用Pod親和性,讓Deployment在同一個(gè)Node上部署相同的Pod。
# emptydir_same_node.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: emptydir-same-node-deployment
spec:
selector:
matchLabels:
app: emptydir-container
replicas: 2
template:
metadata:
labels:
app: emptydir-container
spec:
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- emptydir-container
topologyKey: "kubernetes.io/hostname"
containers:
- name: emptydir-container
image: busybox
command: ["/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 pod_name=$POD_NAME; else pod_name=\"unknown_pod\"; fi; if [ -n \"$CONTAINER_NAME\" ]; then container_name=$CONTAINER_NAME; else container_name=\"unknown_container\"; fi; while true; do echo \"$pod_name $container_name write something to lockfile\" >&3; sleep 5; done; fi;"]
volumeMounts:
- name: emptydir-volume
mountPath: /tempdir
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: CONTAINER_NAME
value: emptydir-container
volumes:
- name: emptydir-volume
emptyDir:
medium: Memory
sizeLimit: 1Gi
創(chuàng)建好這個(gè)部署后,我們可以通過(guò)下面指令確認(rèn)它們被部署在同一個(gè)Node(ubuntuc)上。
kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
emptydir-same-node-deployment-6b6cfbb769-vhj7k 1/1 Running 0 34s 10.1.43.199 ubuntuc <none> <none>
emptydir-same-node-deployment-6b6cfbb769-mgh8h 1/1 Running 0 34s 10.1.43.198 ubuntuc <none> <none>
然后查看每個(gè)Pod上/tempdir/lockfile文件的內(nèi)容
kubectl exec pods/emptydir-same-node-deployment-6b6cfbb769-mgh8h --container emptydir-container -it -- tail -f /tempdir/lockfile
emptydir-same-node-deployment-6b6cfbb769-mgh8h emptydir-container write something to lockfile
emptydir-same-node-deployment-6b6cfbb769-mgh8h emptydir-container write something to lockfile
emptydir-same-node-deployment-6b6cfbb769-mgh8h emptydir-container write something to lockfile
……
kubectl exec pods/emptydir-same-node-deployment-6b6cfbb769-vhj7k --container emptydir-container -it -- tail -f /tempdir/lockfile
emptydir-same-node-deployment-6b6cfbb769-vhj7k emptydir-container write something to lockfile
emptydir-same-node-deployment-6b6cfbb769-vhj7k emptydir-container write something to lockfile
emptydir-same-node-deployment-6b6cfbb769-vhj7k emptydir-container write something to lockfile
……文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-632856.html
可以看到它們打印出來(lái)的Pod名稱(chēng)不同,即可以證明:同一個(gè)Node上不同Pod創(chuàng)建的emptyDir是不同的。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-632856.html
參考資料
- https://kubernetes.io/zh-cn/docs/concepts/storage/volumes/#emptydir
到了這里,關(guān)于研發(fā)工程師玩轉(zhuǎn)Kubernetes——emptyDir的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!