Kubernetes服务为env var到前端使用

时间:2017-02-27 01:21:47

标签: kubernetes

我正在尝试配置kubernetes,在我的项目中,我已经分离了UI和API。 我创建了一个Pod,并将其作为服务公开。

如何在pod.yaml配置中设置API_URL以便从用户的浏览器发送请求?

我无法使用localhost,因为容器之间没有通信。

pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: project
  labels:
    name: project
spec:
  containers:
  - image: 'ui:v1'
    name: ui
    ports:
    - name: ui
      containerPort: 5003
      hostPort: 5003
    env:
    - name: API_URL
      value: <how can I set the API address here?>
  - image: 'api:v1'
    name: api
    ports:
    - name: api
      containerPort: 5000
      hostPort: 5000
    env:
    - name: DATABASE_URL
      valueFrom:
      secretKeyRef:
        name: postgres-url
        key: url

services.yaml

apiVersion: v1
kind: Service
metadata:
  name: api
  labels:
    name: api
spec:
  type: NodePort
  ports:
  - name: 'http'
    protocol: 'TCP'
    port: 5000
    targetPort: 5000
    nodePort: 30001
  selector:
    name: project
---
apiVersion: v1
kind: Service
metadata:
  name: ui
  labels:
    name: ui
spec:
  type: NodePort
  ports:
  - name: 'http'
    protocol: 'TCP'
    port: 80
    targetPort: 5003
    nodePort: 30003
  selector:
    name: project

2 个答案:

答案 0 :(得分:1)

服务IP已经在pod中的环境变量中可用,因为Kubernetes为当时存在的每个服务初始化一组环境变量。

列出广告连播的所有环境变量

kubectl exec <pod-name> env

如果在服务之前创建了pod,则必须将其删除并再次创建。

由于您将服务命名为api,因此上面命令应列出的变量之一为API_SERVICE_HOST

但是你真的不需要在环境变量中查找服务IP地址。您只需使用服务名称作为主机名即可。任何pod都可以通过调用api来连接到服务api.default.svc.cluster(假设您的服务位于default命名空间中)。

答案 1 :(得分:1)

我创建了一个Ingress来解决这个问题并指向DNS而不是IP。

ingres.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: project
spec:
  tls:
  - secretName: tls
  backend:
    serviceName: ui
    servicePort: 5003
  rules:
  - host: www.project.com
    http:
      paths:
      - backend:
          serviceName: ui
          servicePort: 5003
  - host: api.project.com
    http:
      paths:
      - backend:
          serviceName: api
          servicePort: 5000

deployment.yaml

apiVersion: v1
kind: Pod
metadata:
  name: project
  labels:
    name: project
spec:
  containers:
  - image: 'ui:v1'
    name: ui
    ports:
    - name: ui
      containerPort: 5003
      hostPort: 5003
    env:
    - name: API_URL
      value: https://api.project.com
  - image: 'api:v1'
    name: api
    ports:
    - name: api
      containerPort: 5000
      hostPort: 5000
    env:
    - name: DATABASE_URL
      valueFrom:
      secretKeyRef:
        name: postgres-url
        key: url