1.介绍
1.提供容器元数据
比如我们 golang语言 我们说他会根据当前CPU的数量 以此去确认我们的进程 线程 和协程之间的关系 以此去释放我们当前CPU的更大的 这么一个并行任务的能力 但是这里会出现一个问题 容器它是把当前的应用 封装在我们固定的名称空间了 而且给它以特定的资源 当然它的背后是基于我们的 cgroup 我们叫控制组 换句话的意思 它看起来 这里有4个CPU 那我就通过我们的四个线程 的方式去创建更多协程 以此去占用更多的CPU资源 但其次呢 其实我只给它限制允许使用两个CPU 那这里是不是就不搭了 可能会出现一些我们的运行的缓慢啊 还不如不优化的结果 那再包括我们类似nginx的服务 它的工作进程数量 叫 worker processes 它需要根据当前的CPU数量 去进行绑定的 那如果我们看起来现在有4个CPU 实际上只有两个在用 那我们worker processes是不是设定也会有问题 那我们怎么把当前的真实的CPU数量 内存数量 传递给容器内部的进程 或应用呢 ,就可以通过Downward API 来使用
2.动态配置
我们有时候会根据当前的pod名称 或 pod标签去修改我们的配置参数 难在需要你给我提供准确的数那这个数据怎么提供 就由 downwardAPI
3.与 kubernetes 环境集成
我们可以调取当前kubernetes内部的一些需要的数据 以此去修改 让我得到一个最稳妥的恰当的运行方式 这都是我们的 downward API 可以去实现可以去用到的的一种情况 比如我们的CPU实际的真实数量的传入
2.案例1 env案例
创建 12.pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: downward-api-env-example
spec:
containers:
- name: my-container
image: wangyanglinux/myapp:v1.0
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
- name: CPU_REQUEST
valueFrom:
resourceFieldRef:
resource: requests.cpu
- name: CPU_LIMIT
valueFrom:
resourceFieldRef:
resource: limits.cpu
- name: MEMORY_REQUEST
valueFrom:
resourceFieldRef:
resource: requests.memory
- name: MEMORY_LIMIT
valueFrom:
resourceFieldRef:
resource: limits.memory
restartPolicy: Never
kubectl create -f 12.pod.yaml
kubectl exec -it downward-api-env-example -- /bin/bash
env

3.案例2 volume 案例
如果对当前资源不做限制,默认是可以使用当前机器的所有资源,如果你觉得太多了你想加资源限制你可以使用 resources 下的 limits 和 requests关键字
apiVersion: v1
kind: Pod
metadata:
name: downward-api-volume-example
spec:
containers:
- name: my-container
image: wangyanglinux/myapp:v1.0
resources:
limits:
cpu: "1"
memory: "512Mi"
requests:
cpu: "0.5"
memory: "256Mi"
volumeMounts:
- name: downward-api-volume
mountPath: /etc/podinfo
volumes:
- name: downward-api-volume
downwardAPI:
items:
- path: "annotations"
fieldRef:
fieldPath: metadata.annotations
- path: "labels"
fieldRef:
fieldPath: metadata.labels
- path: "name"
fieldRef:
fieldPath: metadata.name
- path: "namespace"
fieldRef:
fieldPath: metadata.namespace
- path: "uid"
fieldRef:
fieldPath: metadata.uid
- path: "cpuRequest"
resourceFieldRef:
containerName: my-container
resource: requests.cpu
- path: "memoryRequest"
resourceFieldRef:
containerName: my-container
resource: requests.memory
- path: "cpuLimit"
resourceFieldRef:
containerName: my-container
resource: limits.cpu
- path: "memoryLimit"
resourceFieldRef:
containerName: my-container
resource: limits.memory
restartPolicy: Never
requests含义初识资源
limits 最大资源
kubectl create -f 13.pod.yaml
kubectl exec -it downward-api-volume-example -- /bin/bash
cd /etc/podinfo
ls -l


1.给加标签这文件的值会更新
kubectl get po --show-labels

kubectl label pod downward-api-volume-example jmj=admin

这样就加载过来了 热更新
cat labels


4.案例3 Pod之间传递元数据 基于ApiServer访问集群

1.创建一个RBAC的基于角色的权限
1.rbac.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: test-api-cluster-admin-binding
subjects:
- kind: ServiceAccount
name: test-api
namespace: default
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io
kubectl create -f 1.rbac.yaml
2.创建 一个Service Account 简称 sa test-api
kubectl create sa test-api
3.创建pod
apiVersion: v1
kind: Pod
metadata:
name: curl
spec:
serviceAccountName: test-api
containers:
- name: main
image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/curlimages/curl:8.9.1
command: ["sleep", "9999"]
赋予权限等会访问Api服务器
kubectl apply -f 1.pod.yaml
root@curl:/# TOKEN=$( cat /var/run/secrets/kubernetes.io/serviceaccount/token )
root@curl:/# CAPATH="/var/run/secrets/kubernetes.io/serviceaccount/ca.crt"
root@curl:/# NS=$( cat /var/run/secrets/kubernetes.io/serviceaccount/namespace )
root@curl:/# curl -H "Authorization: Bearer $TOKEN" --cacert $CAPATH
https://kubernetes/api/v1/namespaces/$NS/pods
这是另一种获取pod相关属性的方式
5.kubernetes api文档
kubectl proxy --port=8080
相当于把我们apiserver 服务器做了 类似于nginx 在外面桥接一次 把https 转化为 http 你就不需要提供证书了 而且基于这样的端口访问的时候 是不需要做授权的判断的 更简单
curl localhost:8080/openapi/v2 > k8s-swagger.json
cat k8s-swagger.json
用图形化界面去读取 这个json文件
docker run --rm -d -p 80:8080 -e SWAGGER_JSON=/k8s-swagger.json -v $(pwd)/k8s-swagger.json:/k8s-swagger.json swaggerapi/swagger-ui

这样就获取到官方的接口文档了