【问题标题】:How to access the service ip in kubernetes by name?如何通过名称访问kubernetes中的服务ip?
【发布时间】:2018-08-29 20:39:24
【问题描述】:

如果我有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

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

【问题讨论】:

    标签: kubernetes


    【解决方案1】:

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

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

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

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

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

    请记住,变量已经被 k8s 注入了,这只是给它起别名。您可能需要更新应用层 /script 中的引用以使用 k8s 注入的服务环境变量。

    【讨论】:

    • 这太棒了!感谢您的回答。
    【解决方案2】:

    字里行间阅读(我希望这会有所帮助):

    K8s 会在每个 pod 中自动为您创建服务环境变量。详情请见https://kubernetes.io/docs/concepts/services-networking/service/#environment-variables

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

    【讨论】:

      猜你喜欢
      • 2021-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-12
      • 2015-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多