【发布时间】:2018-08-30 15:51:58
【问题描述】:
在使用主机网络选项运行的容器中,可以使用容器中的主机网络接口及其 IP 并联系外部网络来自此接口和 IP。因此,如果主机配置了多个 IP,容器可以选择使用哪个。
我可以对 Kubernetes 进行类似的设置并让容器使用主机 IP 吗?
注意:我需要从特定 IP 联系外部服务的流程,我不一定需要从外部视图将这些 IP 分配给容器。
【问题讨论】:
标签: networking kubernetes
在使用主机网络选项运行的容器中,可以使用容器中的主机网络接口及其 IP 并联系外部网络来自此接口和 IP。因此,如果主机配置了多个 IP,容器可以选择使用哪个。
我可以对 Kubernetes 进行类似的设置并让容器使用主机 IP 吗?
注意:我需要从特定 IP 联系外部服务的流程,我不一定需要从外部视图将这些 IP 分配给容器。
【问题讨论】:
标签: networking kubernetes
正如我在Egress IP adress selection 中所写:
Istio Egress Gateway 可以帮助您解决这个问题,所以我建议您研究一下。
否则,它仍然依赖于特定平台和部署集群的方式。例如,在 AWS 上,您可以通过使用分配有弹性 IP 的实例(无论是常规 EC2 还是 AWS NAT 网关)来确保您的出口流量始终来自预定义的已知 IP 集。即使使用上面的 Egress,您也需要一些方法来为此定义一个固定 IP,因此 AWS ElasticIP(或等效的)是必须的。
【讨论】:
我会尝试一下。我希望我能理解你的问题。您只需要从 pod/container 内部连接到外部 ip。
我们通过创建一个没有选择器的 kubernetes 服务来实现这一点。
kind: Service
apiVersion: v1
metadata:
name: your-external-system
随后创建一个与您的服务同名的端点对象。
kind: Endpoints
apiVersion: v1
metadata:
name: your-external-system
subsets:
- addresses:
- ip: 192.168.0.1
ports:
- port: 3306
最后在您的 pod 中,您可以在这种情况下简单地引用服务名称(your-external-system)
【讨论】:
pod 规范中的hostNetwork=true 将宿主网络暴露给 pod,容器可以访问网络接口:
apiVersion: v1
kind: Pod
metadata:
name: lookup
spec:
hostNetwork: true
containers:
- name: lookup
image: sbusso/lookup_ips:latest
ports:
- containerPort: 9000
测试它:kubectl port-forward lookup 9000 然后转到http://127.0.0.1:9000/ 并获取网络接口详细信息:
lo
- 127.0.0.1/8
- ::1/128
eth0
- 10.0.2.15/24
- fe80::a00:27ff:fea1:6e61/64
eth1
- 192.168.99.101/24
- fe80::a00:27ff:fe77:d179/64
注意,Kubernetes 良好实践中不建议使用此选项:https://kubernetes.io/docs/concepts/configuration/overview/#services
【讨论】:
--net=host --privileged(在此示例中,--privileged 是多余的)。我可以看到 .spec.hostNetwork == --net=host 但我看不到 --privileged 的等效项(使用 docker 编辑我不需要 --privileged)