Kubernetes(七)Pod进阶之Downward API和PodPreset

关于静态pod可以参考我这篇博客

一    Downward API

(1)基本概念和用途

目的: '不是'为了存放容器的数据'也不是'用来进行'容器和宿主机的数据交换的',而是让 'Pod 里的容器'能够'直接获取到'这个 Pod 对象本身的一些信息

(2)环境变量

1)静态数据'pod创建之前已经确定的' --> metadat.*

2)状态数据'pod创建之后才知道'    -->status.podIP、spec.*

3)容器的资源数据'cpu、memory'   -->request.* limit.*

案例

通过 Downward API 来将 'Pod 的 IP'、'名称以及所对应的 namespace' 注入到容器的'环境变量'中去,然后在'容器中打印'全部的'环境变量'来进行'验证'
apiVersion: v1
kind: Pod
metadata:
  name: env-pod
  namespace: kube-system
spec:
  containers:
  - name: env-pod
    image: busybox
    command: ["/bin/sh", "-c", "env"]
    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
理解: 环境变量的'值-->valueFrom'来源于'属性引用-->fieldRef',这个属性的值来自于'属性路径->fieldPath'

备注: 环境变量的'值来源'有很多,这里只介绍'Downard API'相关的

结果

通过'容器的日志',发现'pod信息'注入到容器的'环境变量'里面,被'打印'出来

补充信息

打印' Pod 的环境变量 '可以看到有'很多内置的变量'

其中大部分是'系统自动为我们添加'的,Kubernetes 会把当前'命名空间下面的 Service 信息'通过环境变量的形式'注入'到 Pod 中去

补充:resource

补充:status.podIP获取

(3)volume

注意: items是'对象列表'

案例讲解

通过 'Volume 挂载的方式'去获取 Pod 的基本信息

通过Downward API将 Pod 的 'Label、Annotation 等信息'通过 Volume '挂载到'容器的某个文件中去,然后在'容器中打印出'该文件的值来验证
apiVersion: v1
kind: Pod
metadata:
  name: volume-pod
  namespace: kube-system
  labels:
    k8s-app: test-volume
    node-env: test
  annotations:
    own: wzj
    build: test
spec:
  volumes:           --> 'volumes'
  - name: podinfo    --> '对应'
    downwardAPI:
      items:
      - path: labels --> '文件名'
        fieldRef:
          fieldPath: metadata.labels --> '文件内容'
      - path: annotations
        fieldRef:
          fieldPath: metadata.annotations
  containers:
  - name: volume-pod
    image: busybox
    args: 
    - sleep 
    - "3600"
    volumeMounts:    --> '对应-->容器挂载点'
    - name: podinfo
      mountPath: /etc/podinfo
我们将元数据 labels 和 annotaions 以'文件的形式挂载'到了 /etc/podinfo 目录下 -->'有两个文件'

备注: 涉及到卷'volume',就会涉及'文件'

创建成功后,我们可以'进入到容器中'查看'元信息'已经'存入到文件中了'

 (4)其它需求

获取 'Pod 容器运行后'才会出现的信息

(5)应用场景

二    PodPreset

API 版本是'alpha版本-->1.19.3也是',还不是主资源'kubectl api-resources查询不到',未来可能删除

'比较通用'的放到'PodPreset'中

(1)基本概念

(2)PodPreset作用机理

(3)启动方式

说明:实际不用移动就会自动更新

判断是否启动成功

(4)需求引入

需求就是需要'同步 Pod 和宿主机'的时间,一般情况下,我们是通过'挂载宿主机的 localtime 来完成'的
'传统方式'

apiVersion: v1
kind: Pod
metadata:
  name: time-demo
  labels:
    app: time
spec:
  volumes:
  - name: host-time
    hostPath:
      path: /etc/localtime   -->'使用宿主机的时间'
  containers:
  - name: time-demo
    image: nginx
    volumeMounts:
    - name: host-time
      mountPath: /etc/localtime
    ports:
    - containerPort: 80

验证:时间同步

缺点

(5)PodPreset来实现

apiVersion: settings.k8s.io/v1alpha1
kind: PodPreset
metadata:
  name: time-preset
  namespace: default  -->'属于ns下的资源-->不用的ns可以使用不同的podPreset'
spec:
  selector:
    matchLabels:      -->'匹配哪些标签的pod,没有指定就是所有default的pod' -->'也可以指定为某些pod设置'
  volumeMounts:
  - name: localtime
    mountPath: /etc/localtime
  volumes:
  - name: localtime
    hostPath:
      path: /etc/localtime

创建

观察:直接创建上面的 Pod看是否时间同步

'没有/etc/localtime设置'
apiVersion: v1
kind: Pod
metadata:
  name: time-demo
  labels:
    app: time
spec:
  containers:
  - name: time-demo
    image: nginx
    ports:
    - containerPort: 80

原因

kubectl get pod time-demo -o yaml  --> '查询'

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值