Pod中volume的用法

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

apiVersion: v1
kind: Pod
metadata:
  name: nginx-demo1
  labels:
    app: nginx
spec:
  containers:
  - name: nginx-demo1
    image: nginx:1.8
    volumeMounts:
    - name: test
      mountPath: /var/share/nginx/html
    ports:
    - name: web
      containerPort: 80
  volumes:
    - name: test
      hostPath:
        path: /var/data

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

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

apiVersion: v1
kind: Pod
metadata:
  name: nginx-demo1
  labels:
    app: nginx
spec:
  containers:
  - name: nginx-demo1
    image: nginx:1.8
    volumeMounts:
    - name: test
      mountPath: /var/share/nginx/html
    ports:
    - name: web
      containerPort: 80
  - name: share
    image: busybox
    args:
      - sleep
      - "7200"
    volumeMounts:
    - name: test
      mountPath: /data
  volumes:
    - name: test
      emptyDir: {}

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

3.Secret:

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

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

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

写一个yaml文件。

apiVersion: v1
kind: Pod
metadata:
  name: test-projected-volume
spec:
  containers:
  - name: test-secret-volume
    image: busybox
    args:
      - sleep
      - "86400"
    volumeMounts:
    - name: mysql-cred
      mountPath: "/projected-volume"
      readOnly: true
  volumes:
  - name: mysql-cred
    projected:
      sources:
      - secret:
          name: user
      - secret:
          name: pass

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

4.ConfigMap:

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

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

# .properties文件的内容
$ cat example/ui.properties
color.good=purple
color.bad=yellow
allow.textmode=true
how.nice.to.look=fairlyNice

# 从.properties文件创建ConfigMap
$ kubectl create configmap ui-config --from-file=example/ui.properties

# 查看这个ConfigMap里保存的信息(data)
$ kubectl get configmaps ui-config -o yaml
apiVersion: v1
data:
  ui.properties: |
    color.good=purple
    color.bad=yellow
    allow.textmode=true
    how.nice.to.look=fairlyNice
kind: ConfigMap
metadata:
  name: ui-config
  ...

5.Downward Api:

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

配置:

apiVersion: v1
kind: Pod
metadata:
  name: test-downwardapi-volume
  labels:
    zone: us-est-coast
    cluster: test-cluster1
    rack: rack-22
spec:
  containers:
    - name: client-container
      image: k8s.gcr.io/busybox
      command: ["sh", "-c"]
      args:
      - while true; do
          if [[ -e /etc/podinfo/labels ]]; then
            echo -en '\n\n'; cat /etc/podinfo/labels; fi;
          sleep 5;
        done;
      volumeMounts:
        - name: podinfo
          mountPath: /etc/podinfo
          readOnly: false
  volumes:
    - name: podinfo
      projected:
        sources:
        - downwardAPI:
            items:
              - path: "labels"
                fieldRef:
                  fieldPath: metadata.labels

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

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

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


1. 使用fieldRef可以声明使用:
spec.nodeName - 宿主机名字
status.hostIP - 宿主机IP
metadata.name - Pod的名字
metadata.namespace - Pod的Namespace
status.podIP - Pod的IP
spec.serviceAccountName - Pod的Service Account的名字
metadata.uid - Pod的UID
metadata.labels['<KEY>'] - 指定<KEY>的Label值
metadata.annotations['<KEY>'] - 指定<KEY>的Annotation值
metadata.labels - Pod的所有Label
metadata.annotations - Pod的所有Annotation

2. 使用resourceFieldRef可以声明使用:
容器的CPU limit
容器的CPU request
容器的memory limit
容器的memory request

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ApangZzz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值