在进行 K8s 集群中的应用部署时,我们经常会使用 Kubernetes 中的 Deployment 来实现应用的自动化部署和扩展。然而,在实际的部署中,我们可能会遇到 Deployment 一直处于 pending 状态的问题,这时候,我们需要对其进行排查和解决。
问题排查
当一个 Deployment 创建之后,它会创建一组 ReplicaSet,并在其中创建一定数量的 Pod。通过 ReplicaSet 确保 Pod 的数量总是符合期望值,如果比期望值少,则根据策略自动创建新的 Pod。但是,在实际应用中,我们可能会发现,Deployment 一直处于 pending 状态,而原因可能是多种多样的。
节点不足
K8s 集群中的节点资源可能会紧张,尤其是当多个 Deployment 同时部署时,会导致节点的资源占用不足。这时候,就需要检查集群资源的使用情况,确认是否存在节点资源不足的情况。
资源配额不足
当节点资源本身充足,但是资源配额不足时,也会导致 Deployment 处于 pending 状态。这时候,需要检查 K8s 集群中的资源配额是否满足应用运行的需求,如果不够,则需要增加配额。
PodTemplateSpec 错误
Deployment 的 PodTemplateSpec 中定义了容器的镜像、端口等信息。如果这些信息有错误或不完整,则 Deployment 也会处于 pending 状态。这时候,需要检查 PodTemplateSpec 中的配置信息是否正确,并且确认相应的镜像已经上传至镜像仓库中。
解决方法
针对不同的 Deployment pending 原因,我们可以采取不同的解决方法。
资源和配额不足
如果节点资源和配额不足,需要增加集群的节点资源并且增加资源配额。可以通过以下步骤实现:
- 扩容工作节点。根据需要增加新的工作节点,从而使得节点资源得到增强。
- 对集群进行扩容。在增加工作节点的同时,可以通过增加 Master 节点或者增加 etcd 节点来达到集群的扩容。
PodTemplateSpec 配置错误
如果 PodTemplateSpec 配置信息存在错误,则需要修改配置信息并且重新部署 Deployment。可以通过以下步骤实现:
- 编辑 Deployment 配置文件,检查 PodTemplateSpec 的配置信息是否正确。
- 修改配置信息,并保存配置文件。
- 执行部署命令。使用 kubectl apply 命令重新部署 Deployment。
示例代码
以下是一个部署 nginx 应用的 Deployment yaml 配置文件,我们通过修改 PodTemplateSpec 中定义的镜像地址和端口号,来模拟一个常见的 Deployment pending 问题。
// javascriptcn.com 代码示例 apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:alpine ports: - containerPort: 8080
我们把其中的 image 地址改成不存在的 nginx 镜像,将容器监听的端口号改为 80 ,应用这个配置文件来部署 Deployment。
部署命令:
# 部署 Deployment nginx-deployment $ kubectl apply -f nginx-deployment.yaml
查看 Deployment 的状态:
$ kubectl get deployment nginx-deployment
发现 Deployment 一直处于 Pending 状态,这是由于镜像地址不存在的错误和监听端口号与配置不一致的原因导致的,修改 Deployment 配置文件后重新部署即可解决问题。
总结
Deployment 是 Kubernetes 应用自动化部署的重要组件,但在实际部署中,很可能会遇到 Deployment 一直处于 pending 状态的问题。通过排查资源紧张、配额不足以及 PodTemplateSpec 错误等原因,我们可以针对性地解决这些问题,并能够更好地应对 K8s 集群中的相关问题。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6530b81f7d4982a6eb247633