6.3.2 服务发现方式:环境变量

创建Pod资源时,kubelet会将其所属名称空间内的每个活动的Service对象以一系列环境变量的形式注入其中。它支持使用Kubernetes Service环境变量以及与Docker的links兼容的变量。

  1. kubernetes Service 环境变量

    Kubernetes为每个Service资源生成包括以下形式的环境变量在内的一系列环境变量,在同一名称空间中创建的Pod对象都会自动拥有这些变量。

    • {SVCNAME}_SERVICE_HOST
    • {SVCNAME}_SERVICE_PORT

      如果SVCNAME中使用了连接线,那么Kubernetes会在定义为环境变量时将其转换为下划线。

  2. Docker Link 形式的环境变量

    Docker使用--link选项实现容器连接时所设置的环境变量形式,具体使用方式请参考Docker的相关文档。在创建Pod对象时,Kubernetes也会将与此形式兼容的一系列环境变量注入Pod对象中。

    例如,在Service资源myapp-svc创建后创建的Pod对象中查看可用的环境变量,其中以MYAPP_SVC_SERVICE开头的表示Kubernetes Service环境变量,名称中不包含“SERVICE”字符串的环境变量为Docker Link形式的环境变量:

     **[terminal]
     **[delimiter / # ]**[command env | grep -i myapp]
     MYAPP_SVC_PORT_80_TCP_ADDR=10.98.57.156
     MYAPP_SVC_PORT_80_TCP_PORT=80
     HOSTNAME=myapp-deploy-5cbd66595b-2lhds
     MYAPP_SVC_PORT_80_TCP_PROTO=tcp
     MYAPP_SVC_PORT_80_TCP=tcp://10.98.57.156:80
     MYAPP_SVC_SERVICE_HOST=10.98.57.156
     MYAPP_SVC_SERVICE_PORT=80
     MYAPP_SVC_PORT=tcp://10.98.57.156:80
    

基于环境变量的服务发现其功能简单、易用,但存在一定的局限,例如,仅有那些与创建Pod对象在同一名称空间中且事先存在的Service对象的信息才会以环境变量的形式注入,那些处于非同一名称空间,或者是在Pod资源创建之后才创建的Service对象的相关环境变量则不会被添加。幸而,基于DNS的发现机制并不存在此类限制。

results matching ""

    No results matching ""