Kubernetes pod 无法使用 ClusterIP 相互 ping 通

标签 kubernetes

我正在尝试使用分配给 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

编辑:
我认为在设置集群时出了点问题。以下是我在设置集群时采取的步骤:
  • 编辑 master 和 worker 上的主机文件以包含节点的 IP 和主机名
  • 使用 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
  • 将 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
  • 使用 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/

    相关文章:

    kubernetes - 如何使用Client-Go获取有关节点创建的AWS metdata

    kubernetes DNS - 让服务通过 DNS 自行联系

    kubernetes - Apache Mesos 做了哪些 Kubernetes 不能做的事情,反之亦然?

    azure - 在 Azure 中使用 terraform 创建 kubernetes 集群后,如何自动对其进行身份验证?

    ssl - 外部服务的 Istio 直通不起作用

    kubernetes - 这个 yaml 的等效 kubectl 命令是什么?

    amazon-web-services - Kubernetes Ingress-Controller 和 AWS API Gateway 客户端证书

    Kubernetes 作业无法识别 Pod 中的 fsGroup

    http - 是否可以使用 HTTP(而非 HTTPS)获得客户端证书?

    kubernetes - 为GKE部署,服务等启用REST API