我按照以下方式创建了一个 AKS 集群文件程序。我在集群内创建了 pod,当将 tty 放入其中 ( kubectl exec -it pod-name -- /bin/bash
) 时,我意识到容器无法访问 Azure 外部的资源:我无法 ping 8.8.8.8,我无法解析公共网站的 FQDN。
我找不到任何 Azure 文档明确说明 Pod 应该可以访问集群外部的网络。我可以找到这种类型的文档我们可以看到,允许出站流到公共源应该是默认行为(但在实践中我发现事实并非如此),我发现大量博客文章解释如何为我的 k8s 服务使用静态 IP,但这不是我想知道的。
我想知道:Azure Kubernetes 集群的默认行为是否允许出站流量,或者我在安装时做错了什么?
答案1
我之前在 K8s 容器中看到过 ping 问题,但我curl http://www.google.com
在 AKS 集群上的容器中却没有问题。需要使用适当的网络工具启动另一个容器来进一步排除故障。如果时间允许,今天晚些时候会尝试。
答案2
我认为,向远程主机发送 ICMP 回应请求并不是验证出口流量是否可以不受限制地发送到外部世界的最佳方法。请尝试使用以下命令:
kubectl run -it --rm aks-ip --image=debian --generator=run-pod/v1
apt-get update && apt-get install curl -y
curl -s checkip.dyndns.org
正如解释的那样这里,位于 AKS 文档的 github 存储库中。
对我来说,它可以与公共 DNS 地址进行毫无问题地通信。
当你主要从 Pod 连接到集群外部的资源时,你也可以尝试用 Azure CNI 替换标准网络插件“kubenet”(检查这为您的 AKS 集群选择正确的网络模型的资源)。
答案3
没有找到问题的真正答案,但我找到了一种使其工作的方法:Azure 文档指出,如果群集中尚未创建 LoadBalancer,。the nodes have no instance level Public IP address. Azure translates the outbound flow to a public source IP address that is not configurable or deterministic.
我没有看到允许在 Internet 上传输的出站流量...
但是在创建 LoadBalancer 之后,即使不在同一个命名空间中,每个命名空间的每个 pod 都能够看到它们的流量被路由到 Internet。
因此没有明确的答案(为什么尽管有文档说明,但如果没有 LoadBalancer,我的 Pod 的传出流量就不会被路由到互联网),但我设法在创建 LoadBalancer 后看到了路由的流量(即使在与 Pod 不同的命名空间中...)。很奇怪。