获取Kubernetes容器上下文环境
关注公众号 风色年代(itfantasycc) 300G微服务资料等你拿!
Kubernetes容器上下文环境
下面我们将主要介绍运行在Kubernetes集群中的容器所能够感知到的上下文环境,以及容器是如何获知这些信息的。
下面我们将着重讨论暴露给容器的集群信息和用于向容器发布对其生命周期管理信息的容器钩子这两种同容器上下文环境协作的方法。
1、集群环境感知
运行在Kubernetes集群中的一个容器在容器内部能够感知两种类型的环境变量信息,一种是与容器自身相关的信息,另一种是集群的信息。
1.1容器自身信息
[root@k8s-master downwardapi]# cat test-downwardapi.yaml apiVersion: v1 kind: Pod metadata:name: test-downwardaoi-volumelabels:name: test-downwardaoi-volumezone: us-eastcluster: test-cluster1annotations:build: twobuilder: zhenyuyaodidiao spec:containers:- name: test-hostpathimage: registry:5000/back_demon:1.0volumeMounts:- name: podinfomountPath: /home/laizy/podinforeadOnly: falsecommand:- /run.shvolumes:- name: podinfodownwardAPI:items:- path: "pod_name"fieldRef:fieldPath: metadata.name- path: "pod_namespace"fieldRef:fieldPath: metadata.namespace- path: "pod_labels"fieldRef:fieldPath: metadata.labels- path: "pod_annotations"fieldRef:fieldPath: metadata.annotations[root@k8s-master downwardapi]# kubectl create -f test-downwardapi.yaml pod "test-downwardaoi-volume" created[root@k8s-master downwardapi]# kubectl exec -ti test-downwardaoi-volume /bin/bash [root@test-downwardaoi-volume /]# cd /home/laizy/podinfo/ [root@test-downwardaoi-volume podinfo]# ls pod_annotations pod_labels pod_name pod_namespace [root@test-downwardaoi-volume podinfo]# cat pod_annotations build="two" builder="zhenyuyaodidiao" kubernetes.io/config.seen="2017-03-22T09:42:11.832955302+08:00" kubernetes.io/config.source="api" [root@test-downwardaoi-volume podinfo]# cat pod_labels cluster="test-cluster1" name="test-downwardaoi-volume" zone="us-east" [root@test-downwardaoi-volume podinfo]# cat pod_name test-downwardaoi-volume [root@test-downwardaoi-volume podinfo]# cat pod_name test-downwardaoi-volume [root@test-downwardaoi-volume podinfo]# cat pod_namespace default [root@test-downwardaoi-volume podinfo]# exit exit
1.2集群信息
我们在前面已经讨论过Kubernetes服务发现的两种机制:DNS和环境变量。service环境变量属于集群信息,在容器创建时由Kubemetes集群API注人,在容器内以环境变量或域名的方式被访问。
2.容器钩子
容器钩子是Kubemetes针对容器生命周期管理引入的事件处理机制,它负责监听Kubemetes对容器生命周期的管理信息,并将这些信息以广播的形式通知给容器。然后执行相应的回调函数。
2.1容器钩子类型
Kubemetes支持两种类型的容器钩子,分别为PostStart和PreStop。
2.2hook handler执行
2.3hook handler的执行方式
hook handler是hook在容器内执行的回调函数,也即hook暴露给容器的方式。Kubemetes支持两种不同的hook handler类型,分别是Exec和HTTPGet。
HTTPGet。向容器的指定接口发起一个HTTP请求作为handler的具体执行内容,并通过返回的HTTP状态码来判断该请求执行是否成功。
[root@k8s-master hook]# cat test-lifecycle-hostpath.yaml apiVersion: v1 kind: Pod metadata:labels:name: test-lifecycle-hostpathrole: mastername: test-lifecycle-hostpath spec:containers:- name: test-lifecycle-hostpathimage: registry:5000/back_demon:1.0lifecycle:postStart:exec:command:- "touch"- "/home/laizy/test/hostpath/post-start"preStop:exec:command:- "touch"- "/home/laizy/test/hostpath/pre-stop"volumeMounts:- name: testhostmountPath: /home/laizy/test/hostpathreadOnly: falsecommand:- /run.shvolumes:- name: testhosthostPath:path: /home/testhost [root@k8s-master hook]# date 2017年 03月 22日 星期三 10:21:58 CST [root@k8s-master hook]# kubectl create -f test-lifecycle-hostpath.yaml pod "test-lifecycle-hostpath" created [root@k8s-master hook]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE test-lifecycle-hostpath 1/1 Running 0 13s 10.0.9.3 k8s-node-3 [root@k8s-master hook]# date 2017年 03月 22日 星期三 10:22:52 CST [root@k8s-master hook]# kubectl delete pod test-lifecycle-hostpath pod "test-lifecycle-hostpath" deleted
在node3上查看外挂出来的路径上,生成了两个文件,post-start文件是在pod创建之后生成的;pre-stop文件是在pod删除之前生成的。
[root@k8s-node-3 ~]# ll /home/testhost/ 总用量 0 -rw-r--r--. 1 root root 0 3月 22 10:22 post-start -rw-r--r--. 1 root root 0 3月 22 10:23 pre-stop [root@k8s-node-3 ~]#
containers:- name: lifecycleimage: busyboxlifecycle:postStart:exec:command:- "touch"- "/var/log/lifecycle/post-start"preStop:httpGet:path: "/abort"port: 8080
kubernetes 容器内获取Pod信息(包括:宿主主机IP)
kubernetes 容器内获取Pod信息(包括:宿主主机IP)_kozazyh的专栏-CSDN博客_k8s获取pod信息
kubernetes 自从1.7开始,可以在pod 的container 内获取pod的spec,metadata 等信息。
env:- name: MY_NODE_NAMEvalueFrom:fieldRef:fieldPath: spec.nodeName- name: MY_POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: MY_POD_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespace- name: MY_POD_IPvalueFrom:fieldRef:fieldPath: status.podIP- name: MY_POD_SERVICE_ACCOUNTvalueFrom:fieldRef:fieldPath: spec.serviceAccountName
spec.nodeName : pod所在节点的IP、宿主主机IP
metadata.namespace : pod 所在的namespace
https://github.com/kubernetes/kubernetes/issues/24657
kubernetes 通过环境变量暴露POD的信息给容器
kubernetes 通过环境变量暴露POD的信息给容器_纵横四海的博客-CSDN博客
有时候,容器需要获取pod的信息时,就可以通过设置环境保护来实现
例子
1.使用POD 的字段的值作为环境变量的值
apiVersion: v1
kind: Pod
metadata:name: dapi-envars-fieldref
spec:containers:- name: test-containerimage: k8s.gcr.io/busyboxcommand: [ "sh", "-c"]args:- while true; doecho -en '\n';printenv MY_NODE_NAME MY_POD_NAME MY_POD_NAMESPACE;//对应下面的环境变量的值printenv MY_POD_IP MY_POD_SERVICE_ACCOUNT;sleep 10;done;env:- name: MY_NODE_NAMEvalueFrom:fieldRef:fieldPath: spec.nodeName- name: MY_POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: MY_POD_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespace- name: MY_POD_IPvalueFrom:fieldRef:fieldPath: status.podIP- name: MY_POD_SERVICE_ACCOUNTvalueFrom:fieldRef:fieldPath: spec.serviceAccountNamerestartPolicy: Never
apiVersion: v1
kind: Pod
metadata:name: dapi-envars-resourcefieldref
spec:containers:- name: test-containerimage: k8s.gcr.io/busybox:1.24command: [ "sh", "-c"]args:- while true; doecho -en '\n';printenv MY_CPU_REQUEST MY_CPU_LIMIT;printenv MY_MEM_REQUEST MY_MEM_LIMIT;sleep 10;done;resources:requests:memory: "32Mi"cpu: "125m"limits:memory: "64Mi"cpu: "250m"env:- name: MY_CPU_REQUESTvalueFrom:resourceFieldRef:containerName: test-containerresource: requests.cpu- name: MY_CPU_LIMITvalueFrom:resourceFieldRef:containerName: test-containerresource: limits.cpu- name: MY_MEM_REQUESTvalueFrom:resourceFieldRef:containerName: test-containerresource: requests.memory- name: MY_MEM_LIMITvalueFrom:resourceFieldRef:containerName: test-containerresource: limits.memoryrestartPolicy: Never
参考:
environment-variable-expose-pod-information
Kubernetes 配置Pod和容器(十五) 通过环境变量公开Pod信息到容器
Kubernetes 配置Pod和容器(十五) 通过环境变量公开Pod信息到容器 - 简书
这个章节展示了如何使用环境变量公开pod的信息到它自己运行的容器里面。环境变量可以公开Pod字段和容器字段。
有两种方式用来公开Pod和容器字段给运行的容器:环境变量和DownwardAPIVolumeFiles。
使用Pod字段作为环境变量的值
在本次实验,创建包含一个容器的Pod。下面是这个Pod的配置文件:
apiVersion: v1
kind: Pod
metadata:name: dapi-envars-fieldref
spec:containers:- name: test-containerimage: gcr.io/google_containers/busyboxcommand: [ "sh", "-c"]args:- while true; doecho -en '\n';printenv MY_NODE_NAME MY_POD_NAME MY_POD_NAMESPACE;printenv MY_POD_IP MY_POD_SERVICE_ACCOUNT;sleep 10;done;env:- name: MY_NODE_NAMEvalueFrom:fieldRef:fieldPath: spec.nodeName- name: MY_POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: MY_POD_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespace- name: MY_POD_IPvalueFrom:fieldRef:fieldPath: status.podIP- name: MY_POD_SERVICE_ACCOUNTvalueFrom:fieldRef:fieldPath: spec.serviceAccountNamerestartPolicy: Never
注意:这些例子里面的字段是pod的字段。不是运行在pod里面的容器的字段。
kubectl create -f test.yaml
kubectl get pods
kubectl logs dapi-envars-fieldref
minikube
dapi-envars-fieldref
default
172.17.0.4
default
为何在日志里面是这些值,可以看配置文件的command和args。当容器启动的时候,把这个五个环境变量的值写入的标准输出里面。每十秒钟重复一次。
kubectl exec -it dapi-envars-fieldref -- sh
/# printenv
MY_POD_SERVICE_ACCOUNT=default
...
MY_POD_NAMESPACE=default
MY_POD_IP=172.17.0.4
...
MY_NODE_NAME=minikube
...
MY_POD_NAME=dapi-envars-fieldref
使用容器字段作为环境变量的值
在上面的实验,使用pod字段作为环境变量的值。在下一个实验,可以使用容器字段作为环境变量的值。下面是Pod的配置文件:
apiVersion: v1
kind: Pod
metadata:name: dapi-envars-resourcefieldref
spec:containers:- name: test-containerimage: gcr.io/google_containers/busybox:1.24command: [ "sh", "-c"]args:- while true; doecho -en '\n';printenv MY_CPU_REQUEST MY_CPU_LIMIT;printenv MY_MEM_REQUEST MY_MEM_LIMIT;sleep 10;done;resources:requests:memory: "32Mi"cpu: "125m"limits:memory: "64Mi"cpu: "250m"env:- name: MY_CPU_REQUESTvalueFrom:resourceFieldRef:containerName: test-containerresource: requests.cpu- name: MY_CPU_LIMITvalueFrom:resourceFieldRef:containerName: test-containerresource: limits.cpu- name: MY_MEM_REQUESTvalueFrom:resourceFieldRef:containerName: test-containerresource: requests.memory- name: MY_MEM_LIMITvalueFrom:resourceFieldRef:containerName: test-containerresource: limits.memoryrestartPolicy: Never
kubectl create -f test.yaml
kubectl get pods
kubectl logs dapi-envars-resourcefieldref
关注公众号 风色年代(itfantasycc) 300G微服务资料等你拿!
1
1
33554432
67108864
获取Kubernetes容器上下文环境相关推荐
- Kubernetes容器上下文环境
目录贴:Kubernetes学习系列 下面我们将主要介绍运行在Kubernetes集群中的容器所能够感知到的上下文环境,以及容器是如何获知这些信息的. 首先,Kubernetes提供了一个能够让容器感 ...
- 解决在非spring上下文的环境中无法获取Spring容器的bean【nullpointer:connot invoke because xxx is null问题】
文章目录 1.背景: 2.原代码: 非spring环境中获取bean 1.背景: 项目在nio监听端口的事件中需要在接收到客户端数据以后把数据封装然后调用service层间接访问数据库插入数据,调试了 ...
- 轻量级Kubernetes之k3s:2:使用docker作为容器运行环境
缺省安装的k3s使用的是containerd作为容器运行环境,如果希望使用Docker作为容器运行环境,只需要在安装时通过环境变量INSTALL_K3S_EXEC指定--docker即可.这篇文章具体 ...
- Spring Boot中普通类获取Spring容器中的Bean
我们知道如果我们要在一个类使用spring提供的bean对象,我们需要把这个类注入到spring容器中,交给spring容器进行管理,但是在实际当中,我们往往会碰到在一个普通的Java类中,自己动手n ...
- Spring Cloud Kubernetes容器化实践
随着公司业务量和产品线的增加,项目越来越多,普通运维系统架构对整个软件研发生命周期的管理越来越难,效率低下,难以统一管理.近年来Docker统一了容器标准,对于软件开发流程产生了深远的影响,Docke ...
- 开课吧课堂:Kubernetes集群环境常见问题解决
本文主要分享了k8s集群环境下,镜像不能自动拉取.容器执行错误.镜像导入导出.集群崩溃常见问题解决. 1.Kubernetes集群环境下各个node镜像不能自动拉取 一般情况下遇到这种情况下,比较笨的 ...
- Kubeadm介绍与使用Kubeadm搭建kubernetes集群环境
文章目录 1.Kubeadm介绍 2.使用Kubeamd搭建kubernetes集群环境 2.1.首先准备一个三台的centos机器 2.2.yum -y update [在三台机器上执行更新包] 2 ...
- kubernetes集群环境搭建(kubeadm方式)
1. kubernetes简介 kubernetes,是一个全新的基于容器技术的分布式架构领先方案,是谷歌严格保密十几年的秘密武器----Borg系统的一个开源版本,于2014年9月发布第一个版本,2 ...
- SpringUtil获取Spring容器对象
**自己公司使用的简单的SpringUtil,可以使用直接从Spring容器中获取对象.比较方便. 主要就是实现ApplicationContextAware ,学过Spring的都知道,Spring ...
最新文章
- 深度学习(4)基础4 -- 神经网络架构激活函数过拟合处理
- iOS 查询数组中的对象
- 慢动作输出Linux命令结果并用彩色显示
- WPF之命名空间和资源
- 挖矿病毒解决实例(隐藏进程,文章较好)(入侵)
- 关于CSS预处理器(less,sass)
- 1199: [HNOI2005]汤姆的游戏 - BZOJ
- 2010年“最具全球竞争力中国公司20强”榜单:
- 揭秘!女程序员为啥更赚钱?这4个大招,用Python做副业躺赚
- php excel 高度,PHPExcel,自动调整行高
- JavaScript操作canvas制作前端H5小游戏——Flappy Bird
- 多多成稿作品网www.no1paper.cn测评
- 如何设置本电脑中的mysql让别人的电脑连接
- Golang蓝湖一面
- 西湖大学自然语言处理(七)—— 解决OOV问题的两种平滑技术
- 如何发布一个本地网站
- Java加密与解密笔记(四) 高级应用
- window正版验证的秘密
- 《激励-理论篇》课程笔记
- zotero 设置 双击打开pdf 外边
热门文章
- SpringBoot:Mybatis + Druid 数据访问
- 797. 差分(有图解)
- Angular使用ng build打包报错 Property 'setControl' does not exist on type 'AbstractControl'.解决方法
- Ubuntu之安装摄像头软件GTK_UVC_Viewer
- matlab 创建批量文件夹_学会这12个批量操作,从此告别加班!
- 循环队列 - 顺序存储结构
- BZOJ 4037 [HAOI2015]数字串拆分 ——动态规划
- PHP中COOKIE即时生效,php实现cookie即时生效
- java 1.5 代替for循环_J2EE 1.5 提供的另一种形式的for循环
- java set 接口_java笔记四:Set接口