2017-08-21 24 views
0

私のポッドでホスト名を解決できないKubernetesに問題が発生しました(google.comまたはkubernetes.defaultなど)。Kubernetes:ポッドでホスト名を解決できない

現在、OpenStackの2つのCentOS7インスタンスで1つのマスターと1つのノードが動作しています。私はkubeadmを使って展開しました。ここで

インストールされたバージョンされています

kubeadm-1.7.3-1.x86_64 
kubectl-1.7.3-1.x86_64 
kubelet-1.7.3-1.x86_64 
kubernetes-cni-0.5.1-0.x86_64 

以下は多分私の問題いくつかの洞察を与えるために、いくつかの検証手順を説明します。

私はbusyboxのポッドを定義します。その後、

apiVersion: v1 
kind: Pod 
metadata: 
    name: busybox 
    namespace: default 
spec: 
    containers: 
    - image: busybox 
    command: 
     - sleep 
     - "3600" 
    imagePullPolicy: IfNotPresent 
    name: busybox 
    restartPolicy: Always 

とPODを作成:名前google.comのDNSルックアップを実行できるように

$ kubectl create -f busybox.yaml 

試してみてください。

$ kubectl exec -ti busybox -- nslookup google.com 
Server: 10.96.0.10 
Address 1: 10.96.0.10 
nslookup: can't resolve 'google.com' 

は、実行しよう名前のDNS検索kubernetes.default

$ kubectl exec -ti busybox -- nslookup kubernetes.default 
Server: 10.96.0.10 
Address 1: 10.96.0.10 
nslookup: can't resolve 'kubernetes.default' 

チェック私のDNSポッドが実行されている場合:

$ kubectl get pods --namespace=kube-system -l k8s-app=kube-dns 
NAME      READY  STATUS RESTARTS AGE 
kube-dns-2425271678-k1nft 3/3  Running 9   5d 

をチェック私のDNSサービスが稼働している場合:DNSのエンドポイントが公開されている場合

$ kubectl get svc --namespace=kube-system 
NAME  CLUSTER-IP EXTERNAL-IP PORT(S)   AGE 
kube-dns 10.96.0.10 <none>  53/UDP,53/TCP 5d 

チェック:

$ kubectl get ep kube-dns --namespace=kube-system 
NAME  ENDPOINTS      AGE 
kube-dns 10.244.0.5:53,10.244.0.5:53 5d 

コンテナ内の/etc/resolv.confの内容を確認してください:

$ kubectl exec -ti busybox -- cat /etc/resolv.conf 
nameserver 10.96.0.10 
search default.svc.cluster.local svc.cluster.local cluster.local 
options ndots:5 

私が正しく理解していた場合は、Kubernetesのドキュメントでは、私のポッドは、ノードのDNS設定を継承すべきであると述べている(またはマスターを?)。ポッドをスピンアップする場合しかし、それ(nameserver 10.92.128.40)でちょうど1行で、私は警告の下に受け取る:

Search Line limits were exceeded, some dns names have been omitted, the applied search line is: default.svc.cluster.local svc.cluster.local cluster.local mydomain.net anotherdomain.net yetanotherdomain.net 

私は理解しては非常に多くの項目が/etc/resolv.confに記載されていることができる既知の問題が存在します。しかし、私のコンテナ内の上記の検索行とネームサーバーはどこから生成されますか?

$ kubectl logs --namespace=kube-system $(kubectl get pods --namespace=kube-system -l k8s-app=kube-dns -o name) -c kubedns 
I0817 20:54:58.445280  1 dns.go:48] version: 1.14.3-4-gee838f6 
I0817 20:54:58.452551  1 server.go:70] Using configuration read from directory: /kube-dns-config with period 10s 
I0817 20:54:58.452616  1 server.go:113] FLAG: --alsologtostderr="false" 
I0817 20:54:58.452628  1 server.go:113] FLAG: --config-dir="/kube-dns-config" 
I0817 20:54:58.452638  1 server.go:113] FLAG: --config-map="" 
I0817 20:54:58.452643  1 server.go:113] FLAG: --config-map-namespace="kube-system" 
I0817 20:54:58.452650  1 server.go:113] FLAG: --config-period="10s" 
I0817 20:54:58.452659  1 server.go:113] FLAG: --dns-bind-address="0.0.0.0" 
I0817 20:54:58.452665  1 server.go:113] FLAG: --dns-port="10053" 
I0817 20:54:58.452674  1 server.go:113] FLAG: --domain="cluster.local." 
I0817 20:54:58.452683  1 server.go:113] FLAG: --federations="" 
I0817 20:54:58.452692  1 server.go:113] FLAG: --healthz-port="8081" 
I0817 20:54:58.452698  1 server.go:113] FLAG: --initial-sync-timeout="1m0s" 
I0817 20:54:58.452704  1 server.go:113] FLAG: --kube-master-url="" 
I0817 20:54:58.452713  1 server.go:113] FLAG: --kubecfg-file="" 
I0817 20:54:58.452718  1 server.go:113] FLAG: --log-backtrace-at=":0" 
I0817 20:54:58.452727  1 server.go:113] FLAG: --log-dir="" 
I0817 20:54:58.452734  1 server.go:113] FLAG: --log-flush-frequency="5s" 
I0817 20:54:58.452741  1 server.go:113] FLAG: --logtostderr="true" 
I0817 20:54:58.452746  1 server.go:113] FLAG: --nameservers="" 
I0817 20:54:58.452752  1 server.go:113] FLAG: --stderrthreshold="2" 
I0817 20:54:58.452759  1 server.go:113] FLAG: --v="2" 
I0817 20:54:58.452765  1 server.go:113] FLAG: --version="false" 
I0817 20:54:58.452775  1 server.go:113] FLAG: --vmodule="" 
I0817 20:54:58.452856  1 server.go:176] Starting SkyDNS server (0.0.0.0:10053) 
I0817 20:54:58.453680  1 server.go:198] Skydns metrics enabled (/metrics:10055) 
I0817 20:54:58.453692  1 dns.go:147] Starting endpointsController 
I0817 20:54:58.453699  1 dns.go:150] Starting serviceController 
I0817 20:54:58.453841  1 logs.go:41] skydns: ready for queries on cluster.local. for tcp://0.0.0.0:10053 [rcache 0] 
I0817 20:54:58.453852  1 logs.go:41] skydns: ready for queries on cluster.local. for udp://0.0.0.0:10053 [rcache 0] 
I0817 20:54:58.964468  1 dns.go:171] Initialized services and endpoints from apiserver 
I0817 20:54:58.964523  1 server.go:129] Setting up Healthz Handler (/readiness) 
I0817 20:54:58.964536  1 server.go:134] Setting up cache handler (/cache) 
I0817 20:54:58.964545  1 server.go:120] Status HTTP port 8081 

dnsmasqコンテナ:

は、最後にここにkube-dnsコンテナからのログです。私が言われたものだけでなく、私がresolv.confにいたものよりもいくつかネームサーバを見つけたことを無視してください。

$ kubectl logs --namespace=kube-system $(kubectl get pods --namespace=kube-system -l k8s-app=kube-dns -o name) -c dnsmasq 
I0817 20:55:03.295826  1 main.go:76] opts: {{/usr/sbin/dnsmasq [-k --cache-size=1000 --log-facility=- --server=/cluster.local/127.0.0.1#10053 --server=/in-addr.arpa/127.0.0.1#10053 --server=/ip6.arpa/127.0.0.1#10053] true} /etc/k8s/dns/dnsmasq-nanny 10000000000} 
I0817 20:55:03.298134  1 nanny.go:86] Starting dnsmasq [-k --cache-size=1000 --log-facility=- --server=/cluster.local/127.0.0.1#10053 --server=/in-addr.arpa/127.0.0.1#10053 --server=/ip6.arpa/127.0.0.1#10053] 
I0817 20:55:03.731577  1 nanny.go:111] 
W0817 20:55:03.731609  1 nanny.go:112] Got EOF from stdout 
I0817 20:55:03.731642  1 nanny.go:108] dnsmasq[9]: started, version 2.76 cachesize 1000 
I0817 20:55:03.731656  1 nanny.go:108] dnsmasq[9]: compile time options: IPv6 GNU-getopt no-DBus no-i18n no-IDN DHCP DHCPv6 no-Lua TFTP no-conntrack ipset auth no-DNSSEC loop-detect inotify 
I0817 20:55:03.731681  1 nanny.go:108] dnsmasq[9]: using nameserver 127.0.0.1#10053 for domain ip6.arpa 
I0817 20:55:03.731689  1 nanny.go:108] dnsmasq[9]: using nameserver 127.0.0.1#10053 for domain in-addr.arpa 
I0817 20:55:03.731695  1 nanny.go:108] dnsmasq[9]: using nameserver 127.0.0.1#10053 for domain cluster.local 
I0817 20:55:03.731704  1 nanny.go:108] dnsmasq[9]: reading /etc/resolv.conf 
I0817 20:55:03.731710  1 nanny.go:108] dnsmasq[9]: using nameserver 127.0.0.1#10053 for domain ip6.arpa 
I0817 20:55:03.731717  1 nanny.go:108] dnsmasq[9]: using nameserver 127.0.0.1#10053 for domain in-addr.arpa 
I0817 20:55:03.731723  1 nanny.go:108] dnsmasq[9]: using nameserver 127.0.0.1#10053 for domain cluster.local 
I0817 20:55:03.731729  1 nanny.go:108] dnsmasq[9]: using nameserver 10.92.128.40#53 
I0817 20:55:03.731735  1 nanny.go:108] dnsmasq[9]: using nameserver 10.92.128.41#53 
I0817 20:55:03.731741  1 nanny.go:108] dnsmasq[9]: using nameserver 10.95.207.66#53 
I0817 20:55:03.731747  1 nanny.go:108] dnsmasq[9]: read /etc/hosts - 7 addresses 

そしてsidecarコンテナ:

$ kubectl logs --namespace=kube-system $(kubectl get pods --namespace=kube-system -l k8s-app=kube-dns -o name) -c sidecar 
ERROR: logging before flag.Parse: I0817 20:55:04.488391  1 main.go:48] Version v1.14.3-4-gee838f6 
ERROR: logging before flag.Parse: I0817 20:55:04.488612  1 server.go:45] Starting server (options {DnsMasqPort:53 DnsMasqAddr:127.0.0.1 DnsMasqPollIntervalMs:5000 Probes:[{Label:kubedns Server:127.0.0.1:10053 Name:kubernetes.default.svc.cluster.local. Interval:5s Type:1} {Label:dnsmasq Server:127.0.0.1:53 Name:kubernetes.default.svc.cluster.local. Interval:5s Type:1}] PrometheusAddr:0.0.0.0 PrometheusPort:10054 PrometheusPath:/metrics PrometheusNamespace:kubedns}) 
ERROR: logging before flag.Parse: I0817 20:55:04.488667  1 dnsprobe.go:75] Starting dnsProbe {Label:kubedns Server:127.0.0.1:10053 Name:kubernetes.default.svc.cluster.local. Interval:5s Type:1} 
ERROR: logging before flag.Parse: I0817 20:55:04.488766  1 dnsprobe.go:75] Starting dnsProbe {Label:dnsmasq Server:127.0.0.1:53 Name:kubernetes.default.svc.cluster.local. Interval:5s Type:1} 

私はほとんどhereを付属のマニュアルを読んでいると私はエキストラを除去することによって、それだけでしようとしました。どんな方向性、洞察力、または試みるべきことも大いに感謝します。

+0

k8sが実行されているノードから名前が解決されますか? –

答えて

2

いくつかのアイデアが頭に浮かぶ:

  • はたぶんKUBE-プロキシサービスが正しく、したがって、動作していないKUBE-DNSサービスはacccessibleではありません。それが動作していることを確認できますか?
  • ネットワークオーバーレイを正しくインストールしませんでした。たとえば、Calico:https://docs.projectcalico.org/v2.4/getting-started/kubernetes/installation/hosted/kubeadm/です。あなたはそれをインストールして、それは動作していますか?
+0

こんにちは、kube-proxyは実行中です: '/ usr/local/bin/kube-proxy --kubeconfig =/var/lib/kube-proxy/kubeconfig.conf --cluster-cidr = 10.244.0.0/16'です。 [This](https://kubernetes.io/docs/tasks/debug-application-cluster/debug-service/#is-kube-proxy-writing-iptables-rules)では、プロキシが必要なiptablesルールを作成していますノード1つの奇妙なことに、curl 10.111.133.184:80をサービスに対して実行すると、ポッド名が返されることがあります。私は 'kubeadm'セットアップを行うときにFlannelを選択しました。それを確実にテストする方法を指摘できますか? – azurepancake

+0

これを正しく理解すれば、Flannelはオーバーレイネットワークを提供しているので、ポッドは異なるノード間で通信することができます。私の 'kube-dns-2425271678-k1nft'ポッドのIPアドレスは' 10.244.0.5'です。これはFlannelによって処理されるIPです( '/ run/flannel/subnet.env'で定義されています)。このDNSポッドはノード 'kubemaster'にあります。今作成したポッドはノード 'kubenode01'にあります。 'kubemaster'から' 10.244.0.5'をpingできますが、 'kubenode01'ではできません。これがフランネルの問題かもしれないと仮定するのは正しいでしょうか?私は耳の後ろにとても濡れているので、愚かな質問のために謝ります。 – azurepancake

+0

プロキシのテストに関してもう少し追加するには、nginxを実行する2つのポッドを作成し、それらのポッドに 'Port 'の' 80'と 'NodePort'の' 31746'を追加します。そのノードの外部IPアドレスと上記のポートを使用して、外部からそのサービスにアクセスできます。このことは、kube-proxyが少なくとも機能していることを証明していますか?そのトラフィックをポッドに転送することは成功しているようです。 – azurepancake

関連する問題