赞
踩
- 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的内容来修改容器中的信息。
- 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容器同时挂载到一个空目录下,从而实现了信息的交换。
作用:是帮你把 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容器中也会跟着更改。
作用:它与 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
- ...
作用:让 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 定义的信息,大多还可以通过环境变量的方式出现在容器里。但是,通过环境变量获取这些信息的方式,不具备自动更新的能力。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。