我们目前有一个设置,我们的mesos / marathon集群中的应用程序想要接触可能存在或不存在于我们的mesos / marathon集群中的服务。进入群集的外部流量的入口是通过位于Traefik实例集群前面的Amazon ELB完成的,然后选择适当的容器实例集以通过传入的HTTP主机头进行负载平衡,与基本上为多个的进行比较。 - 已配置的主机标头与特定容器实例的关联。内部到内部流量实际上也由同一路径处理,因为与给定服务相关联的DNS记录被映射到我们的mesos / marathon集群内部和外部的同一ELB。我们还能够将多个DNS记录指向同一个容器集。
此设置有效,但导致看似不必要的网络流量和负载对我们的ELB以及我们的Traefik集群,就好像容器或其他组件中的应用程序能够自我确定他们希望调用的服务在他们所处的特定mesos / marathon集群中,并对集群内部的集合内部或者直接到特定容器本身进行适当的调用。
根据我对Kubernetes的理解,Kubernetes提供了服务的概念,它基本上可以作为一组pod的前端,基于配置服务应该匹配的pod。但是,我并不完全确定我们可以让Kubernetes集群中的应用程序透明地知道将网络流量引导到服务IP的机制。我认为通过将Envoy代理流量用于(例如<application-name>.<cluster-name>.company.com
服务名称,但是如果我们有一个CNAME映射到之前的DNS条目(比如,<application-name>.company.com
),我不完全确定如何避免退出群集。
两种情况都有好办法解决吗?我们正试图避免使用我们的应用程序。逻辑必须理解它位于特定的集群中,并且更喜欢应用程序之外的组件来适当地执行路由。
如果我从根本上误解某个特定组件,我很乐意接受纠正!
答案 0 :(得分:2)
当您在群集中使用服务到服务通信时,您正在使用Service
抽象,这类似于静态点,可以将流量引导到正确的容器。
服务端点仅由集群内部的IP或内部DNS名称提供,由内部Kubernetes DNS服务器提供。因此,要在群集内部进行通信,您可以使用<servicename>.<namespace>.svc.cluster.local
等DNS名称。
但是,更重要的是,服务有一个静态IP地址。
因此,现在您可以将静态IP作为hosts
记录添加到群集内的pod中,以确保它们在群集内相互通信。
为此,您可以使用HostAlias功能。以下是配置示例:
apiVersion: v1
kind: Pod
metadata:
name: hostaliases-pod
spec:
restartPolicy: Never
hostAliases:
- ip: "10.0.1.23"
hostnames:
- "my.first.internal.service.example.com"
- ip: "10.1.2.3"
hostnames:
- "my.second.internal.service.example.com"
containers:
- name: cat-hosts
image: busybox
command:
- cat
args:
- "/etc/hosts"
因此,如果您将内部服务IP与服务的公共FQDN结合使用,则来自您的pod的所有流量将100%在群集内,因为应用程序将使用内部IP地址。
此外,您可以使用包含相同别名的upstream DNS服务器,但一个想法是相同的。 使用单独区域的上游DNS,解析将如下工作:
使用新版本的Kubernetes,它使用Core DSN提供DNS服务,并且具有更多功能,它会更简单。