我正在尝试使用分配给 kube-dns 服务的集群 IP 从 dnstools pod ping kube-dns 服务。 ping 请求超时。在同一个 dnstools pod 中,我尝试使用暴露的端口来 curl kube-dns 服务,但也超时了。
以下是 kubectl get pods --all-namespaces -o wide
的输出
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE
default pod/busybox 1/1 Running 62 2d14h 192.168.1.37 kubenode <none>
default pod/dnstools 1/1 Running 0 2d13h 192.168.1.45 kubenode <none>
default pod/nginx-deploy-7c45b84548-ckqzb 1/1 Running 0 6d11h 192.168.1.5 kubenode <none>
default pod/nginx-deploy-7c45b84548-vl4kh 1/1 Running 0 6d11h 192.168.1.4 kubenode <none>
dmi pod/elastic-deploy-5d7c85b8c-btptq 1/1 Running 0 2d14h 192.168.1.39 kubenode <none>
kube-system pod/calico-node-68lc7 2/2 Running 0 6d11h 10.62.194.5 kubenode <none>
kube-system pod/calico-node-9c2jz 2/2 Running 0 6d12h 10.62.194.4 kubemaster <none>
kube-system pod/coredns-5c98db65d4-5nprd 1/1 Running 0 6d12h 192.168.0.2 kubemaster <none>
kube-system pod/coredns-5c98db65d4-5vw95 1/1 Running 0 6d12h 192.168.0.3 kubemaster <none>
kube-system pod/etcd-kubemaster 1/1 Running 0 6d12h 10.62.194.4 kubemaster <none>
kube-system pod/kube-apiserver-kubemaster 1/1 Running 0 6d12h 10.62.194.4 kubemaster <none>
kube-system pod/kube-controller-manager-kubemaster 1/1 Running 1 6d12h 10.62.194.4 kubemaster <none>
kube-system pod/kube-proxy-9hcgv 1/1 Running 0 6d11h 10.62.194.5 kubenode <none>
kube-system pod/kube-proxy-bxw9s 1/1 Running 0 6d12h 10.62.194.4 kubemaster <none>
kube-system pod/kube-scheduler-kubemaster 1/1 Running 1 6d12h 10.62.194.4 kubemaster <none>
kube-system pod/tiller-deploy-767d9b9584-5k95j 1/1 Running 0 3d9h 192.168.1.8 kubenode <none>
nginx-ingress pod/nginx-ingress-66wts 1/1 Running 0 5d17h 192.168.1.6 kubenode <none>
在上面的输出中,为什么有些 Pod 在
192.168.0.0/24
中分配了一个 IP子网而其他人的 IP 等于我的节点/主节点的 IP 地址? (10.62.194.4是我master的IP,10.62.194.5是我节点的IP)这是
config.yml
我曾经使用 kubeadm init --config=config.yml
初始化集群apiServer:
certSANs:
- 10.62.194.4
extraArgs:
authorization-mode: Node,RBAC
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: dev-cluster
controllerManager: {}
dns:
type: CoreDNS
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: k8s.gcr.io
kind: ClusterConfiguration
kubernetesVersion: v1.15.1
networking:
dnsDomain: cluster.local
podSubnet: 192.168.0.0/16
serviceSubnet: 10.96.0.0/12
scheduler: {}
kubectl get svc --all-namespaces -o wide
的结果NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 6d12h <none>
default service/nginx-deploy ClusterIP 10.97.5.194 <none> 80/TCP 5d17h run=nginx
dmi service/elasticsearch ClusterIP 10.107.84.159 <none> 9200/TCP,9300/TCP 2d14h app=dmi,component=elasticse
dmi service/metric-server ClusterIP 10.106.117.2 <none> 8098/TCP 2d14h app=dmi,component=metric-se
kube-system service/calico-typha ClusterIP 10.97.201.232 <none> 5473/TCP 6d12h k8s-app=calico-typha
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 6d12h k8s-app=kube-dns
kube-system service/tiller-deploy ClusterIP 10.98.133.94 <none> 44134/TCP 3d9h app=helm,name=tiller
我运行的命令是
kubectl exec -ti dnstools -- curl 10.96.0.10:53
编辑:
我提出这个问题是因为我在尝试从集群内解析服务名称时遇到了这个错误。我的印象是我收到此错误,因为我无法从 pod ping DNS 服务器。
kubectl exec -ti dnstools -- nslookup kubernetes.default
的输出;; connection timed out; no servers could be reached
command terminated with exit code 1
kubectl exec dnstools cat /etc/resolv.conf
的输出nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local reddog.microsoft.com
options ndots:5
kubectl get ep kube-dns --namespace=kube-system
的结果NAME ENDPOINTS AGE
kube-dns 192.168.0.2:53,192.168.0.3:53,192.168.0.2:53 + 3 more... 6d13h
编辑:
直接使用其 Pod IP ping CoreDNS Pod 也会超时:
/ # ping 192.168.0.2
PING 192.168.0.2 (192.168.0.2): 56 data bytes
^C
--- 192.168.0.2 ping statistics ---
24 packets transmitted, 0 packets received, 100% packet loss
编辑:
我认为在设置集群时出了点问题。以下是我在设置集群时采取的步骤:
swapoff -a
禁用交换并通过编辑 /etc/fstab
永久禁用交换apt-get install apt-transport-https ca-certificates curl software-properties-common -y
安装 docker 先决条件curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
添加了 Docker GPG key add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
添加了 Docker 存储库apt-get update -y; -get install docker-ce -y
安装 Docker curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
安装 Kubernetes 先决条件echo 'deb http://apt.kubernetes.io/ kubernetes-xenial main' | sudo tee /etc/apt/sources.list.d/kubernetes.list
添加了 Kubernetes 存储库apt-get update -y; apt-get install kubelet kubeadm kubectl -y
更新 repo 并安装 Kubernetes 组件配置主节点:
kubeadm init --apiserver-advertise-address=10.62.194.4 --apiserver-cert-extra-sans=10.62.194.4 --pod-network-cidr=192.168.0.0/16
$HOME
:mkdir -p $HOME/.kube; sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config; sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubectl apply -f https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/rbac-kdd.yaml; kubectl apply -f https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/kubernetes-datastore/calico-networking/1.7/calico.yaml
安装 Calico 在节点上:
在节点上我做了
kubeadm join
命令使用从 kubeadm token create --print-join-command
打印出来的命令在主人身上
最佳答案
kubernetes 系统 pod 被分配了主机 ip,因为它们提供不依赖于覆盖网络的低级服务(或者在 calico 的情况下甚至提供覆盖网络)。他们有他们运行的节点的IP。
一个普通的 pod 使用覆盖网络并从 calico 范围分配一个 ip,而不是从它们运行的金属节点。
您无法使用 curl 通过 HTTP 访问 DNS(端口 53)。您可以使用 dig
查询 DNS 解析器。
ping 无法访问服务 IP,因为它是一个虚拟 IP,仅用作 kube-proxy 设置的 iptables 规则的路由句柄,因此 TCP 连接有效,但 ICMP 无效。
不过,您可以 ping 一个 pod IP,因为它是从覆盖网络分配的。
关于Kubernetes pod 无法使用 ClusterIP 相互 ping 通,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57248860/