我正在尝试配置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
答案 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