单节点Kubernetes集群上的Pod处于待处理状态

时间:2019-11-24 07:35:36

标签: docker kubernetes dockerfile containers kubernetes-ingress

我正在使用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 build -t mojo:1.0构建Docker映像。
  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返回 enter image description here

问题?

  1. 在部署YAML文件之前是否需要构建容器?我尝试过,但kubernetes仍未运行。

  2. 为什么所有广告连播都显示Pending状态。

  3. 部署也显示pending状态。

  4. 尽管我尝试使用:80访问Ingress,但无法访问它。

编辑

吊舱说明

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               

消息     ---- ------ ---- ---- -------     警告失败排定70秒(x45超过67m)默认排程器0/1     节点可用:1个节点不可调度。

编辑2

从主节点上移除异味后。  1. kubectl get node返回

  1. kubectl get pod返回

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

2 个答案:

答案 0 :(得分:1)

如果只有一个节点(主节点),则通常会添加一个Taint,这将使主节点无法计划。使用以下方法从主节点(以及所有其他节点,如果有多个节点)中删除污点。

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

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

答案 1 :(得分:0)

  1. 您的容器清单应包含可下载的docker映像,或者k8s节点应已包含docker映像:
containers:
        - name: mojo
          image: mojo:1.0.1
          ports:
            - containerPort: 9000

请回答:您的mojo:1.0.1 docker映像如何出现在kubernetes节点上?

  1. 所有吊舱都等待图像可用。

  2. 等待所有Pod的部署将处于Running状态。

  3. K8s服务可在部署准备就绪后使入口可用。