kubernetes - Kubernetes Pod 无法使用 ClusterIP 互相 ping
问题描述
我正在尝试使用分配给 kube-dns 服务的集群 IP 从 dnstools pod ping kube-dns 服务。ping 请求超时。在同一个 dnstools pod 中,我尝试使用暴露的端口卷曲 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,而另一些 pod 的 IP 等于我的节点/master 的 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
编辑:我认为在设置集群时出了点问题。以下是我在设置集群时采取的步骤:
- 编辑 master 和 worker 上的主机文件以包含节点的 IP 和主机名
swapoff -a
通过编辑禁用交换使用和永久禁用交换/etc/fstab
- 使用安装 docker 先决条件
apt-get install apt-transport-https ca-certificates curl software-properties-common -y
- 添加 Docker GPG 密钥使用
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
- 添加 Docker repo 使用
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
- 使用安装 Kubernetes 先决条件
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
- 使用更新 repo 并安装 Kubernetes 组件
apt-get update -y; apt-get install kubelet kubeadm kubectl -y
配置主节点:
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
- 将 Kube 配置复制到
$HOME
:mkdir -p $HOME/.kube; sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config; sudo chown $(id -u):$(id -g) $HOME/.kube/config
- 使用安装 Calico
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
在节点上:在节点上,我使用从主机上kubeadm join
打印出来的命令执行了命令kubeadm token create --print-join-command
解决方案
Kubernetes 系统 pod 被分配主机 ip,因为它们提供不依赖于覆盖网络的低级服务(或者在 calico 的情况下甚至提供覆盖网络)。他们有他们运行的节点的 ip。
一个普通的 pod 使用覆盖网络并从 calico 范围内分配一个 ip,而不是从它们运行的金属节点分配一个 ip。
您无法使用 curl 通过 HTTP 访问 DNS(端口 53)。您可以使用dig
查询 DNS 解析器。ping 无法访问服务 IP,因为它是一个虚拟 IP,仅用作 kube-proxy 设置的 iptables 规则的路由句柄,因此 TCP 连接有效,但 ICMP 无效。不过,您可以 ping 一个 pod IP,因为它是从覆盖网络分配的。
推荐阅读
- javascript - 如何将动态创建的文本框值从 javascript 传递到 mvc 控制器
- c# - 用c#在2个sql server数据库之间进行数据翻译#
- machine-learning - 稀疏张量没有步幅
- xml - 明智地保存和读取更改的配置(存储在 XML 文件中)
- python - GitHub 上 Jupyter 笔记本中的目录
- node.js - 尝试重构 Express 路线
- android - 如何使用最新的 R8 Shrinker 版本
- git - 提交的作者应该如何处理历史重写(Git)的作者日期?
- sql-server - SQL Server 在将数据插入复合聚集主键时强制将 nvarchar 转换为 int
- webgl - WebGLError uniformMatrix4fv