Kubernetes中的Pod无法访问外网-Ubuntu16.04 LTS

简介: Kubernetes中的Pod无法访问外网-Ubuntu16.04 LTS 安装完Kubernetes后,在Pod中使用wget无法访问外网URL地址,但是使用IP地址是可以访问,应该是 Pod内无法解析DNS导致的。

Kubernetes中的Pod无法访问外网-Ubuntu16.04 LTS

安装完Kubernetes后,在Pod中使用wget无法访问外网URL地址,但是使用IP地址是可以 访问,应该是

Pod内无法解析DNS导致的。

1、解决方法

尝试了将DNS换为CoreDNS,问题仍然存在。经过多次测试,发现下面的方法是可行的:

编辑主机的/etc/resolv.conf文件:

# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN #nameserver 127.0.1.1 nameserver 192.168.199.1 nameserver 8.8.8.8 nameserver 9.9.9.9 search lan

如果/etc/resolv.conf为链接,则需要修改/etc/resolvconf/resolv.conf.d/base或head文件,然后运行resolvconf -u进行更新/etc/resolv.conf里的内容。

2、原因分析

Ubuntu16.04 LTS安装的resolvconf有一些问题,/etc/resolv.conf并非链接(有的安装同一个版本是链接,很奇怪的),resolvconf -u等方法都会执行失败。原则上,是链接的到/etc/resolvconf/resolv.conf.d里面去改,不是链接的,直接修改/etc/resolv.conf文件。

可能Kubernetes启动Pod时,要把/etc/resolv.conf里的dns信息带到pod中,而resolv.conf解析不到外面的地址。联想到之前kube-dns经常出错,估计也是这个原因。配置完后,kube-dns就很少出错了。

3、其它

下面是从网上看到的方法,做过尝试的一些方法。

经过测试,加入外部DNS后可以访问外部网址,/etc/resolv.conf里的nameserver的IP地址无法ping通,肯定也无法做域名解析了。因此,主要原因在于service的clusterip可以传递外部请求到pod,但是pod却无法访问service的ip,在多个技术网站搜索,基本上都出现此问题。

解决方法包括:

  • 修改iptables的配置,在sysctl.conf。查看iptable配置,iptable -L -v。
  • 使用Service Mesh,不知道是否有助于该问题。
  • 使用weavenet的网络驱动,有人说可以。有人说flannel可以,calico不行,但我用的flannel也是不行,可能跟操作系统也有关系,我的是ubuntu 16.04。
  • sudo gedit sysctl.conf,插入:
###################################### # For K8s pod access service  # by openthings,2018.06.30. #======================================
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-arptables = 1 #######################################

按照这些方法搞过,还是不行。 ping 10.96.0.10不通。

变通的方法:

  • 设一个代理,使用IP地址去访问。如https_proxy=192.168.199.99:9999 wget example.org,经测试,可行。也证明了网络是通的,主要是DNS服务地址访问不到。
  • 尝试通过修改/etc/resolvconf/resolv.conf.d/base,然后运行resolvconf不成功。
  • 在POD里添加新的DNS服务器,如在/etc/resolv.conf加上 nameserver=8.8.8.8,没效果。进到pod里,检查/etc/resolv.conf,并没有将主机的nameserver配置参数带进来。

但是,这两个方法虽然可以访问外部地址了,但仍然不能访问Kubernetes的Service产生的ClusterIP。不过,集群内部访问其它服务(包括POD自己的服务),可以通过服务名进行。

尝试设置Kubernetes的Kube-dns的外部dns,将下面内容保存为extdns.yaml。

apiVersion: v1 kind: ConfigMap metadata:
 name: kube-dns
 namespace: kube-system
 labels:
 addonmanager.kubernetes.io/mode: EnsureExists
data:
 upstreamNameservers: /
 ["8.8.8.8", "9.9.9.9"]

其它:

如果 Node 上安装的 Docker 版本大于 1.12,那么 Docker 会把默认的 iptables FORWARD 策略改为 DROP。这会引发 Pod 网络访问的问题。解决方法则在每个 Node 上面运行 iptables -P FORWARD ACCEPT,比如

如果使用了 flannel/weave 网络插件,更新为最新版本也可以解决这个问题。

DNS 无法解析也有可能是 kube-dns 服务异常导致的,可以通过下面的命令来检查 kube-dns 是否处于正常运行状态

如果 kube-dns 处于 CrashLoopBackOff 状态,那么需要查看 kube-dns Pod 的日志,根据日志来修复 DNS 服务。

如果 kube-dns Pod 处于正常 Running 状态,则需要进一步检查是否正确配置了 kube-dns 服务:

如果 kube-dns service 不存在,或者 endpoints 列表为空,则说明 kube-dns service 配置错误,可以重新部署 kube-dns service。

本文转自开源中国-Kubernetes中的Pod无法访问外网-Ubuntu16.04 LTS

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
8天前
|
Kubernetes 负载均衡 Ubuntu
Kubernetes安装详细教程 Ubuntu版
本教程基于Ubuntu 22.04配置Kubernetes环境,涵盖依赖安装、swap关闭、内核参数调整、containerd与Kubernetes组件安装、集群初始化及CNI网络插件部署等内容,并提供常见问题处理方法和相关工具推荐。
|
4月前
|
Kubernetes Docker 容器
Kubernetes与Docker参数对照:理解Pod中的command、args与Dockerfile中的CMD、ENTRYPOINT。
需要明确的是,理解这些都需要对Docker和Kubernetes有一定深度的理解,才能把握二者的区别和联系。虽然它们都是容器技术的二个重要组成部分,但各有其特性和适用场景,理解它们的本质和工作方式,才能更好的使用这些工具,将各自的优点整合到生产环境中,实现软件的快速开发和部署。
138 25
|
4月前
|
Kubernetes Shell Windows
【Azure K8S | AKS】在AKS的节点中抓取目标POD的网络包方法分享
在AKS中遇到复杂网络问题时,可通过以下步骤进入特定POD抓取网络包进行分析:1. 使用`kubectl get pods`确认Pod所在Node;2. 通过`kubectl node-shell`登录Node;3. 使用`crictl ps`找到Pod的Container ID;4. 获取PID并使用`nsenter`进入Pod的网络空间;5. 在`/var/tmp`目录下使用`tcpdump`抓包。完成后按Ctrl+C停止抓包。
163 12
|
7月前
|
Kubernetes Ubuntu 网络安全
ubuntu使用kubeadm搭建k8s集群
通过以上步骤,您可以在 Ubuntu 系统上使用 kubeadm 成功搭建一个 Kubernetes 集群。本文详细介绍了从环境准备、安装 Kubernetes 组件、初始化集群到管理和使用集群的完整过程,希望对您有所帮助。在实际应用中,您可以根据具体需求调整配置,进一步优化集群性能和安全性。
404 13
|
7月前
|
Kubernetes 网络协议 应用服务中间件
Kubernetes Ingress:灵活的集群外部网络访问的利器
《Kubernetes Ingress:集群外部访问的利器-打造灵活的集群网络》介绍了如何通过Ingress实现Kubernetes集群的外部访问。前提条件是已拥有Kubernetes集群并安装了kubectl工具。文章详细讲解了Ingress的基本组成(Ingress Controller和资源对象),选择合适的版本,以及具体的安装步骤,如下载配置文件、部署Nginx Ingress Controller等。此外,还提供了常见问题的解决方案,例如镜像下载失败的应对措施。最后,通过部署示例应用展示了Ingress的实际使用方法。
226 2
|
8月前
|
存储 Kubernetes Docker
【赵渝强老师】Kubernetes中Pod的基础容器
Pod 是 Kubernetes 中的基本单位,代表集群上运行的一个进程。它由一个或多个容器组成,包括业务容器、基础容器、初始化容器和临时容器。基础容器负责维护 Pod 的网络空间,对用户透明。文中附有图片和视频讲解,详细介绍了 Pod 的组成结构及其在网络配置中的作用。
135 1
【赵渝强老师】Kubernetes中Pod的基础容器
|
8月前
|
Ubuntu 网络协议 关系型数据库
超聚变服务器2288H V6使用 iBMC 安装 Ubuntu Server 24.04 LTS及后续系统配置
【11月更文挑战第15天】本文档详细介绍了如何使用iBMC在超聚变服务器2288H V6上安装Ubuntu Server 24.04 LTS,包括连接iBMC管理口、登录iBMC管理界面、配置RAID、安装系统以及后续系统配置等步骤。
1941 4
|
8月前
|
Prometheus Kubernetes 监控
深入探索Kubernetes中的Pod自动扩展(Horizontal Pod Autoscaler, HPA)
深入探索Kubernetes中的Pod自动扩展(Horizontal Pod Autoscaler, HPA)
|
8月前
|
运维 Kubernetes Shell
【赵渝强老师】K8s中Pod的临时容器
Pod 是 Kubernetes 中的基本调度单位,由一个或多个容器组成,包括业务容器、基础容器、初始化容器和临时容器。临时容器用于故障排查和性能诊断,不适用于构建应用程序。当 Pod 中的容器异常退出或容器镜像不包含调试工具时,临时容器非常有用。文中通过示例展示了如何使用 `kubectl debug` 命令创建临时容器进行调试。
134 1
|
8月前
|
Kubernetes 调度 容器
【赵渝强老师】K8s中Pod中的业务容器
Pod 是 Kubernetes 中的基本调度单元,由一个或多个容器组成。除了业务容器,Pod 还包括基础容器、初始化容器和临时容器。本文通过示例介绍如何创建包含业务容器的 Pod,并提供了一个视频讲解。示例中创建了一个名为 "busybox-container" 的业务容器,并使用 `kubectl create -f firstpod.yaml` 命令部署 Pod。
118 1