如何通过名称访问kubernetes中的服务ip?

时间:2018-03-20 21:18:36

标签: kubernetes

如果我有rabbitmq服务,请说明如下:

apiVersion: v1
kind: Service
metadata:
  name: my-rabbitmq
spec:
  ports:
  - port: 6379
  selector:
    app: my-rabbitmq

我还有另一个部署:

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: A-worker
spec:
  replicas: 1
  containers:
  - name: a-worker
    image: worker-image
    ports:
    - containerPort: 80
    env:
    - name: rabbitmq_url
      value: XXXXXXXXXXXXX

有没有办法在某种选择器的第二次部署中将service ip设置为环境变量?换句话说,在第二个部署yaml中应该转到value: XXXXXXXXXX。 (注意我知道我可以通过kubectl get services获取服务ip,但我想知道如何通过服务名称或标签来设置它。欢迎任何建议!

2 个答案:

答案 0 :(得分:1)

kubernetes将服务的主机,端口,协议等环境变量注入到pod容器中(参见this doc)。

kubectl exec <pod> printenv是检查设置了哪些env变量的一种方法。

如果在pod之后创建了服务,则env var可能不存在,因此终止pod(重新启动)是确保填充新环境变量的一种方法。

约定通常是大写<SERVICE_NAME>_SERVICE_HOST。 您可以使用以下语法在pod规范中显式设置它。

    - name: rabbitmq_url
      value: $(MY-RABBITMQ_SERVICE_HOST)

请记住,变量已经被k8s注入,这只是它的混叠。您可能希望更新应用程序层/脚本中的引用,以便为服务使用k8s注入的环境变量。

答案 1 :(得分:1)

在线之间阅读(我希望这会有所帮助):

K8s会在每个pod中自动为您创建服务环境变量。有关详细信息,请参阅https://kubernetes.io/docs/concepts/services-networking/service/#environment-variables

另一条路线是启用kube dns,在这种情况下,只需使用服务名即可联系服务IP。