Kubernetes的GC不会删除已退出的Docker容器

时间:2017-05-16 13:28:14

标签: kubernetes

我有一个运行Kubernetes 1.6.1的3个节点的集群,每个节点有2个CPU和4G RAM。

我通过替换传递给容器的环境变量值,通过更新pod模板哈希来不断地使用相同的Docker标记重新部署我的应用程序。

sed "s/THIS_STRING_IS_REPLACED_DURING_BUILD/$(date)/g" nginx-deployment.yml | kubectl replace -f -

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
        env:
        - name: FOR_GODS_SAKE_PLEASE_REDEPLOY
          value: 'THIS_STRING_IS_REPLACED_DURING_BUILD'

如果我这样做了几百次,我再也无法重新部署 - 新的pod正处于Pending状态。 kubectl get events生成以下内容:

Events:
  FirstSeen LastSeen    Count   From            SubObjectPath   Type        Reason          Message
  --------- --------    -----   ----            -------------   --------    ------          -------
  1h        50s     379 default-scheduler           Warning     
FailedScheduling    No nodes are available that match all of the following predicates:: Insufficient pods (3). 

与此同时,我可以在每个Kube节点上看到大约200个已退出的nginx容器。

查看kube-controller-manager日志我可以看到PodGC正在尝试删除一些pod,但找不到它们。

I0516 12:53:41.137311       1 gc_controller.go:175] Found unscheduled terminating Pod nginx-deployment-2927112463-qczvv not assigned to any Node. Deleting.
I0516 12:53:41.137320       1 gc_controller.go:62] PodGC is force deleting Pod: default:nginx-deployment-2927112463-qczvv
E0516 12:53:41.190592       1 gc_controller.go:177] pods "nginx-deployment-2927112463-qczvv" not found
I0516 12:53:41.195020       1 gc_controller.go:175] Found unscheduled terminating Pod nginx-deployment-3265736979-jrpzb not assigned to any Node. Deleting.
I0516 12:53:41.195048       1 gc_controller.go:62] PodGC is force deleting Pod: default:nginx-deployment-3265736979-jrpzb
E0516 12:53:41.238307       1 gc_controller.go:177] pods "nginx-deployment-3265736979-jrpzb" not found

我能做些什么来阻止这种情况发生吗?

2 个答案:

答案 0 :(得分:1)

Kubernetes允许您调整kubelet的垃圾收集标志。这可以通过更改标记--maximum-dead-containers--maximum-dead-containers-per-container来完成。在这里阅读更多关于它的文章:

答案 1 :(得分:0)

我认为你的节点已经耗尽了所有资源。调度程序找不到任何节点来安排pod。由于pod未安排到任何节点,因此PodGC无法删除您的pod。

我认为你应该仔细检查为什么你的资源已经耗尽。