k8s部署yaml时一直处于Pending状态问题

本文介绍在Kubernetes环境中部署Nginx时遇到的Pending状态问题及解决方法,包括调整YAML配置文件中的nodeSelector选项和修改节点标签。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.在k8s环境中使用nginx-deployment.yaml部署一个nginx

[root@k8s-master nginx]# cat nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx
  name: nginx-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:1.14.0
        name: nginx
      nodeSelector:
        type: nginx
      tolerations:
      - key: "key"
        operator: "Equal"
        value: "nginx"
        effect: "NoSchedule"

2.查询状态,一直显示为Pending状态,所有节点尝试手动下载镜像,发现还是这个问题。

[root@k8s-master nginx]# kubectl get pods -o wide
NAME                                READY   STATUS    RESTARTS   AGE     IP           NODE        NOMINATED NODE   READINESS GATES
cloud-flaskapp-6c785ddd7b-dnhrp     1/1     Running   0          4d17h   10.244.2.2   k8s-node2   <none>           <none>
nginx-deployment-74bbc7fff8-425r9   0/1     Pending   0          12s     <none>       <none>      <none>           <none>
nginx-deployment-8464c54f76-mmg6l   0/1     Pending   0          15s     <none>       <none>      <none>           <none>

3.查看pod的详细信息,发现最后提示Warning FailedScheduling default-scheduler 0/3 nodes are available: 3 node(s) didn’t match node selector.

[root@k8s-master nginx]# kubectl describe pod nginx-deployment-8464c54f76-mmg6l
Name:           nginx-deployment-8464c54f76-mmg6l
Namespace:      default
Priority:       0
Node:           <none>
Labels:         app=nginx
                pod-template-hash=8464c54f76
Annotations:    kubectl.kubernetes.io/restartedAt: 2021-01-18T10:19:42+08:00
Status:         Pending
IP:             
IPs:            <none>
Controlled By:  ReplicaSet/nginx-deployment-8464c54f76
Containers:
  nginx:
    Image:        nginx:1.14.0
    Port:         <none>
    Host Port:    <none>
    Environment:  <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-bzdrm (ro)
Conditions:
  Type           Status
  PodScheduled   False
Volumes:
  default-token-bzdrm:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-bzdrm
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  type=nginx
Tolerations:     key=nginx:NoSchedule
                 node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type     Reason            Age        From               Message
  ----     ------            ----       ----               -------
  Warning  FailedScheduling  <unknown>  default-scheduler  0/3 nodes are available: 3 node(s) didn't match node selector.
  Warning  FailedScheduling  <unknown>  default-scheduler  0/3 nodes are available: 3 node(s) didn't match node selector.

4.解决方式,修改yaml文件,将nodeSelector注释掉

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx
  name: nginx-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:1.14.0
        name: nginx
#      nodeSelector:
#        type: nginx
      tolerations:
      - key: "key"
        operator: "Equal"
        value: "nginx"
        effect: "NoSchedule"

5.再在k8s中启动nginx-deployment.yaml,查看pod状态。

[root@k8s-master nginx]# kubectl apply -f nginx-deployment.yaml
deployment.apps/nginx-deployment created
[root@k8s-master nginx]# kubectl get pod -o wide
NAME                                READY   STATUS    RESTARTS   AGE     IP           NODE        NOMINATED NODE   READINESS GATES
cloud-flaskapp-6c785ddd7b-dnhrp     1/1     Running   0          4d17h   10.244.2.2   k8s-node2   <none>           <none>
nginx-deployment-7b988d8687-vrkvw   1/1     Running   0          8s      10.244.2.3   k8s-node2   <none>           <none>

6.另外一种方式,也可以修改k8s节点中,将node节点添加type=nginx的label,也是可以的。
查看当前节点信息

[root@k8s-master nginx]# kubectl  get node -o wide --show-labels
NAME         STATUS   ROLES    AGE     VERSION   INTERNAL-IP    EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION              CONTAINER-RUNTIME   LABELS
k8s-master   Ready    master   6d20h   v1.17.0   172.30.18.19   <none>        CentOS Linux 7 (Core)   3.10.0-862.2.3.el7.x86_64   docker://20.10.2    beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-master,kubernetes.io/os=linux,node-role.kubernetes.io/master=
k8s-node1    Ready    worker   6d20h   v1.17.0   172.30.18.15   <none>        CentOS Linux 7 (Core)   3.10.0-862.2.3.el7.x86_64   docker://20.10.2    beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node1,kubernetes.io/os=linux,node-role.kubernetes.io/worker=worker
k8s-node2    Ready    <none>   6d19h   v1.17.0   172.30.18.10   <none>        CentOS Linux 7 (Core)   3.10.0-862.2.3.el7.x86_64   docker://20.10.2    beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node2,kubernetes.io/os=linux

修改k8s-node1节点label为type=nginx,在k8s-node1节点信息最后会添加type=nginx的信息。

[root@k8s-master nginx]# kubectl  label nodes k8s-node1 type=nginx
node/k8s-node1 labeled
[root@k8s-master nginx]# kubectl  get node -o wide --show-labels
k8s-master   Ready    master   6d20h   v1.17.0   172.30.18.19   <none>        CentOS Linux 7 (Core)   3.10.0-862.2.3.el7.x86_64   docker://20.10.2    beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-master,kubernetes.io/os=linux,node-role.kubernetes.io/master=
k8s-node1    Ready    worker   6d20h   v1.17.0   172.30.18.15   <none>        CentOS Linux 7 (Core)   3.10.0-862.2.3.el7.x86_64   docker://20.10.2    beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node1,kubernetes.io/os=linux,node-role.kubernetes.io/worker=worker,type=nginx
k8s-node2    Ready    <none>   6d19h   v1.17.0   172.30.18.10   <none>        CentOS Linux 7 (Core)   3.10.0-862.2.3.el7.x86_64   docker://20.10.2    beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node2,kubernetes.io/os=linux

再运行nginx-deployment.yaml,这个文件中没有注释nodeSelector两行代码。

[root@k8s-master nginx]# kubectl apply -f nginx-deployment.yaml
deployment.apps/nginx-deployment created
[root@k8s-master nginx]# kubectl get pods -o wide
NAME                                READY   STATUS    RESTARTS   AGE     IP            NODE        NOMINATED NODE   READINESS GATES
cloud-flaskapp-6c785ddd7b-dnhrp     1/1     Running   0          4d18h   10.244.2.2    k8s-node2   <none>           <none>
nginx-deployment-84fdbd9f54-4cpsp   1/1     Running   0          108s    10.244.1.11   k8s-node1   <none>           <none>
### Kubernetes 部署指南与最佳实践 #### 1. 基础环境准备 在开始部署之前,确保满足以下基础条件: - **Kubernetes 版本**:目标集群需运行 Kubernetes v1.10 或更高版本[^1]。 - **CLI 工具**:已安装并配置好 `kubectl`,能够顺利连接至目标 Kubernetes 集群。 - **网络插件**:推荐使用支持 CNI(Container Network Interface)标准的网络插件完成 Pod 和 Service 的通信设置[^5]。 #### 2. Helm 安装与配置 Helm 是 Kubernetes 应用程序包管理器,用于简化复杂应用的部署过程。以下是其基本安装流程: - 确认操作系统兼容性后下载对应版本的 Helm 客户端,并按照官方文档指引完成初始化操作。 - 初始化 Tiller(服务器组件),并通过 RBAC 权限控制保障安全性。 ```bash helm version helm repo add stable https://charts.helm.sh/stable helm search repo stable ``` #### 3. ArgoCD 实现持续交付 为了达成自动化、声明式的 CI/CD 流程,可以引入 ArgoCD 工具作为解决方案之一。ArgoCD 能够依据 Git 存储库内的定义文件同步更新生产环境中各服务的状态[^2]: - 设置 GitOps 流水线,通过 Webhook 接收代码提交事件触发重新部署动作; - 利用自定义资源定义(CRD)扩展功能范围,比如蓝绿发布策略或者金丝雀测试计划。 #### 4. EFK 日志收集体系构建 日志管理系统对于排查问题至关重要,在 k8s 场景下通常采用 Elasticsearch + Fluentd + Kibana 组合形式搭建集中式记录平台[^4]: ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: fluentd-elasticsearch spec: selector: matchLabels: app: fluentd-elasticsearch template: metadata: labels: app: fluentd-elasticsearch spec: containers: - name: fluentd-elasticsearch image: quay.io/fluentd_elasticsearch/fluentd:v3.2.0 volumeMounts: ... ``` > 注明以上 YAML 文件仅为示意片段,请参照具体需求调整字段值后再执行加载命令。 #### 5. 故障排除技巧 当遇到某些异常状况,例如 Pods 始终处于 Pending 状态,则可能是由于调度失败引起;此可通过描述该实例获取更详细的错误提示信息进一步分析原因所在。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值