这个章节展示了如何使用卷配置pod存储。
容器文件系统只要容器存在才能生效,所以当一个容器终端并重新启动时对于文件系统所做的修改将会丢失。对于单独容器的一致性存储可以使用volume。这对于有状态应用尤为重要,例如key-value存储和数据库。例如redis是一个key-value的内存存储。
给pod配置卷
在本次实验,新建一个运行一个容器的pod。这个pod有一个类型为empytDir的卷,持续pod的整个生命周期,即使是容器终端并重启。这里是这个pod的配置文件:
apiVersion: v1
kind: Pod
metadata:
name: redis
spec:
containers:
- name: redis
image: redis
volumeMounts:
- name: redis-storage
mountPath: /data/redis
volumes:
- name: redis-storage
emptyDir: {}
1.新建pod:
kubectl create -f http://k8s.io/docs/tasks/configure-pod-container/pod-redis.yaml
2.验证pod的容器是否运行,并查看pod的改变:
kubectl get --watch pod redis
输出大概是这样子:
NAME READY STATUS RESTARTS AGE
redis 1/1 Running 0 13s
3.在别的终端,使用shell进入运行的容器内部:
kubectl exec -it redis -- /bin/bash
4.在shell里进入/data/redis目录里面,并新建一个文件:
root@redis:/data/redis# echo Hello > test-file
5.在shell里查看运行的进程列表:
root@redis:/data/redis# ps aux
输出类似于下面:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
redis 1 0.1 0.1 33308 3828 ? Ssl 00:46 0:00 redis-server *:6379
root 12 0.0 0.0 20228 3020 ? Ss 00:47 0:00 /bin/bash
root 15 0.0 0.0 17500 2072 ? R+ 00:48 0:00 ps aux
6.在shell里杀掉redis进程:
root@redis:/data/redis# kill <pid>
pid是redis的进程id。
7.在原来的终端查看redis pod的变化。最后你可以看到类似于下面的内容:
NAME READY STATUS RESTARTS AGE
redis 1/1 Running 0 13s
redis 0/1 Completed 0 6m
redis 1/1 Running 1 6m
在此刻,容器中断并重启。这是因为redis pod的重启策略(restartPolicy)是Always。
1.使用shell进入重新启动的容器:
kubectl exec -it redis -- /bin/bash
2.进入/data/redis目录并且看到test-file还在这里。