目录贴:Kubernetes学习系列

  下面我们将主要介绍运行在Kubernetes集群中的容器所能够感知到的上下文环境,以及容器是如何获知这些信息的。

  首先,Kubernetes提供了一个能够让容器感知到集群中正在发生的事情的方法:环境变量。作为容器环境组成的一部分,这些集群信息对于容器构建“集群环境感知”起着非常重要的作用。其次,Kubernetes容器环境还包括一系列与容器生命周期相关的容器钩子,其对应的回调函数hook handler可以作为单个容器可选定义项的一部分。这个容器钩子与操作系统传统进程模型的通知回调机制有些类似。其实,还有一个与容器环境相关的重要部分是容器可用的文件系统。通过前面的讨论可知,在Kubernetes中,容器的文件系统由一个容器镜像和若干个Volume组成。

  下面我们将着重讨论暴露给容器的集群信息和用于向容器发布对其生命周期管理信息的容器钩子这两种同容器上下文环境协作的方法。

1、集群环境感知

  运行在Kubernetes集群中的一个容器在容器内部能够感知两种类型的环境变量信息,一种是与容器自身相关的信息,另一种是集群的信息。

1.1容器自身信息

  容器能够感知到的与容器自身相关的信息包括运行该容器的pod的名字、pod所在的namespace、在pod资源配置文件中env字段定义的键/值对,等等。其中,pod的名字被设置成容器的的主机名,而且可以在容器内通过所有访问主机名的方式获得,例如,hostname命令或JAVA中InetAddress.getLocalHost()函数调用。pod的名字和namespace还可以通过downwardAPI进行访问。对容器而言,用户在pod资源配置文件中自定义的环境变量的可访问性与在Docker镜像中指定的环境变量是一样的。downwardAPI示例如下:

  1. [root@k8s-master downwardapi]# cat test-downwardapi.yaml
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5. name: test-downwardaoi-volume
  6. labels:
  7. name: test-downwardaoi-volume
  8. zone: us-east
  9. cluster: test-cluster1
  10. annotations:
  11. build: two
  12. builder: zhenyuyaodidiao
  13. spec:
  14. containers:
  15. - name: test-hostpath
  16. image: registry:/back_demon:1.0
  17. volumeMounts:
  18. - name: podinfo
  19. mountPath: /home/laizy/podinfo
  20. readOnly: false
  21. command:
  22. - /run.sh
  23. volumes:
  24. - name: podinfo
  25. downwardAPI:
  26. items:
  27. - path: "pod_name"
  28. fieldRef:
  29. fieldPath: metadata.name
  30. - path: "pod_namespace"
  31. fieldRef:
  32. fieldPath: metadata.namespace
  33. - path: "pod_labels"
  34. fieldRef:
  35. fieldPath: metadata.labels
  36. - path: "pod_annotations"
  37. fieldRef:
  38. fieldPath: metadata.annotations
  39.  
  40. [root@k8s-master downwardapi]# kubectl create -f test-downwardapi.yaml
  41. pod "test-downwardaoi-volume" created
  42.  
  43. [root@k8s-master downwardapi]# kubectl exec -ti test-downwardaoi-volume /bin/bash
  44. [root@test-downwardaoi-volume /]# cd /home/laizy/podinfo/
  45. [root@test-downwardaoi-volume podinfo]# ls
  46. pod_annotations pod_labels pod_name pod_namespace
  47. [root@test-downwardaoi-volume podinfo]# cat pod_annotations
  48. build="two"
  49. builder="zhenyuyaodidiao"
  50. kubernetes.io/config.seen="2017-03-22T09:42:11.832955302+08:00"
  51. kubernetes.io/config.source="api"
  52. [root@test-downwardaoi-volume podinfo]# cat pod_labels
  53. cluster="test-cluster1"
  54. name="test-downwardaoi-volume"
  55. zone="us-east"
  56. [root@test-downwardaoi-volume podinfo]# cat pod_name
  57. test-downwardaoi-volume
  58. [root@test-downwardaoi-volume podinfo]# cat pod_name
  59. test-downwardaoi-volume
  60. [root@test-downwardaoi-volume podinfo]# cat pod_namespace
  61. default
  62. [root@test-downwardaoi-volume podinfo]# exit
  63. exit

1.2集群信息

  我们在前面已经讨论过Kubernetes服务发现的两种机制:DNS和环境变量。service环境变量属于集群信息,在容器创建时由Kubemetes集群API注人,在容器内以环境变量或域名的方式被访问。

2.容器钩子

  容器钩子是Kubemetes针对容器生命周期管理引入的事件处理机制,它负责监听Kubemetes对容器生命周期的管理信息,并将这些信息以广播的形式通知给容器。然后执行相应的回调函数。

2.1容器钩子类型

  Kubemetes支持两种类型的容器钩子,分别为PostStart和PreStop。

  PostStart。该钩子在容器被创建后立刻触发,通知容器它已经被创建。该钩子不需要向其所对应的hook handler传人任何参数。如果该钩子对应的hook handler执行失败,则该容器会被杀死,并根据该容器的重启策略决定是否要重启该容器。

  PreStop。该钩子在容器被删除前触发,其所对应的hook handler必须在删除该容器的请求发送给Docker daemon之前完成。在该钩子对应的hook handler完成后不论执行的结果如何,Docker daemon会发送一个SGTERN信号量给Docker daemon来删除该容器。同样地。该钩子也不需要传人任何参数

2.2hook handler执行

  当一个容器管理hook发生时,管理系统将会在容器中调用注册的hook handler。其中hook handler通过在包含该容器的pod资源配置文件的Lifecycle字段中定义来完成注册。注意,当hook handler在执行时,其他对该容器所在pod的管理动作将被阻塞除非该容器异常退出。而如果你自定义的hook handler阻塞时,其他对pod的管理操作包括容器健康检查将不会发生,直到hook handler继续执行完毕。因此,一般建议用户自定义的hook handler代码尽可能地轻量化,尽管确实有一些场景的hook handler需要长时间运行(例如在容器时退出保存运行状态等)。

2.3hook handler的执行方式

  hook handler是hook在容器内执行的回调函数,也即hook暴露给容器的方式。Kubemetes支持两种不同的hook handler类型,分别是Exec和HTTPGet。

    Exec。在容器的cgroup和namespace内启动一个新进程来执行指定的命令,由该命令消耗的资源全部要计人容器的消耗。正如在之前容器健康检查中提到的,如果Exec执行的命令最后在标准输出stdout的结果为0k,就代表handler执行成功,否则就被认为执行异常,并且Kuberlet将强制重新启动该容器。

    HTTPGet。向容器的指定接口发起一个HTTP请求作为handler的具体执行内容,并通过返回的HTTP状态码来判断该请求执行是否成功。

  综上,hook机制为用户提供了一种能够根据容器生命周期及其上下文的变化来触发不同操作的协作方法。这对于很多需要精细控制容器的场景是非常有用的,比如在容器结束前执行一些清理工作来保证其“优雅”退出。以下给出hook执行exec的示例:

  1. [root@k8s-master hook]# cat test-lifecycle-hostpath.yaml
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5. labels:
  6. name: test-lifecycle-hostpath
  7. role: master
  8. name: test-lifecycle-hostpath
  9. spec:
  10. containers:
  11. - name: test-lifecycle-hostpath
  12. image: registry:/back_demon:1.0
  13. lifecycle:
  14. postStart:
  15. exec:
  16. command:
  17. - "touch"
  18. - "/home/laizy/test/hostpath/post-start"
  19. preStop:
  20. exec:
  21. command:
  22. - "touch"
  23. - "/home/laizy/test/hostpath/pre-stop"
  24. volumeMounts:
  25. - name: testhost
  26. mountPath: /home/laizy/test/hostpath
  27. readOnly: false
  28. command:
  29. - /run.sh
  30. volumes:
  31. - name: testhost
  32. hostPath:
  33. path: /home/testhost
  34. [root@k8s-master hook]# date
  35. 2017 03 22 星期三 :: CST
  36. [root@k8s-master hook]# kubectl create -f test-lifecycle-hostpath.yaml
  37. pod "test-lifecycle-hostpath" created
  38. [root@k8s-master hook]# kubectl get pod -o wide
  39. NAME READY STATUS RESTARTS AGE IP NODE
  40. test-lifecycle-hostpath / Running 13s 10.0.9.3 k8s-node-
  41. [root@k8s-master hook]# date
  42. 2017 03 22 星期三 :: CST
  43. [root@k8s-master hook]# kubectl delete pod test-lifecycle-hostpath
  44. pod "test-lifecycle-hostpath" deleted

在node3上查看外挂出来的路径上,生成了两个文件,post-start文件是在pod创建之后生成的;pre-stop文件是在pod删除之前生成的。

  1. [root@k8s-node- ~]# ll /home/testhost/
  2. 总用量
  3. -rw-r--r--. root root 3 : post-start
  4. -rw-r--r--. root root 3 : pre-stop
  5. [root@k8s-node- ~]#

对应的httpGet示例简单示意如下:

  1. containers:
  2. - name: lifecycle
  3. image: busybox
  4. lifecycle:
  5. postStart:
  6. exec:
  7. command:
  8. - "touch"
  9. - "/var/log/lifecycle/post-start"
  10. preStop:
  11. httpGet:
  12. path: "/abort"
  13. port:

Kubernetes容器上下文环境的更多相关文章

  1. Kubernetes容器集群管理环境 - 完整部署(中篇)

    接着Kubernetes容器集群管理环境 - 完整部署(上篇)继续往下部署: 八.部署master节点master节点的kube-apiserver.kube-scheduler 和 kube-con ...

  2. Kubernetes容器集群管理环境 - 完整部署(上篇)

    Kubernetes(通常称为"K8S")是Google开源的容器集群管理系统.其设计目标是在主机集群之间提供一个能够自动化部署.可拓展.应用容器可运营的平台.Kubernetes ...

  3. Kubernetes容器集群管理环境 - 完整部署(下篇)

    在前一篇文章中详细介绍了Kubernetes容器集群管理环境 - 完整部署(中篇),这里继续记录下Kubernetes集群插件等部署过程: 十一.Kubernetes集群插件 插件是Kubernete ...

  4. kubernetes容器编排之定义环境变量以及通过downwardapi把pod信息作为环境变量传入容器内

    系列目录 在学习docker的时候,大家可能经常看到不少示例在docker run的时候指定环境变量(比如wordpress的docker示例就是通过环境变量传入账户和密码到容器内).这里之所以经常用 ...

  5. Kubernetes容器集群管理环境 - Prometheus监控篇

    一.Prometheus介绍之前已经详细介绍了Kubernetes集群部署篇,今天这里重点说下Kubernetes监控方案-Prometheus+Grafana.Prometheus(普罗米修斯)是一 ...

  6. 企业运维 | MySQL关系型数据库在Docker与Kubernetes容器环境中快速搭建部署主从实践

    [点击 关注「 WeiyiGeek」公众号 ] 设为「️ 星标」每天带你玩转网络安全运维.应用开发.物联网IOT学习! 希望各位看友[关注.点赞.评论.收藏.投币],助力每一个梦想. 本章目录 目录 ...

  7. 15分钟在笔记本上搭建 Kubernetes + Istio开发环境

    11月13~15日,KubeCon 上海大会召开,云原生是这个秋天最火热的技术.很多同学来问如何上手 Kubernetes和Istio 服务网格开发.本文将帮助你利用Docker CE桌面版,15分钟 ...

  8. Kubernetes 在生产环境中常用架构

    Kubernetes 在生产环境中常用架构 首先,我们来梳理下Kubernetes生产架构,其设计适用于绝大多数环境.如下图所示 在该架构中,我们可以将其分为四层,如下: Client层:即Kuber ...

  9. Docker Kubernetes 容器扩容与缩容

    Docker Kubernetes 容器扩容与缩容 环境: 系统:Centos 7.4 x64 Docker版本:18.09.0 Kubernetes版本:v1.8 管理节点:192.168.1.79 ...

随机推荐

  1. js 正则表达式验证网站域名

    正则表达式 ^[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9](?:\.[a-zA-Z]{2,})+$

  2. Spring源码导入IDEA

    导入Spring 4.3.8的源码,JDK的版本1.8以上:因为 1.下载Spring源码 方法一: (1)下载并安装GIt,下载地址:https://git-scm.com/download/win ...

  3. SQL server 在附加数据库后,数据库总是变成了只读

    1.  要把数据库文件的属性改了 右键点击两个文件的属性--安全--添加--立即查找--找everyone这个用户把他的权限都勾上 确定再附加就OK. 2. 在数据库管理器中对数据库点右键属性,然后切 ...

  4. Flask学习笔记(3)--路由

    0x01 参数传递 传递参数的语法是: /<参数名>/,然后在视图函数中,也要定义同名的参数. 参数的数据类型: 1.如果没有指定具体的数据类型,那么默认就是使用string 数据类型. ...

  5. 【腾讯云的1001种玩法】几种在腾讯云建立WordPress的方法(Linux)(二)

    版权声明:本文由张宁原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/126547001488207964 来源:腾云阁 ht ...

  6. ubuntu下apache新建虚拟主机

    最近发现在一个服务器上面布了一些项目,如果不用虚拟主机,用链接跳进去的话,有时候路径会出错,而自己在配置虚拟主机的时候又出现了一些问题,看似简单的东西,却花费了一上午,所以决定把简单的方法记下来,供和 ...

  7. 使用Bitsadmin 命令下载文件

    如果你碰到一个 Sa权限的注入点,你可以执行dos命令,但是你发现站库分离,数据库和web不在一个服务器上,而且悲剧的是数据库服务器又是个内网,这个时候你该怎么办? 这里就需要用到Bitsadmin来 ...

  8. Matplotlib学习

    决定通过一个个例子来实践并掌握Matplotlib.. 例子1. 画一个散点图,数据分布如下: import numpy as np import pandas as pd import matplo ...

  9. ERP项目实施记录10

    好久没有更新,因为进度一直拖着.已经实施了20个月了,很多东西没有开发出来.原因多方面的,虽然在此打算吐槽一下开发公司,但其实很大部分责任还是在我们自己. 不多说了,看图:

  10. python基础,if语句,while循环

    if语句: ①2选一                                              ④多选一 if:     条件                              ...