简体   繁体   English

Kubernetes Pods状态始终处于待定状态

[英]Kubernetes Pods status is always pending

Please help me. 请帮我。 I'm following this guide: https://pleasereleaseme.net/deploy-a-dockerized-asp-net-core-application-to-kubernetes-on-azure-using-a-vsts-ci-cd-pipeline-part-1/ . 我正在遵循本指南: https//pleasereleaseme.net/deploy-a-dockerized-asp-net-core-application-to-kubernetes-on-azure-using-a-vsts-ci-cd-pipeline-part -1 / My docker images is successfully built and pushed to my private container registry and my CD pipeline is okay as well. 我的docker镜像已成功构建并推送到我的私有容器注册表,我的CD管道也可以。 But when I tried to check it using kubectl get pods the status is always pending, when I tried to use kubectl describe pod k8s-aspnetcore-deployment-64648bb5ff-fxg2k the message is: 但是当我尝试使用kubectl获取pod来检查它时状态总是挂起,当我尝试使用kubectl describe pod k8s-aspnetcore-deployment-64648bb5ff-fxg2k ,消息是:

Name:           k8s-aspnetcore-deployment-64648bb5ff-fxg2k
Namespace:      default
Node:           <none>
Labels:         app=k8s-aspnetcore
                pod-template-hash=2020466199
Annotations:    <none>
Status:         Pending
IP:
Controlled By:  ReplicaSet/k8s-aspnetcore-deployment-64648bb5ff
Containers:
  k8s-aspnetcore:
    Image:        mycontainerregistryb007.azurecr.io/k8saspnetcore:2033
    Port:         80/TCP
    Environment:  <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-tr892 (ro)
Conditions:
  Type           Status
  PodScheduled   False
Volumes:
  default-token-tr892:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-tr892
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  beta.kubernetes.io/os=windows
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type     Reason            Age                From               Message
  ----     ------            ----               ----               -------
  Warning  FailedScheduling  3m (x57 over 19m)  default-scheduler  0/1 nodes are available: 1 MatchNodeSelector.

Here is for kubectl describe deployment: 这是针对kubectl描述部署的:

Name:                   k8s-aspnetcore-deployment
Namespace:              default
CreationTimestamp:      Sat, 21 Jul 2018 13:41:52 +0000
Labels:                 app=k8s-aspnetcore
Annotations:            deployment.kubernetes.io/revision=2
Selector:               app=k8s-aspnetcore
Replicas:               1 desired | 1 updated | 1 total | 0 available | 1 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        5
RollingUpdateStrategy:  1 max unavailable, 1 max surge
Pod Template:
  Labels:  app=k8s-aspnetcore
  Containers:
   k8s-aspnetcore:
    Image:        mycontainerregistryb007.azurecr.io/k8saspnetcore:2033
    Port:         80/TCP
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
OldReplicaSets:  <none>
NewReplicaSet:   k8s-aspnetcore-deployment-64648bb5ff (1/1 replicas created)
Events:
  Type    Reason             Age   From                   Message
  ----    ------             ----  ----                   -------
  Normal  ScalingReplicaSet  26m   deployment-controller  Scaled up replica set k8s-aspnetcore-deployment-7f756cc78c to 1
  Normal  ScalingReplicaSet  26m   deployment-controller  Scaled up replica set k8s-aspnetcore-deployment-64648bb5ff to 1
  Normal  ScalingReplicaSet  26m   deployment-controller  Scaled down replica set k8s-aspnetcore-deployment-7f756cc78c to 0

Here is for kubectl describe service: 这是kubectl描述服务:

Name:                     k8s-aspnetcore-service
Namespace:                default
Labels:                   version=test
Annotations:              <none>
Selector:                 app=k8s-aspnetcore
Type:                     LoadBalancer
IP:                       10.0.26.188
LoadBalancer Ingress:     40.112.73.28
Port:                     <unset>  80/TCP
TargetPort:               80/TCP
NodePort:                 <unset>  30282/TCP
Endpoints:                <none>
Session Affinity:         None
External Traffic Policy:  Cluster
Events:
  Type    Reason                Age   From                Message
  ----    ------                ----  ----                -------
  Normal  EnsuringLoadBalancer  26m   service-controller  Ensuring load balancer
  Normal  EnsuredLoadBalancer   25m   service-controller  Ensured load balancer

I don't know if my setup for Kubernetes Cluster is wrong, but here is the script I used: 我不知道我对Kubernetes Cluster的设置是否错误,但这是我使用的脚本:

#!/bin/bash

azureSubscriptionId="xxxxxxx-xxxxx-xxxx-xxx-xxxxxxxx"
resourceGroup="k8sResourceGroup"
clusterName="k8sCluster"
location="northeurope"

# Useful if you have more than one Aure subscription
az account set --subscription $azureSubscriptionId

# Resource group for cluster - only availble in certain regions at time of writing
az group create --location $location --name $resourceGroup

# Create actual cluster
az aks create --resource-group $resourceGroup --name $clusterName --node-count 1 --generate-ssh-keys

# Creates a config file at ~/.kube on local machine to tell kubectl which cluster it should work with
az aks get-credentials --resource-group $resourceGroup --name $clusterName

Here is my deployment.yaml: 这是我的deployment.yaml:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: k8s-aspnetcore-deployment
spec:
  replicas: 1
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
  minReadySeconds: 5
  template:
    metadata:
      labels:
        app: k8s-aspnetcore
    spec:
      containers:
      - name: k8s-aspnetcore
        image: mycontainerregistryb007.azurecr.io/k8saspnetcore
        ports:
        - containerPort: 80
      imagePullSecrets:
        - name: k8ssecret
      nodeSelector:
        "beta.kubernetes.io/os": windows

Here is my service.yaml: 这是我的service.yaml:

kind: Service
metadata:
  name: k8s-aspnetcore-service
  labels:
    version: test
spec:
  selector:
    app: k8s-aspnetcore
  ports:
  - port: 80
  type: LoadBalancer

The reason they are in Pending state is described in the message at the bottom of the describe pod output: MatchNodeSelector . 它们处于Pending状态的原因在describe pod输出底部的消息中describe podMatchNodeSelector That means Kubernetes didn't find a Node in your cluster that was able to fulfill the Node selection criteria specified in the PodSpec. 这意味着Kubernetes在您的集群中找不到能够满足PodSpec中指定的节点选择标准的节点。

Specifically, it's very likely these lines: 具体来说,这些线很可能是:

nodeSelector:
    "beta.kubernetes.io/os": windows

Only a kubectl describe nodes would tell if there are any Nodes that could possibly fulfill that criteria 只有kubectl describe nodes才会告诉是否有任何节点可能满足该条件

Just to build upon what @Matthew L Daniel has mentioned, the label-key "beta.kubernetes.io/os" is one of the default labels that come pre-populated in any Kubernetes Node , and which indicates the underlying OS. 仅仅基于@Matthew L Daniel提到的内容,标签密钥"beta.kubernetes.io/os"是预先填充在任何Kubernetes Node中的默认标签之一,它表示底层操作系统。

By providing a label definition for the nodeSelector property of the Pod specification, you are telling the scheduler that you want the Pods managed by the Deployment object to only land on a Node which matches this criteria, meaning that they have to be placed in a Node running the Windows OS. 通过提供一个label的定义nodeSelector的财产Pod规范,你告诉你想要的调度Pods由管理Deployment对象上唯一的土地Node相匹配这个标准,这意味着它们必须被放置在一个节点运行Windows操作系统。

  • But what if there's no Node matching such criteria ? 但是,如果没有Node匹配这样的标准怎么办?

The following description command was ran on the cluster setup created by Minikube. 在Minikube创建的集群设置上运行了以下描述命令。 The cluster is a single-node configuration, and the node name is minikube. 群集是单节点配置,节点名称是minikube。

kubectl describe nodes minikube

The relevant part of description output was the following: 描述输出的相关部分如下:

Name:               minikube
Roles:              master
Labels:             beta.kubernetes.io/arch=amd64
                    beta.kubernetes.io/os=linux
                    kubernetes.io/hostname=minikube
                    node-role.kubernetes.io/master=
Annotations:        node.alpha.kubernetes.io/ttl=0
                    volumes.kubernetes.io/controller-managed-attach-detach=true
CreationTimestamp:  Wed, 11 Jul 2018 00:32:43 +0100
Taints:             <none>
Unschedulable:      false

As you can see on the Labels section there exists a definition for the label-key "beta.kubernetes.io/os" , but instead of being set to a value of "windows" is set to "linux" instead. 正如您在Labels部分所看到的, Labels"beta.kubernetes.io/os"的定义,但不是设置为“windows”的值而是设置为“linux”。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM