网站建设相关的网站,互联网推广运营是干什么的,怎么开设自己的网站,冲浪网站优化网作者 | 江小南来源 | 江小南和他的小伙伴们引言前两天#xff0c;公司有个新同事愁眉苦脸#xff0c;看起来心事重重#xff0c;我去问他怎么回事#xff0c;原来是有个需求犯了难#xff1a;一次部署起四个pod#xff0c;每个pod名称还不一样#xff0c;怎么判断是哪个… 作者 | 江小南来源 | 江小南和他的小伙伴们引言前两天公司有个新同事愁眉苦脸看起来心事重重我去问他怎么回事原来是有个需求犯了难一次部署起四个pod每个pod名称还不一样怎么判断是哪个pod产生的日志呢听到这我微微一笑给他讲解了Dowanward API的妙用他一听紧缩的眉头缓缓舒展开来眼看着他将日志名称写成$MY_POD_NAME.log我轻轻点头表示满意。答应的周末请客吃饭把我也乐了。今天就将Dowanward API的功能介绍给大家。总体思路通过配置环境变量或者挂载Dowanward API卷的形式来暴露pod的元数据使pod能够获得相应的信息。环境准备准备三台服务器搭建kubernetes集群。节点名称IPk8s-master172.31.0.2k8s-worker1172.31.0.3k8s-worker2172.31.0.4[rootk8s-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
[rootk8s-master ~]#准备yaml来部署应用。# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploynamespace: defaultlabels:app: nginx-deploy
spec:selector:matchLabels:app: nginx-deployreplicas: 4template:metadata:labels:app: nginx-deployspec:containers:- name: mynginximage: nginximagePullPolicy: IfNotPresentcommand: [ /bin/bash, -ce, tail -f /dev/null ]测试通过上面deployment.yaml部署的应用是不能获取到pod名称的但是使用Dowanward API就可以轻松搞定。有两种方式供大家参考。一、配置环境变量将上面的yaml进行改造。# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploynamespace: defaultlabels:app: nginx-deploy
spec:selector:matchLabels:app: nginx-deployreplicas: 4template:metadata:labels:app: nginx-deployspec:containers:- name: mynginximage: nginximagePullPolicy: IfNotPresentcommand: [ /bin/bash, -ce, tail -f /dev/null ]env:- name: MY_POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: MY_POD_IPvalueFrom:fieldRef:fieldPath: status.podIP- name: HOST_IPvalueFrom:fieldRef:fieldPath: status.hostIP- name: LIMITS_MEMORYvalueFrom:resourceFieldRef:resource: limits.memory我们添加了环境变量env分别取pod名称和ip。[rootk8s-master test]# kubectl apply -f deployment.yaml
deployment.apps/nginx-deploy created
[rootk8s-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
[rootk8s-master test]#通过改造的yaml成功部署了4个pod进入到容器内部一探究竟。[rootk8s-master test]# kubectl exec -it nginx-deploy-6f4c989cff-2mcm5 -c mynginx -- /bin/bash
rootnginx-deploy-6f4c989cff-2mcm5:/# echo $MY_POD_NAME
nginx-deploy-6f4c989cff-2mcm5
rootnginx-deploy-6f4c989cff-2mcm5:/# echo $MY_POD_IP
192.168.126.42
rootnginx-deploy-6f4c989cff-2mcm5:/# echo $HOST_IP
172.31.0.4
rootnginx-deploy-6f4c989cff-2mcm5:/#成功获取到了pod名称和ip而且宿主机的ip也能获取到在编写代码的时候就可以使用$MY_POD_NAME来获取到相应的值了非常灵活方便。二、挂载Dowanward API卷还是将我们初始的deployment.yaml进行改造。# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploynamespace: defaultlabels:app: nginx-deploy
spec:selector:matchLabels:app: nginx-deployreplicas: 4template:metadata:labels:app: nginx-deployspec:containers:- image: nginximagePullPolicy: IfNotPresentcommand: [ /bin/bash, -ce, tail -f /dev/null ]name: mynginxvolumeMounts:- name: podinfomountPath: /etc/podinforeadOnly: falsevolumes:- name: podinfodownwardAPI:items:- path: namefieldRef:fieldPath: metadata.name- path: namespacefieldRef:fieldPath: metadata.namespace[rootk8s-master test]# kubectl apply -f deployment.yaml
deployment.apps/nginx-deploy configured
[rootk8s-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
[rootk8s-master test]#同样创建了4个pod我们进入到容器内部。[rootk8s-master test]# kubectl exec -it nginx-deploy-d5fc6886d-c7fvh -c mynginx -- /bin/bash
rootnginx-deploy-d5fc6886d-c7fvh:/# cd /etc/podinfo/
rootnginx-deploy-d5fc6886d-c7fvh:/etc/podinfo# ls
name namespace
rootnginx-deploy-d5fc6886d-c7fvh:/etc/podinfo# cat name
nginx-deploy-d5fc6886d-c7fvh
rootnginx-deploy-d5fc6886d-c7fvh:/etc/podinfo# cat namespace
default
rootnginx-deploy-d5fc6886d-c7fvh:/etc/podinfo#同样获取到了pod名称但是这种方式不是环境变量在编写代码时使用到的话需要做一些处理。推荐使用配置环境变量的形式。梳理总结Dowanward API常用的字段如下使用fieldRef可以声明使用的字段字段含义spec.nodeName宿主机名称status.hostIP宿主机IPmetadata.namePod的名称metadata.namespacePod所属的Namespacestatus.podIPPod的IPspec.serviceAccountNamePod的Service Account的名称metadata.uidPod的UIDmetadata.labels[KEY]指定KEY的Label值metadata.annotations[KEY]指定KEY的Annotation值metadata.labelsPod的所有Labelmetadata.annotationsPod的所有Annotation使用resourceFieldRef可以声明使用的字段字段含义limits.cpu容器的CPU limitrequests.cpu容器的CPU requestlimits.memory容器的memory limitrequests.memory容器的memory request往期推荐Docker 那些事儿如何安全地停止、删除容器使用 nginx 轻松管理 kubernetes 资源文件Redis 内存满了怎么办这样置才正确实战 Kubectl 创建 Deployment 部署应用点分享点收藏点点赞点在看