【问题标题】:From where appeared these variables in my kubernetes container?这些变量从哪里出现在我的 kubernetes 容器中?
【发布时间】:2019-08-08 13:37:15
【问题描述】:

我正在部署简单的 hello-world 微服务,它侦听由以下变量给出的端口:

PORT = os.environ.get("TEST_SERVICE_PORT", "").strip() or "50001"

我部署它时没有在容器上配置任何变量,并希望它在默认的 50001 端口上提供服务,但得到了错误

socket.gaierror: [Errno -8] Servname not supported for ai_socktype

当我登录容器查看环境时,我发现环境中充满了不同的变量(其中一些属于其他服务),并且TEST_SERVICE_PORT变量存在并且绝对不包含端口:

root@test-service-697464787c-xpd6k:/opt/app/src# env | grep TEST
TEST_SERVICE_PORT_7002_TCP_ADDR=10.145.23.43
TEST_SERVICE_SERVICE_PORT_GRPC_API=7002
TEST_SERVICE_PORT_7002_TCP_PORT=7002
TEST_SERVICE_PORT=tcp://10.145.23.43:7002
TEST_SERVICE_SERVICE_HOST=10.145.23.43
TEST_SERVICE_PORT_7002_TCP=tcp://10.145.23.43:7002
TEST_SERVICE_PORT_7002_TCP_PROTO=tcp
TEST_SERVICE_SERVICE_PORT=7002

我有以下问题,但无法在文档中找到答案:

是什么造成了这些变量?我可以以某种方式将容器与它们隔离开来吗?还是它们是由 kubernetes 故意设置的,并且用于某些我不知道的目的?我应该如何命名我的配置变量以避免命名冲突?我应该使用该变量而不是使用服务名称作为主机名吗?

following documentation,但它只解释变量TEST_SERVICE_SERVICE_PORTTEST_SERVICE_SERVICE_HOSTTEST_SERVICE_PORT 和其他人是什么意思呢?什么增加了TEST_SERVICE_SERVICE_PORT_GRPC_API

我正在使用的集群上还安装了 Istio 和 Ambassador 网关。

【问题讨论】:

  • 也请分享您的 yaml 部署文件。这样会更容易找出问题所在?
  • @Alberto 谢谢,但这仅回答了我第一个问题的 25%。我应该以不同的方式命名服务吗?或者对环境变量使用不同的前缀?或者在部署中重新定义容器配置中的变量?
  • @Bunyk 请与我们分享您的部署文件。
  • @abielak 共享

标签: kubernetes environment-variables 12factor


【解决方案1】:

问:是什么造成了这个变量?

   Adiscovery-service(更多在最后)

问:我能否以某种方式将容器与它们隔离开来?

   A:如果你想禁用它,你可以在你的PodSpec上设置enableServiceLinks: false

问:或者它们是 kubernetes 故意设置的,并且用于某些我不知道的目的?

   A:不,它们只是用来提供 DNS 和名称以外的选项,kubernetes 不使用它们

问:我应该如何命名我的配置变量以避免命名冲突?

   A:要么使用enableServiceLinks: false,要么使用与文档中描述的模式不冲突的命名模式,通常当我需要做类似你的事情时,我更喜欢使用_SVC_PORT

问:我应该使用该变量而不是使用服务名称作为主机名吗?

   A:来自文档:“您可以(并且几乎总是应该)为您的 Kubernetes 集群设置 DNS 服务”,

问:有以下文档,但它只解释变量 TEST_SERVICE_SERVICE_PORT 和 TEST_SERVICE_SERVICE_HOST。那么 TEST_SERVICE_PORT 和其他是什么意思呢?什么增加了 TEST_SERVICE_SERVICE_PORT_GRPC_API?

   A:您有一个名为grpc-api 的命名端口,在这种情况下,它使用的是命名协议+端口号。注意:我在文档上找不到任何参考资料,所以我深入研究了code


来自文档discovery-service

当 Pod 在 Node 上运行时,kubelet 会添加一组环境 每个活动服务的变量。 ...更简单的 {SVCNAME}_SERVICE_HOST 和 {SVCNAME}_SERVICE_PORT 变量,其中服务名称是 大写和破折号被转换为下划线...

例如, 服务“redis-master”暴露 TCP 端口 6379 并已 分配的集群 IP 地址 10.0.0.11,产生以下 环境变量:

REDIS_MASTER_SERVICE_PORT=6379 REDIS_MASTER_PORT=tcp://10.0.0.11:6379
REDIS_MASTER_PORT_6379_TCP=tcp://10.0.0.11:6379
REDIS_MASTER_PORT_6379_TCP_PROTO=tcp
REDIS_MASTER_PORT_6379_TCP_PORT=6379
REDIS_MASTER_PORT_6379_TCP_ADDR=10.0.0.11 

来自 k8s api PodSpec/EnableServiceLinks:

EnableServiceLinks 指示是否应将有关服务的信息注入到 pod 的环境变量中,与 Docker 链接的语法相匹配。可选:默认为 true。

【讨论】:

    【解决方案2】:

    这些环境变量有助于服务发现。您可以通过设置禁用它们

    $ kubectl explain deployment.spec.template.spec.enableServiceLinks
    KIND:     Deployment
    VERSION:  extensions/v1beta1
    
    FIELD:    enableServiceLinks <boolean>
    
    DESCRIPTION:
         EnableServiceLinks indicates whether information about services should be
         injected into pod's environment variables, matching the syntax of Docker
         links. Optional: Defaults to true.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-06-17
      • 2019-04-09
      • 1970-01-01
      • 2013-09-04
      • 1970-01-01
      • 1970-01-01
      • 2022-12-22
      相关资源
      最近更新 更多