Kubernetes中的Pod沒法訪問外網-Ubuntu16.04 LTS

Kubernetes中的Pod沒法訪問外網-Ubuntu16.04 LTS

安裝完Kubernetes後,在Pod中使用wget沒法訪問外網URL地址,可是使用IP地址是能夠訪問,應該是docker

Pod內沒法解析DNS致使的。ubuntu

一、解決方法

嘗試了將DNS換爲CoreDNS,問題仍然存在。通過屢次測試,發現下面的方法是可行的:api

編輯主機的/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裏的內容。網絡

二、緣由分析

Ubuntu16.04 LTS安裝的resolvconf有一些問題,/etc/resolv.conf並不是連接(有的安裝同一個版本是連接,很奇怪的),resolvconf -u等方法都會執行失敗。原則上,是連接的到/etc/resolvconf/resolv.conf.d裏面去改,不是連接的,直接修改/etc/resolv.conf文件。oop

可能Kubernetes啓動Pod時,要把/etc/resolv.conf裏的dns信息帶到pod中,而resolv.conf解析不到外面的地址。聯想到以前kube-dns常常出錯,估計也是這個緣由。配置完後,kube-dns就不多出錯了。測試

三、其它

下面是從網上看到的方法,作過嘗試的一些方法。網站

通過測試,加入外部DNS後能夠訪問外部網址,/etc/resolv.conf裏的nameserver的IP地址沒法ping通,確定也沒法作域名解析了。所以,主要緣由在於service的clusterip能夠傳遞外部請求到pod,可是pod卻沒法訪問service的ip,在多個技術網站搜索,基本上都出現此問題。spa

解決方法包括:操作系統

  • 修改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。

相關文章
相關標籤/搜索