当前位置: 首页 > 知识库问答 >
问题:

Kubernetes CoreDNS吊舱无休止地重新启动

孔鸿云
2023-03-14
    null
    null
Failed to list *v1.Namespace: Get https://10.96.0.1:443/api/v1/namespaces?limit=500&resourceVersion=0: dial tcp 10.96.0.1:443: connect: no route to host
default via 172.16.0.1 dev eth0 proto static metric 100 
10.1.0.0/24 dev eth1 proto kernel scope link src 10.1.0.202 metric 101 
10.244.0.0/24 via 10.244.0.0 dev flannel.1 onlink 
10.244.1.0/24 dev docker0 proto kernel scope link src 10.244.1.1 
10.244.1.0/24 dev cni0 proto kernel scope link src 10.244.1.1 
10.244.2.0/24 via 10.244.2.0 dev flannel.1 onlink 
172.16.0.0/16 dev eth0 proto kernel scope link src 172.16.0.202 metric 100
    null

>

  • 将Kubernetes降级为1.11.3-0
  • 使用kubeadm init-apiserver-advise-address=172.16.0.201-pod-network-cidr=10.244.0.0/16重新初始化了Kubernetes,因为服务器有另一个外部IP,无法通过其他主机访问,而Kubernetes倾向于选择该IP作为API服务器IP。--pod-network-cidr由Flannel授权。
  • 初始化后没有连接节点的结果iptables-l输出

    Chain INPUT (policy ACCEPT)
    target     prot opt source               destination         
    KUBE-EXTERNAL-SERVICES  all  --  anywhere             anywhere             ctstate NEW /* kubernetes externally-visible service portals */
    KUBE-FIREWALL  all  --  anywhere             anywhere            
    
    Chain FORWARD (policy ACCEPT)
    target     prot opt source               destination         
    KUBE-FORWARD  all  --  anywhere             anywhere             /* kubernetes forwarding rules */
    DOCKER-USER  all  --  anywhere             anywhere            
    
    Chain OUTPUT (policy ACCEPT)
    target     prot opt source               destination         
    KUBE-SERVICES  all  --  anywhere             anywhere             ctstate NEW /* kubernetes service portals */
    KUBE-FIREWALL  all  --  anywhere             anywhere            
    
    Chain DOCKER-USER (1 references)
    target     prot opt source               destination         
    RETURN     all  --  anywhere             anywhere            
    
    Chain KUBE-EXTERNAL-SERVICES (1 references)
    target     prot opt source               destination         
    
    Chain KUBE-FIREWALL (2 references)
    target     prot opt source               destination         
    DROP       all  --  anywhere             anywhere             /* kubernetes firewall for dropping marked packets */ mark match 0x8000/0x8000
    
    Chain KUBE-FORWARD (1 references)
    target     prot opt source               destination         
    ACCEPT     all  --  anywhere             anywhere             /* kubernetes forwarding rules */ mark match 0x4000/0x4000
    
    Chain KUBE-SERVICES (1 references)
    target     prot opt source               destination         
    REJECT     udp  --  anywhere             10.96.0.10           /* kube-system/kube-dns:dns has no endpoints */ udp dpt:domain reject-with icmp-port-unreachable
    REJECT     tcp  --  anywhere             10.96.0.10           /* kube-system/kube-dns:dns-tcp has no endpoints */ tcp dpt:domain reject-with icmp-port-unreachable
    

    看起来API服务器已按其应有的方式部署

    $ kubectl get svc kubernetes -o=yaml
    apiVersion: v1
    kind: Service
    metadata:
      creationTimestamp: 2018-10-25T06:58:46Z
      labels:
        component: apiserver
        provider: kubernetes
      name: kubernetes
      namespace: default
      resourceVersion: "6"
      selfLink: /api/v1/namespaces/default/services/kubernetes
      uid: 6b3e4099-d823-11e8-8264-a6f3f1f622f3
    spec:
      clusterIP: 10.96.0.1
      ports:
      - name: https
        port: 443
        protocol: TCP
        targetPort: 6443
      sessionAffinity: None
      type: ClusterIP
    status:
      loadBalancer: {}
    

    然后我将法兰绒网络pod应用于

    kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
    
    Failed to list *v1.Endpoints: Get https://10.96.0.1:443/api/v1/endpoints?limit=500\u0026resourceVersion=0: dial tcp 10.96.0.1:443: connect: no route to host
    
  • 共有1个答案

    孙夕
    2023-03-14

    这基本上是说coredns pod不能与Kube-Apiserver对话。kube-apiserver通过以下环境变量在pod中公开:kubernetes_service_host=10.96.0.1kubernetes_service_port_https=443

    我相信您发布的路由是主机上的路由,因为这是您在pod容器中运行ip routes时得到的结果:

    root@xxxx-xxxxxxxxxx-xxxxx:/# ip route
    default via 169.254.1.1 dev eth0
    169.254.1.1 dev eth0  scope link
    root@xxxx-xxxxxxxxxx-xxxxx:/#
    

    在任何情况下,您都不会看到10.96.0.1,因为它是使用iptables在集群中公开的。那地址是什么?缺省命名空间中的服务称为Kubernetes。该服务的clusterIP10.96.0.1,它正在侦听端口443,它还映射到targetport6443,而这正是您的kube-apiserver正在运行的地方。

    因为您可以部署pods等,所以看起来kube-apiserver没有关闭,这不是您的问题。所以很可能您缺少了该服务(或者某个iptable规则不允许您连接到它)。你可以在这里看到,例如:

    $ kubectl get svc kubernetes
    NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
    kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   92d
    

    完整输出如下所示:

    $ kubectl get svc kubernetes -o=yaml
    apiVersion: v1
    kind: Service
    metadata:
      creationTimestamp: 2018-07-23T21:10:22Z
      labels:
        component: apiserver
        provider: kubernetes
      name: kubernetes
      namespace: default
      resourceVersion: "24"
      selfLink: /api/v1/namespaces/default/services/kubernetes
      uid: xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx
    spec:
      clusterIP: 10.96.0.1
      ports:
      - name: https
        port: 443
        protocol: TCP
        targetPort: 6443
      sessionAffinity: None
      type: ClusterIP
    status:
      loadBalancer: {} 
    

    因此,如果你错过了它,你可以像这样创建它:

    cat <<EOF
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        component: apiserver
        provider: kubernetes
      name: kubernetes
      namespace: default
    spec:
      clusterIP: 10.96.0.1
      ports:
      - name: https
        port: 443
        protocol: TCP
        targetPort: 6443
      sessionAffinity: None
      type: ClusterIP
    EOF | kubectl apply -f -
    
     类似资料:
    • 我们正在使用Docker 1.19运行库伯内特斯(1.18) Container是一个基于Java13的Spring启动应用程序(使用基本图像作为openjdk: 13-alpin),下面是内存设置。 豆荚: 内存-最小448M,最大2500M cpu-最小值0.1 容器: Xms:256M,Xmx:512M 当流量发送更长时间时,容器会突然重新启动;在Prometheus中,我可以看到Pod内存

    • 我已经在节点(node1)上的pod(pod1)上部署了一个Spring Boot应用程序。我还在不同节点(node2)上的另一个pod(pod2)上部署了JMeter。我试图从POD2执行自动负载测试。为了执行负载测试,我要求为每个测试用例重新启动pod1。如何从POD2重新启动pod1?

    • 我的Java微服务正在AWS EC2实例上托管的k8s集群中运行。 我有大约30个微服务(nodejs和Java8的良好组合)在K8s集群中运行。我面临一个挑战,我的java应用程序pods意外重启,导致应用程序5xx数量增加。 为了调试它,我在pod和应用程序中启动了一个newrelic代理,并找到了以下图表: 在我可以看到的地方,我的Xmx值为6GB,我的用途最大为5.2GB。 这清楚地表明J

    • 迷你库版本v0.24.1 kubernetes 1.8.0版 我面临的问题是,我在minikube中创建了几个,每个都有一个pod。 有时,当我启动minikube时,我的吊舱会先启动,然后由kubernetes重新启动。它们将一次又一次地从创建容器状态到运行状态,再到终止状态。 现在,我已经看到kubernetes杀死和重启的东西之前,如果kubernetes检测到磁盘压力,内存压力,或其他类似

    • 我试图了解如何最好地使用库伯内特的准备和活跃度探测器。我在测试时观察到的是,如果就绪探测失败,则pod被标记为未就绪,并从负载均衡器中移除。然而,然后我希望启动一个新的pod并将其移入负载均衡器,直到原来的pod再次准备就绪(或者它的活性探测失败并被杀死),然后它们中的一个可以被终止。 如果就绪探测失败,我们可能想要暂时从服务中移除一个pod,但这似乎会冒着所有pod都未就绪的风险,这将导致负载均