使用服务的外部IP作为部署的环境变量

时间:2018-10-05 15:19:27

标签: kubernetes

是否可以将服务的外部IP(NodePort或LoadBalancer)作为环境变量传递给其他服务的Deployment中的容器?

举一个具体的例子,考虑一个Kubernetes集群,该集群具有用于多个队友的名称空间,因此他们每个人都有自己的测试环境。在一个环境中,至少有两个服务:

  1. API网关服务,用于将流量路由到其他服务
  2. 可以将DNS条目注册到环境的服务

对于服务2,它需要知道服务1的外部IP地址。到目前为止,我只能找到使用kubectl来描述服务#1来查找此信息的示例。我希望可以做这样的事情:

apiVersion: v1
kind: Service
metadata:
  name: gateway
  namespace: "${ env }"
  labels:
    app: gateway
spec:
  type: LoadBalancer
  ports:
     - port: 8080
  selector:
    app: gateway

apiVersion: extensions/v1
kind: Deployment
metadata:
  name: svc2-deployment
  namespace: "${ env }"
  labels:
    app: svc2
spec:
  template:
    metadata:
      labels:
        app: svc2
    spec:
      containers:
        - name: app
          env:
            - name: GATEWAY_IP
              valueFrom:
                fieldRef:
                  fieldPath: service.gateway.----.ingressIp

而不是将initContainers与执行kubectl的脚本一起使用。尤其是因为我是Kubernetes的新手:)

2 个答案:

答案 0 :(得分:2)

并非如此,但是您可以使用DNS。例如:

apiVersion: extensions/v1
kind: Deployment
metadata:
  name: svc2-deployment
  namespace: "${ env }"
  labels:
    app: svc2
spec:
  template:
    metadata:
      labels:
        app: svc2
    spec:
      containers:
        - name: app
          env:
            - name: GATEWAY_IP
              value: gateway.<namespace-where-gw-is-running>.svc.cluster.local

答案 1 :(得分:2)

当前不是开箱即用的功能,但是您可以安装一些工具来获取该外部IP并将其放置在configmap中,例如Jenkins-X expose-controller。但是,我发现仅使用DNS并在描述符中参数化DNS名称会更容易。

如果您具有通配符DNS,则可以为每个服务指定一个专用的外部主机名,该域在service1.domain和service2.domain等域下。通配符DNS会将所有这些路由到您的入口控制器,然后可以路由到基于主机名的正确服务。 (正如Jenkins-X伙计所指出的,如果您没有nip.io之类的东西,则您的入口IP是route53的公用IP,则可以免费获得Willard DNS。)

我在activiti项目上的经验。我们发现,服务需要注入一个属性,该属性将密钥URL的外部URL告知他们,因为每个服务都包含密钥斗克代码以验证令牌是在有效的外部URL上发出的。您可以在the helm charts中看到结果,还有一个README there可以解释更多内容。我们从gitlab掌舵图中获得了灵感-他们的说明ask the user to put in a wildcard DNS,大概是出于类似的原因。