根据Kubernetes中的服务设置环境变量

时间:2019-04-05 12:38:09

标签: kubernetes google-kubernetes-engine

我正在Kubernetes中基于api和Web界面运行一个简单的应用程序。但是,我似乎无法获得与Web界面对话的API。在我的本地环境中,我只需在Web界面中使用例如定义变量API_URL。 localhost:5001,并且Web界面正确连接到api。由于api和web在不同的Pod中运行,因此我需要使它们通过Kubernetes中的服务彼此交谈。到目前为止,这是我正在做的事情,但是没有任何运气。

我为API设置了部署

apiVersion: apps/v1
kind: Deployment
metadata:
  name: api-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      component: api
  template:
    metadata:
      labels:
        component: api
    spec:
      containers:
      - name: api
        image: gcr.io/myproject-22edwx23/api:latest
      ports:
      - containerPort: 5001

我为其附加了服务

apiVersion: v1
kind: Service
metadata:
  name: api-cluster-ip-service
spec:
  type: NodePort
  selector:
    component: api
  ports:
    - port: 5001
      targetPort: 5001

,然后创建应连接到此api的Web部署。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      component: web
  template:
    metadata:
      labels:
        component: web
    spec:
      containers:
      - name: web
        image: gcr.io/myproject-22edwx23/web:latest
        ports:
        - containerPort: 5000
        env:
          - name: API_URL
            value: http://api-cluster-ip-service:5001

此后,我为Web界面+入口等添加了服务,但这似乎与问题无关。我想知道API_URL的设置是否可以正确地通过http://api-cluster-ip-service:5001来获取api的主机?

或者我不能依靠Kubernetes来获取api的适当dns,并且Web应用程序应该通过公共互联网调用api。

2 个答案:

答案 0 :(得分:1)

如果要检查 API_URL 变量值,只需运行

kubectl exec -it web-deployment-pod env | grep API_URL

kube-dns服务从Kubernetes API监听服务和端点事件,并根据需要更新其DNS记录。当您创建,更新或删除Kubernetes服务及其关联的pod时,将触发这些事件。

kubelet在 /etc/resolv.conf

中设置每个新Pod的搜索选项

不过,如果要通过群集服务从一个Pod到另一个Pod进行HTTP,建议按以下方式引用服务的ClusterIP

api-cluster-ip-service.default.svc.cluster.local

您应该在Web Pod中将服务IP分配给env变量,因此无需重新发明它:

sukhoversha@sukhoversha:~/GCP$ kk exec -it web-deployment-675f8fcf69-xmqt8 env | grep -i service
API_CLUSTER_IP_SERVICE_PORT=tcp://10.31.253.149:5001
API_CLUSTER_IP_SERVICE_PORT_5001_TCP=tcp://10.31.253.149:5001
API_CLUSTER_IP_SERVICE_PORT_5001_TCP_PORT=5001
API_CLUSTER_IP_SERVICE_PORT_5001_TCP_ADDR=10.31.253.149

要详细了解DNS for Services

答案 1 :(得分:0)

如果要使用环境变量,可以执行以下操作:

Python示例:

import os
API_URL = os.environ['API_CLUSTER_IP_SERVICE_SERVICE_HOST'] + ":" + os.environ['API_CLUSTER_IP_SERVICE_SERVICE_PORT']

请注意,环境变量基于您的服务名称。如果要检查Pod中可用的所有环境变量:

kubectl get pods #get {pod name}
kubectl exec -it {pod_name} printenv

P.S。请注意,Pod在创建过程中会获取其环境变量,并且将无法从其创建后的服务中获取它。