理解了Dowanward API的妙用,轻松拿捏kubernetes环境变量

引言

前两天,公司有个新同事愁眉苦脸,看起来心事重重,我去问他怎么回事,原来是有个需求犯了难:一次部署起四个pod,每个pod名称还不一样,怎么判断是哪个pod产生的日志呢?听到这,我微微一笑,给他讲解了Dowanward API的妙用,他一听,紧缩的眉头缓缓舒展开来,眼看着他将日志名称写成$MY_POD_NAME.log,我轻轻点头表示满意。答应的周末请客吃饭把我也乐了。今天就将Dowanward API的功能介绍给大家。

总体思路

通过配置环境变量或者挂载Dowanward API卷的形式来暴露pod的元数据,使pod能够获得相应的信息。

环境准备

  1. 准备三台服务器搭建kubernetes集群。
alt
节点名称IP
k8s-master172.31.0.2
k8s-worker1172.31.0.3
k8s-worker2172.31.0.4
[root@k8s-master ~]# kubectl get nodes
NAME          STATUS   ROLES                  AGE    VERSION
k8s-master    Ready    control-plane,master   5d4h   v1.20.9
k8s-worker1   Ready    <none>                 5d4h   v1.20.9
k8s-worker2   Ready    <none>                 5d4h   v1.20.9
[root@k8s-master ~]# 
  1. 准备yaml来部署应用。
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deploy
  namespace: default
  labels:
    app: nginx-deploy
spec:
  selector:
    matchLabels:
      app: nginx-deploy
  replicas: 4
  template:
    metadata:
      labels:
        app: nginx-deploy
    spec:
      containers:
        - name: mynginx
          image: nginx
          imagePullPolicy: IfNotPresent
          command: [ "/bin/bash", "-ce", "tail -f /dev/null" ]

测试

通过上面deployment.yaml部署的应用是不能获取到pod名称的,但是使用Dowanward API就可以轻松搞定。有两种方式供大家参考。

一、配置环境变量

将上面的yaml进行改造。

# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deploy
  namespace: default
  labels:
    app: nginx-deploy
spec:
  selector:
    matchLabels:
      app: nginx-deploy
  replicas: 4
  template:
    metadata:
      labels:
        app: nginx-deploy
    spec:
      containers:
        - name: mynginx
          image: nginx
          imagePullPolicy: IfNotPresent
          command: [ "/bin/bash", "-ce", "tail -f /dev/null" ]
          env:
            - name: MY_POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            - name: MY_POD_IP
              valueFrom:
                fieldRef:
                  fieldPath: status.podIP
            - name: HOST_IP
              valueFrom:
                fieldRef:
                  fieldPath: status.hostIP
            - name: LIMITS_MEMORY
              valueFrom:
                resourceFieldRef:
                  resource: limits.memory

我们添加了环境变量env,分别取pod名称和ip。

[root@k8s-master test]# kubectl apply -f deployment.yaml 
deployment.apps/nginx-deploy created
[root@k8s-master test]# kubectl get pod
NAME                            READY   STATUS    RESTARTS   AGE
nginx-deploy-6f4c989cff-2mcm5   1/1     Running   0          55s
nginx-deploy-6f4c989cff-mjx9n   1/1     Running   0          55s
nginx-deploy-6f4c989cff-vhncx   1/1     Running   0          56s
nginx-deploy-6f4c989cff-wtjzd   1/1     Running   0          57s
[root@k8s-master test]# 

通过改造的yaml成功部署了4个pod,我们进入到容器内部一探究竟。

[root@k8s-master test]# kubectl exec -it nginx-deploy-6f4c989cff-2mcm5 -c mynginx -- /bin/bash
root@nginx-deploy-6f4c989cff-2mcm5:/# echo $MY_POD_NAME
nginx-deploy-6f4c989cff-2mcm5
root@nginx-deploy-6f4c989cff-2mcm5:/# echo $MY_POD_IP
192.168.126.42
root@nginx-deploy-6f4c989cff-2mcm5:/# echo $HOST_IP
172.31.0.4
root@nginx-deploy-6f4c989cff-2mcm5:/#

成功获取到了pod名称和ip,而且宿主机的ip也能获取到,在编写代码的时候就可以使用$MY_POD_NAME来获取到相应的值了,非常灵活方便。

二、挂载Dowanward API卷

还是将我们初始的deployment.yaml进行改造。

# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deploy
  namespace: default
  labels:
    app: nginx-deploy
spec:
  selector:
    matchLabels:
      app: nginx-deploy
  replicas: 4
  template:
    metadata:
      labels:
        app: nginx-deploy
    spec:
      containers:
      - image: nginx
        imagePullPolicy: IfNotPresent
        command: [ "/bin/bash", "-ce", "tail -f /dev/null" ]
        name: mynginx
        volumeMounts:
        - name: podinfo
          mountPath: /etc/podinfo
          readOnly: false
      volumes:
        - name: podinfo
          downwardAPI:
            items:
            - path: name
              fieldRef:
                fieldPath: metadata.name
            - path: namespace
              fieldRef:
                fieldPath: metadata.namespace
[root@k8s-master test]# kubectl apply -f deployment.yaml 
deployment.apps/nginx-deploy configured
[root@k8s-master test]# kubectl get pod
NAME                           READY   STATUS    RESTARTS   AGE
nginx-deploy-d5fc6886d-c7fvh   1/1     Running   0          4m8s
nginx-deploy-d5fc6886d-wgzvs   1/1     Running   0          4m6s
nginx-deploy-d5fc6886d-xc699   1/1     Running   0          4m6s
nginx-deploy-d5fc6886d-xvgj7   1/1     Running   0          4m8s
[root@k8s-master test]#

同样创建了4个pod,我们进入到容器内部。

[root@k8s-master test]# kubectl exec -it nginx-deploy-d5fc6886d-c7fvh -c mynginx -- /bin/bash
root@nginx-deploy-d5fc6886d-c7fvh:/# cd /etc/podinfo/
root@nginx-deploy-d5fc6886d-c7fvh:/etc/podinfo# ls
name  namespace
root@nginx-deploy-d5fc6886d-c7fvh:/etc/podinfo# cat name
nginx-deploy-d5fc6886d-c7fvh
root@nginx-deploy-d5fc6886d-c7fvh:/etc/podinfo# cat namespace 
default
root@nginx-deploy-d5fc6886d-c7fvh:/etc/podinfo# 

同样获取到了pod名称,但是这种方式不是环境变量,我们在编写代码时使用到的话需要做一些处理。

推荐使用配置环境变量的形式

梳理总结

Dowanward API常用的字段如下:

  1. 使用fieldRef可以声明使用的字段:
姓名年龄
spec.nodeName宿主机名称
status.hostIP宿主机IP
metadata.namePod的名称
metadata.namespacePod所属的Namespace
status.podIPPod的IP
spec.serviceAccountNamePod的Service Account的名称
metadata.uidPod的UID
metadata.labels['<KEY>']指定<KEY>的Label值
metadata.annotations['<KEY>']指定<KEY>的Annotation值
metadata.labelsPod的所有Label
metadata.annotationsPod的所有Annotation
  1. 使用resourceFieldRef可以声明使用的字段:
姓名年龄
limits.cpu容器的CPU limit
requests.cpu容器的CPU request
limits.memory容器的memory limit
requests.memory容器的memory request

本文由 mdnice 多平台发布

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

傻啦猫@_@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值