是否可以将服务的外部IP(NodePort或LoadBalancer)作为环境变量传递给其他服务的Deployment中的容器?
举一个具体的例子,考虑一个Kubernetes集群,该集群具有用于多个队友的名称空间,因此他们每个人都有自己的测试环境。在一个环境中,至少有两个服务:
对于服务2,它需要知道服务1的外部IP地址。到目前为止,我只能找到使用kubectl
来描述服务#1来查找此信息的示例。我希望可以做这样的事情:
apiVersion: v1
kind: Service
metadata:
name: gateway
namespace: "${ env }"
labels:
app: gateway
spec:
type: LoadBalancer
ports:
- port: 8080
selector:
app: gateway
和
apiVersion: extensions/v1
kind: Deployment
metadata:
name: svc2-deployment
namespace: "${ env }"
labels:
app: svc2
spec:
template:
metadata:
labels:
app: svc2
spec:
containers:
- name: app
env:
- name: GATEWAY_IP
valueFrom:
fieldRef:
fieldPath: service.gateway.----.ingressIp
而不是将initContainers
与执行kubectl
的脚本一起使用。尤其是因为我是Kubernetes的新手:)
答案 0 :(得分:2)
并非如此,但是您可以使用DNS。例如:
apiVersion: extensions/v1
kind: Deployment
metadata:
name: svc2-deployment
namespace: "${ env }"
labels:
app: svc2
spec:
template:
metadata:
labels:
app: svc2
spec:
containers:
- name: app
env:
- name: GATEWAY_IP
value: gateway.<namespace-where-gw-is-running>.svc.cluster.local
答案 1 :(得分:2)
当前不是开箱即用的功能,但是您可以安装一些工具来获取该外部IP并将其放置在configmap中,例如Jenkins-X expose-controller。但是,我发现仅使用DNS并在描述符中参数化DNS名称会更容易。
如果您具有通配符DNS,则可以为每个服务指定一个专用的外部主机名,该域在service1.domain和service2.domain等域下。通配符DNS会将所有这些路由到您的入口控制器,然后可以路由到基于主机名的正确服务。 (正如Jenkins-X伙计所指出的,如果您没有nip.io之类的东西,则您的入口IP是route53的公用IP,则可以免费获得Willard DNS。)
我在activiti项目上的经验。我们发现,服务需要注入一个属性,该属性将密钥URL的外部URL告知他们,因为每个服务都包含密钥斗克代码以验证令牌是在有效的外部URL上发出的。您可以在the helm charts中看到结果,还有一个README there可以解释更多内容。我们从gitlab掌舵图中获得了灵感-他们的说明ask the user to put in a wildcard DNS,大概是出于类似的原因。