首页 > 解决方案 > Pod 在单节点 Kubernetes 集群上处于 Pending 状态

问题描述

我正在使用该文件在托管机器上使用一些复制因子YAML来部署容器。Kubernetes

YAML 文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mojo-deployment
  labels:
    app: mojo
spec:
  selector:
    matchLabels:
      app: mojo
  replicas: 3
  template:
    metadata:
      labels:
        app: mojo
    spec:
      containers:
        - name: mojo
          image: mojo:1.0.1
          ports:
            - containerPort: 9000

---
#Services Info
apiVersion: v1
kind: Service
metadata:
  name: mojo-services
spec:
  selector:
    app: mojo
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9376

---

#Ingress Configuration
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: mojo-ingress
  annotations:
    kubernetes.io/ingress.class: mojo
spec:
  backend:
    serviceName: mojo-services
    servicePort: 80

脚步:

  1. Docker使用 `docker build -t mojo:1.0构建镜像。
  2. docker image ls给我一个图像ID。
  3. 跳过docker build命令以在容器上部署映像。我需要这样做吗?或kubectl服务会照顾它。
  4. 运行kubectl apply -f Prod.yaml。表明

deployment.apps/mojo-deployment 创建

服务/mojo 服务已创建

ingress.networking.k8s.io/mojo-ingress 创建

  1. kubectl get service返回

  2. kubectl get pod返回
  3. kubectl get deployment返回 在此处输入图像描述

问题?

  1. 我需要在部署YAML文件之前构建容器吗?我试过了,但仍然kubernetes没有运行。

  2. 为什么所有 pod 都显示Pending状态。

  3. 部署也显示pending状态。

  4. 虽然我正在尝试Ingress使用 :80 访问但无法访问它。

编辑

吊舱描述

Name:           mojo-deployment-6665bdc557-s57m7
Namespace:      default
Priority:       0
Node:           <none>
Labels:         app=mojo
            pod-template-hash=6665bdc557
Annotations:    <none>
Status:         Pending
IP:            
IPs:            <none>
Controlled By:  ReplicaSet/mojo-deployment-6665bdc557
Containers:
mojo:
 Image:        mojo:1.0
 Port:         9000/TCP
 Host Port:    0/TCP
 Environment:  <none>
 Mounts:
 /var/run/secrets/kubernetes.io/serviceaccount from default-token-tjx6p 
(ro)
Conditions:
Type           Status
PodScheduled   False
Volumes:
default-token-tjx6p:
 Type:        Secret (a volume populated by a Secret)
 SecretName:  default-token-tjx6p
 Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
            node.kubernetes.io/unreachable:NoExecute for 300s
 Events:
  Type     Reason            Age                 From               

消息 ---- ------ ---- ---- -------- 警告 FailedScheduling 70s (x45 over 67m) default-scheduler 0/1 个节点可用:1 个节点是无法安排。

编辑 2

从主节点移除污点后。1.kubectl get node退货

  1. kubectl get pod返回

  1. kubectl describe nodehttps ://gist.github.com/amixpal/333bffd6ab91def749267f30d4ffb079

标签: dockerkubernetesdockerfilecontainerskubernetes-ingress

解决方案


如果您只有一个节点(主节点),那么通常会添加一个污点,这将使主节点无法调度。使用以下命令从主节点(以及所有其他节点,如果有多个节点)中删除污点。

kubectl taint nodes --all node-role.kubernetes.io/master-

编辑:根据节点描述输出,CNI 未准备好。请确保所有与 CNI 相关的 Pod 都在运行且健康


推荐阅读