Kubernetes 存储 Downward API

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

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

相关推荐
阿里云云原生2 小时前
车企数据隐私保护必修课:如何用 SLS mask 守住日志中的敏感信息
云原生
阿里云云原生3 小时前
切换模型会损失缓存,智能路由还省钱吗?
云原生
闲云野鹤在人间3 小时前
Kubernetes Service 与 kube-proxy 详解
云原生·容器·kubernetes
我不会起名字3223 小时前
节点 NotReady:kubelet 与容器运行时的 4 步排查
云原生·kubernetes·kubelet·排查
说实话起个名字真难啊4 小时前
实战docker部署dify及注意点
运维·docker·容器
闲云自留地5 小时前
K8s Service 全解:服务发现、四种类型、会话保持、金丝雀发布一篇通
容器·kubernetes·服务发现
分布式存储与RustFS5 小时前
GPU 在空转等数据?PyTorch 训练集进 RustFS 的三种接法
云原生·开源·对象存储·分布式存储·s3·rustfs·性能基准
choumin6 小时前
C++ 标准容器为什么不能存引用
c++·容器·引用类型
时间售卖铺8 小时前
MySQL 备份
运维·数据库·mysql·云原生
对象存储与RustFS8 小时前
GPU 在空转等数据?PyTorch 训练集进 RustFS 的三种接法
后端·docker·云原生