当前位置:   article > 正文

Pod中volume的用法_pod volumns配置

pod volumns配置

1.hostPath:可以与宿主机进行数据的传递

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: nginx-demo1
  5. labels:
  6. app: nginx
  7. spec:
  8. containers:
  9. - name: nginx-demo1
  10. image: nginx:1.8
  11. volumeMounts:
  12. - name: test
  13. mountPath: /var/share/nginx/html
  14. ports:
  15. - name: web
  16. containerPort: 80
  17. volumes:
  18. - name: test
  19. hostPath:
  20. path: /var/data

这里我是将容器的/var/share/nginx/html挂载到宿主机的/var/data上的。进而我们即使不用进宿主机我们也可以通过更改/var/data的内容来修改容器中的信息。

2.emptyDir:一般用于两个容器之间进行信息交换。

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: nginx-demo1
  5. labels:
  6. app: nginx
  7. spec:
  8. containers:
  9. - name: nginx-demo1
  10. image: nginx:1.8
  11. volumeMounts:
  12. - name: test
  13. mountPath: /var/share/nginx/html
  14. ports:
  15. - name: web
  16. containerPort: 80
  17. - name: share
  18. image: busybox
  19. args:
  20. - sleep
  21. - "7200"
  22. volumeMounts:
  23. - name: test
  24. mountPath: /data
  25. volumes:
  26. - name: test
  27. emptyDir: {}

nginx-demo1容器和share容器同时挂载到一个空目录下,从而实现了信息的交换。

3.Secret:

作用:是帮你把 Pod 想要访问的加密数据,存放到 Etcd 中。然后,你就可以通过在 Pod 的容器里挂载 Volume 的方式,访问到这些 Secret 里保存的信息了。

先创建两个secret,一个user,一个pass,用来存用户名和密码

  1. kubectl create secret generic pass --from-file password.txt
  2. kubectl create secret generic user --from-file username.txt
  3. root@master01:/opt/k8s/yaml/test# kubectl get secrets
  4. NAME TYPE DATA AGE
  5. default-token-kjbcx kubernetes.io/service-account-token 3 4d
  6. pass Opaque 1 74m
  7. user Opaque 1 52m

写一个yaml文件。

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: test-projected-volume
  5. spec:
  6. containers:
  7. - name: test-secret-volume
  8. image: busybox
  9. args:
  10. - sleep
  11. - "86400"
  12. volumeMounts:
  13. - name: mysql-cred
  14. mountPath: "/projected-volume"
  15. readOnly: true
  16. volumes:
  17. - name: mysql-cred
  18. projected:
  19. sources:
  20. - secret:
  21. name: user
  22. - secret:
  23. name: pass

启动后看见在容器的projected-volume目录下已经存在账号和密码了,另外我们在宿主机中更改user和pass容器中也会跟着更改。

4.ConfigMap:

作用:它与 Secret 的区别在于,ConfigMap 保存的是不需要加密的、应用所需的配置信息。而 ConfigMap 的用法几乎与 Secret 完全相同:你可以使用 kubectl create configmap 从文件或者目录创建 ConfigMap,也可以直接编写 ConfigMap 对象的 YAML 文件。 

这样你可以写一下用于项目的文件,比如一个 Java 应用所需的配置文件(.properties 文件),就可以通过下面这样的方式保存在 ConfigMap 里:

  1. # .properties文件的内容
  2. $ cat example/ui.properties
  3. color.good=purple
  4. color.bad=yellow
  5. allow.textmode=true
  6. how.nice.to.look=fairlyNice
  7. # 从.properties文件创建ConfigMap
  8. $ kubectl create configmap ui-config --from-file=example/ui.properties
  9. # 查看这个ConfigMap里保存的信息(data)
  10. $ kubectl get configmaps ui-config -o yaml
  11. apiVersion: v1
  12. data:
  13. ui.properties: |
  14. color.good=purple
  15. color.bad=yellow
  16. allow.textmode=true
  17. how.nice.to.look=fairlyNice
  18. kind: ConfigMap
  19. metadata:
  20. name: ui-config
  21. ...

5.Downward Api:

作用:让 Pod 里的容器能够直接获取到这个 Pod API 对象本身的信息。

配置:

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: test-downwardapi-volume
  5. labels:
  6. zone: us-est-coast
  7. cluster: test-cluster1
  8. rack: rack-22
  9. spec:
  10. containers:
  11. - name: client-container
  12. image: k8s.gcr.io/busybox
  13. command: ["sh", "-c"]
  14. args:
  15. - while true; do
  16. if [[ -e /etc/podinfo/labels ]]; then
  17. echo -en '\n\n'; cat /etc/podinfo/labels; fi;
  18. sleep 5;
  19. done;
  20. volumeMounts:
  21. - name: podinfo
  22. mountPath: /etc/podinfo
  23. readOnly: false
  24. volumes:
  25. - name: podinfo
  26. projected:
  27. sources:
  28. - downwardAPI:
  29. items:
  30. - path: "labels"
  31. fieldRef:
  32. fieldPath: metadata.labels

运行容器查看,发现容器的/etc/podinfo/labels文件中已经有了我们定义的metadata.labels标签了。

  1. root@master01:/opt/k8s/yaml/test# kubectl exec -it test-downwardapi-volume cat /etc/podinfo/labels
  2. kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
  3. cluster="test-cluster1"
  4. rack="rack-22"
  5. zone="us-est-coast"

目前,Downward API 支持的字段已经非常丰富了,比如:

  1. 1. 使用fieldRef可以声明使用:
  2. spec.nodeName - 宿主机名字
  3. status.hostIP - 宿主机IP
  4. metadata.name - Pod的名字
  5. metadata.namespace - Pod的Namespace
  6. status.podIP - Pod的IP
  7. spec.serviceAccountName - Pod的Service Account的名字
  8. metadata.uid - Pod的UID
  9. metadata.labels['<KEY>'] - 指定<KEY>的Label值
  10. metadata.annotations['<KEY>'] - 指定<KEY>的Annotation值
  11. metadata.labels - Pod的所有Label
  12. metadata.annotations - Pod的所有Annotation
  13. 2. 使用resourceFieldRef可以声明使用:
  14. 容器的CPU limit
  15. 容器的CPU request
  16. 容器的memory limit
  17. 容器的memory request

其实,Secret、ConfigMap,以及 Downward API 这三种 Projected Volume 定义的信息,大多还可以通过环境变量的方式出现在容器里。但是,通过环境变量获取这些信息的方式,不具备自动更新的能力。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/162364
推荐阅读
  

闽ICP备14008679号