我们已经了解到,使用ConfigMap和Secret向应用传递配置数据,这对于运行前预设的数据是可行的。但是对于那些不能预先知道的,就需要使用Downward API。
Downward API允许我们通过环境变量或者卷的方式向应用传递元数据。可传递的数据包括:Pod的IP、名称、标签、注解、所在命令空间、运行的节点名称、运行所属的ServiceAccountName,每个容器请求的CPU和内存使用量以及限制。
通过环境变量暴露元数据env.valueFrom下引用Pod的字段使用fieldRef,引用容器的cpu和内存使用resourceFieldRef。
对于暴露资源的请求和使用显示的环境变量,我们通常会设置一个基数单位。实际的资源请求值和使用限制值除以这个基数单位,所得结果通过环境变量暴露出去。
查看一下环境变量
-> [root@kube0.vm] [~] k create -f downward-env.yaml pod/downward-env created -> [root@kube0.vm] [~] k exec downward-env env PATH=http://www.likecs.com/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin HOSTNAME=downward-env POD_NAME=downward-env POD_NAMESPACE=default POD_IP=10.244.1.24 NODE_NAME=kube1.vm SERVICE_ACCOUNT=default CONTAINER_CPU_REQ_MILLICORES=15 CONTAINER_MEMORY_LIMIT_KIBIBYTES=102400 通过Downward卷传递元数据使用downward卷的方式传递元数据,当Pod的标签和注解修改后,Kubernetes会更新存有相关信息的文件。而环境变量方式下,新值无法暴露。
该描述文件定义了一个downward类型的卷,挂载到容器的/tmp/downward。卷中包含的内容是用downwardAPI.items定义的。
# downward-volume.yaml apiVersion: v1 kind: Pod metadata: name: downward-volume labels: foo: bar annotations: key1: value1 key2: | multi line value spec: containers: - name: alpine image: alpine command: ["sleep","999999"] resources: requests: cpu: 15m memory: 100Ki limits: cpu: 500m memory: 100Mi volumeMounts: - name: downward mountPath: /tmp/downward volumes: - name: downward downwardAPI: items: - path: "podName" fieldRef: fieldPath: metadata.name - path: "podNamespace" fieldRef: fieldPath: metadata.namespace - path: "labels" fieldRef: fieldPath: metadata.labels - path: "annotations" fieldRef: fieldPath: metadata.annotations - path: "containerCpuReqMillicores" resourceFieldRef: containerName: alpine resource: requests.cpu divisor: 1m - path: "containerMemoryLimitBytes" resourceFieldRef: containerName: alpine resource: limits.memory divisor: 1创建查看
-> [root@kube0.vm] [~] k create -f downward-volume.yaml pod/downward-volume created -> [root@kube0.vm] [~] k exec downward-volume ls /tmp/downward annotations containerCpuReqMillicores containerMemoryLimitBytes labels podName podNamespace 与Kubernetes API服务器交互DownwardAPI可以获得当前Pod的部分元数据,但是无法获得到其他的Pod的,以及一些集群中的其他资源信息。
Kubernetes REST API先来查看集群信息,找到API服务器地址。然后 curl -k https://192.168.199.117:6443 ,当然结果也是访问受限的。
-> [root@kube0.vm] [~] k cluster-info Kubernetes master is running at https://192.168.199.117:6443 KubeDNS is running at https://192.168.199.117:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy所以我们通过 kubectl proxy 访问API服务器。kubectl proxy启动一个代理,接收来自本机的HTTP请求并验证身份,转发到API服务器。
-> [root@kube0.vm] [~] k proxy Starting to serve on 127.0.0.1:8001新开一个窗口,访问根路径实时
-> [root@kube0.vm] [~] curl :8001/ { "paths": [ "/api", "/api/v1", "/apis", "/apis/", ............ 从pod内部与API服务器交互确定API服务器的地址
-> [root@kube0.vm] [~] k get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2d1h或者从任意Pod查找服务的环境变量
-> [root@kube0.vm] [~] k exec myalpine env|grep KUBERNETES_SERVICE KUBERNETES_SERVICE_PORT=443 KUBERNETES_SERVICE_PORT_HTTPS=443 KUBERNETES_SERVICE_HOST=10.96.0.1用一个有curl的镜像启动一个Pod
首先验证服务器身份,定义CURL_CA_BUNDLE环境变量,省去每次都要 curl --cacert 指定证书
export CURL_CA_BUNDLE=http://www.likecs.com/var/run/secrets/kubernetes.io/serviceaccount/ca.crt其次获得服务器授权:定义TOKEN
export TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)