Volumes:给containers挂载磁盘

创建多容器pod

本章开始yaml文件会慢慢变大,大家可以慢一些做,多理解其中含义。
我们看一个提供fortune服务(财富格言集锦,每次访问都给你一碗不同的鸡汤)的pod
1
# cat fortune-pod.yaml
2
apiVersion: v1
3
kind: Pod
4
metadata:
5
name: fortune
6
spec:
7
containers:
8
- image: luksa/fortune
9
name: html-generator
10
volumeMounts: #磁盘描述
11
- name: html
12
mountPath: /var/htdocs #将html磁盘mount到此
13
- image: nginx:alpine
14
name: web-server
15
volumeMounts: #磁盘描述
16
- name: html
17
mountPath: /usr/share/nginx/html #将html加载
18
readOnly: true
19
ports:
20
- containerPort: 80
21
protocol: TCP
22
volumes: #磁盘的申请或是定义
23
- name: html
24
emptyDir: {} #一个最简单的空磁盘
Copied!

创建一个可在容器中共享磁盘存储的卷

有非常多的磁盘种类,如:
  • emptyDir 临时数据空目录
  • hostPath 节点磁盘上的路径
  • persistentVolumeClaim 动态申请外部存储磁盘
  • ... ...

emptyDir磁盘

将前面的yaml描述创建它并访问一下服务
1
$ k create -f fortune-pod.yaml
2
pod/fortune created
3
4
$ k get all
5
NAME READY STATUS RESTARTS AGE
6
pod/fortune 2/2 Running 0 48s
7
8
$ k port-forward fortune 8080:80
9
Forwarding from 127.0.0.1:8080 -> 80
10
Forwarding from [::1]:8080 -> 80
11
12
$ curl http://localhost:8080/
13
So this is it. We're going to die.
Copied!
体会一下他们之间的关联

hostPath

这个我们不自己创建演示了,看看kubernetes是怎么用的
1
#查看系统空间的pod
2
$ kubectl get pod --namespace kube-system
3
4
#描述一下proxy-worker容器
5
$ kubectl describe pod kube-proxy-worker-88kbk --namespace kube-system
Copied!
可以看到有hostpath使用方式
1
Volumes:
2
kube-proxy-worker:
3
Type: ConfigMap (a volume populated by a ConfigMap)
4
Name: kube-proxy-worker
5
Optional: false
6
xtables-lock:
7
Type: HostPath (bare host directory volume)
8
Path: /run/xtables.lock
9
HostPathType: FileOrCreate
10
lib-modules:
11
Type: HostPath (bare host directory volume)
12
Path: /lib/modules
13
HostPathType:
14
kube-proxy-token-h8j46:
15
Type: Secret (a volume populated by a Secret)
16
SecretName: kube-proxy-token-h8j46
17
Optional: false
Copied!
好了,上面都是使用临时存储、节点存储,现在我们去做一些持久化的操作

使用持久化声明获取磁盘

其实还有将已有磁盘挂载到pod中,因为涉及的aws云商等的操作,略显复杂会失去重点,我们不在此练习了
例如我们为mongodb数据库申请一块盘,可以这样做
1
# cat mongodb-pvc.yaml
2
apiVersion: v1
3
kind: PersistentVolumeClaim #持久化声明
4
metadata:
5
name: mongodb-pvc
6
spec:
7
resources:
8
requests:
9
storage: 20Gi #阿里环境最小20GB,后续可能有变化
10
accessModes:
11
- ReadWriteOnce
12
storageClassName: "disk" #注意选择对class
Copied!
其中storageClassName是个很重要的概念,可以这样查看环境支持的类
1
$ k get storageclass
2
NAME PROVISIONER AGE
3
alicloud-disk-available alicloud/disk 7d18h
4
alicloud-disk-efficiency alicloud/disk 7d18h
5
alicloud-disk-essd alicloud/disk 7d18h
6
alicloud-disk-ssd alicloud/disk 7d18h
7
disk alicloud/disk 6d19h
Copied!
disk类非常重要,这是我们公司统一使用的磁盘类,每个云商都有
1
$ k create -f mongodb-pvc.yaml
2
persistentvolumeclaim/mongodb-pvc created
3
4
$ k describe pvc/mongodb-pvc
5
Name: mongodb-pvc
6
Namespace: liuzongxian
7
StorageClass: disk
8
Status: Pending
9
Volume:
10
Labels: <none>
11
Annotations: <none>
12
Finalizers: [kubernetes.io/pvc-protection]
13
Capacity:
14
Access Modes:
15
VolumeMode: Filesystem
16
Events:
17
Type Reason Age From Message
18
---- ------ ---- ---- -------
19
Normal WaitForFirstConsumer 5s (x3 over 17s) persistentvolume-controller waiting for first consumer to be created before binding
20
Mounted By: <none>
Copied!
提示我们磁盘等待消费者出现才能真正的创建和绑定,那我们挂载它到mongodb中,启动一个mongodb服务
1
# cat mongodb-pod-pvc.yaml
2
apiVersion: v1
3
kind: Pod
4
metadata:
5
name: mongodb
6
spec:
7
containers:
8
- image: mongo
9
name: mongodb
10
volumeMounts:
11
- name: mongodb-data
12
mountPath: /data/db
13
ports:
14
- containerPort: 27017
15
protocol: TCP
16
volumes:
17
- name: mongodb-data
18
persistentVolumeClaim:
19
claimName: mongodb-pvc
Copied!
1
$ k create -f mongodb-pod-pvc.yaml
2
pod/mongodb created
Copied!
然后查看pod/pvc/pv等资源情况
测试一下mongodb的服务吧
1
$ kubectl exec -it mongodb mongo
2
MongoDB shell version v4.2.2
3
...
4
...
Copied!
Cool!现在你成功的将PVC获取的磁盘PV挂载到了mongodb容器pod中
如果不指明storageClass会使用kubernetes默认指定的磁盘,我们环境中是“disk“
也可以不指定存储类,使用默认的,前提是环境已配置好
1
# cat mongodb-pvc-dp-nostorageclass.yaml
2
apiVersion: v1
3
kind: PersistentVolumeClaim
4
metadata:
5
name: mongodb-pvc2
6
spec:
7
resources:
8
requests:
9
storage: 20Gi
10
accessModes:
11
- ReadWriteOnce
Copied!
Well!到这里,你已经体验了如何为自己的pod申请磁盘了!东西越来越多了,后面的内容会越来越有趣!

思考题

  • 请谈谈StorageClass与PVC机制的好处