Kubernetes coredns豆荚处于待处理状态。无法启动仪表板

时间:2019-04-10 09:38:39

标签: kubernetes

我正在遵循此tuto来构建Kubernetes集群,但是我无法访问kubernetes仪表板。我已经创建了一个与此有关的问题,您可以看到here,但是在深入研究我的集群时,我认为该问题可能在其他地方,这就是为什么我要创建一个新问题。

我通过运行以下命令来启动我的主服务器:

> kubeadm reset 
> kubeadm init --apiserver-advertise-address=[MASTER_IP] > file.txt
> tail -2 file.txt > join.sh # I keep this file for later

> kubectl apply -f https://git.io/weave-kube/

> kubectl -n kube-system get pod
NAME                                READY   STATUS  RESTARTS    AGE
coredns-fb8b8dccf-kb2zq             0/1     Pending 0           2m46s
coredns-fb8b8dccf-nnc5n             0/1     Pending 0           2m46s
etcd-kubemaster                     1/1     Running 0           93s
kube-apiserver-kubemaster           1/1     Running 0           93s
kube-controller-manager-kubemaster  1/1     Running 0           113s
kube-proxy-lxhvs                    1/1     Running 0           2m46s
kube-scheduler-kubemaster           1/1     Running 0           93s

在这里,我们可以看到我有两个coredns吊舱永远处于挂起状态,而当我运行命令时:

> kubectl -n kube-system describe pod coredns-fb8b8dccf-kb2zq

我可以在“事件”部分看到以下警告:

Failed Scheduling : 0/1 nodes are available 1 node(s) had taints that the pod didn't tolerate.

由于这是一个警告而非错误,并且作为Kubernetes的新手,taints对我来说意义不大,所以我尝试将节点连接到主节点(使用先前保存的命令):< / p>

> cat join.sh
kubeadm join [MASTER_IP]:6443 --token [TOKEN] \
    --discovery-token-ca-cert-hash sha256:[ANOTHER_TOKEN]

> ssh [USER]@[WORKER_IP] 'bash' < join.sh

This node has joined the cluster.

在主服务器上,我检查节点是否已连接:

> kubectl get nodes 
NAME        STATUS      ROLES   AGE     VERSION
kubemaster  NotReady    master  13m     v1.14.1
kubeslave1  NotReady    <none>  31s     v1.14.1

然后我检查我的吊舱:

> kubectl -n kube-system get pod
NAME                                READY   STATUS              RESTARTS    AGE
coredns-fb8b8dccf-kb2zq             0/1     Pending             0           14m
coredns-fb8b8dccf-nnc5n             0/1     Pending             0           14m
etcd-kubemaster                     1/1     Running             0           13m
kube-apiserver-kubemaster           1/1     Running             0           13m
kube-controller-manager-kubemaster  1/1     Running             0           13m
kube-proxy-lxhvs                    1/1     Running             0           14m
kube-proxy-xllx4                    0/1     ContainerCreating   0           2m16s
kube-scheduler-kubemaster           1/1     Running             0           13m

我们可以看到已经创建了另一个kube-proxy pod,并停留在ContainerCreating状态。

当我再次进行描述时:

kubectl -n kube-system describe pod kube-proxy-xllx4

我可以在“事件”部分看到多个相同的警告:

Failed create pod sandbox : rpx error: code = Unknown desc = failed pulling image "k8s.gcr.io/pause:3.1": Get https://k8s.gcr.io/v1/_ping: dial tcp: lookup k8s.gcr.io on [::1]:53 read up [::1]43133->[::1]:53: read: connection refused

这是我的存储库:

docker image ls
REPOSITORY                          TAG     
k8s.gcr.io/kube-proxy               v1.14.1 
k8s.gcr.io/kube-apiserver           v1.14.1 
k8s.gcr.io/kube-controller-manager  v1.14.1 
k8s.gcr.io/kube-scheduler           v1.14.1 
k8s.gcr.io/coredns                  1.3.1   
k8s.gcr.io/etcd                     3.3.10  
k8s.gcr.io/pause                    3.1 

因此,对于仪表板部分,我尝试使用命令

启动它
> kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/aio/deploy/recommended/kubernetes-dashboard.yaml

但是仪表板容器处于“挂起”状态。

kubectl -n kube-system get pod
NAME                                    READY   STATUS              RESTARTS    AGE
coredns-fb8b8dccf-kb2zq                 0/1     Pending             0           40m
coredns-fb8b8dccf-nnc5n                 0/1     Pending             0           40m
etcd-kubemaster                         1/1     Running             0           38m
kube-apiserver-kubemaster               1/1     Running             0           38m
kube-controller-manager-kubemaster      1/1     Running             0           39m
kube-proxy-lxhvs                        1/1     Running             0           40m
kube-proxy-xllx4                        0/1     ContainerCreating   0           27m
kube-scheduler-kubemaster               1/1     Running             0           38m
kubernetes-dashboard-5f7b999d65-qn8qn   1/1     Pending             0           8s

因此,尽管我最初的问题是我无法访问仪表板,但我认为真正的问题比那更深。

我知道我只是在这里放了很多信息,但是我是k8s的初学者,对此我完全迷失了。

3 个答案:

答案 0 :(得分:3)

设置自己的集群时,我遇到coredns吊舱卡在挂起模式下的问题;我通过添加pod网络来解决。

由于没有安装网络插件,因此节点被污染为not-ready。安装插件会删除污点,并且Pods可以安排时间。就我而言,添加绒布解决了该问题。

编辑:官方k8s documentation - Create cluster with kubeadm中对此有注释:

  

必须在任何应用程序之前部署网络。 此外,CoreDNS   在安装网络之前不会启动。 仅kubeadm   支持基于容器网络接口(CNI)的网络(并且   不支持kubenet。

答案 1 :(得分:1)

实际上,这是一个深刻或严重的问题的对立面。这是一个琐碎的问题。总是会看到Pod停留在Pending状态,这意味着调度程序很难调度Pod。主要是因为节点上没有足够的资源。

在您的情况下,该节点是taint,并且您的吊舱没有公差。您要做的是描述节点并获得污染:

kubectl describe node | grep -i taints

注意:您可能会有一个以上的异味。因此,您可能想做kubectl describe no NODE,因为使用grep只会看到一个污点。

一旦受到污染,将变成hello=world:NoSchedule之类的东西;这意味着key=value:effect,您将不得不在toleration中添加一个Deployment部分。这是一个示例Deployment,因此您可以看到它的外观:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  replicas: 10
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx
        name: nginx
        ports:
        - containerPort: 80
          name: http
      tolerations:
      - effect: NoExecute       #NoSchedule, PreferNoSchedule
        key: node
        operator: Equal
        value: not-ready
        tolerationSeconds: 3600

如您所见,yaml中有容忍部分。因此,如果我有一个受node=not-ready:NoExecute污染的节点,则除非具有此容忍度,否则无法在该节点上调度Pod。

如果您不需要taint,也可以将其删除。要删除taint,您需要描述节点,获取污点的key并执行以下操作:

kubectl taint node NODE key-

希望有道理。只需将此部分添加到您的部署中,它便会起作用。

答案 2 :(得分:0)

设置绒布网络工具。

运行命令:

$ sysctl net.bridge.bridge-nf-call-iptables=1
$ kubectl apply -f 

https://raw.githubusercontent.com/coreos/flannel/62e44c867a2846fefb68bd5f178daf4da3095ccb/Documentation/kube-flannel.yml