Kubernetes监控服务heapster不断重启

Kubernetes monitoring service heapster keeps restarting

我是运行一个使用azure容器引擎的kubernetes集群。我对其中一项 kubernetes 服务有疑问,该服务进行资源监控 heapster。 Pod 每分钟或类似时间重新启动一次。我尝试删除堆部署、复制集和 pods,然后重新创建部署。它立即返回相同的行为。

当我查看带有 heapster 标签的资源时,它看起来有点奇怪:

$ kubectl get deploy,rs,po -l k8s-app=heapster --namespace=kube-system
NAME              DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deploy/heapster   1         1         1            1           17h

NAME                     DESIRED   CURRENT   READY     AGE
rs/heapster-2708163903   1         1         1         17h
rs/heapster-867061013    0         0         0         17h

NAME                           READY     STATUS    RESTARTS   AGE
po/heapster-2708163903-vvs1d   2/2       Running   0          0s

由于某种原因,有两个副本集。即使我删除了所有资源并重新部署,名为 rs/heapster-867061013 的资源仍会重新出现。上面还显示 pod 刚刚启动,这是它不断创建的问题,然后它运行了几秒钟并创建了一个新的 pod。我是 运行 kubernetes 的新手,所以我不确定哪些日志文件与此问题相关。

heapster 容器中的日志

heapster.go:72] /heapster source=kubernetes.summary_api:""
heapster.go:73] Heapster version v1.3.0
configs.go:61] Using Kubernetes client with master "https://10.0.0.1:443" and version v1
configs.go:62] Using kubelet port 10255
heapster.go:196] Starting with Metric Sink
heapster.go:106] Starting heapster on port 8082

来自 heapster-nanny 容器的日志

pod_nanny.go:56] Invoked by [/pod_nanny --cpu=80m --extra-cpu=0.5m --memory=140Mi --extra-memory=4Mi --threshold=5 --deployment=heapster --container=heapster --poll-period=300000 --estimator=exponential]
pod_nanny.go:68] Watching namespace: kube-system, pod: heapster-2708163903-mqlsq, container: heapster.
pod_nanny.go:69] cpu: 80m, extra_cpu: 0.5m, memory: 140Mi, extra_memory: 4Mi, storage: MISSING, extra_storage: 0Gi
pod_nanny.go:110] Resources: [{Base:{i:{value:80 scale:-3} d:{Dec:<nil>} s:80m Format:DecimalSI} ExtraPerNode:{i:{value:5 scale:-4} d:{Dec:<nil>} s: Format:DecimalSI} Name:cpu} {Base:{i:{value:146800640 scale:0} d:{Dec:<nil>} s:140Mi Format:BinarySI} ExtraPerNode:{i:{value:4194304 scale:0} d:{Dec:<nil>} s:4Mi Format:BinarySI} Name:memory}]

Deployment Controller 保留旧的 ReplicaSet 资源以进行快速回滚是完全正常且重要的。

Deployment 资源管理 ReplicaSet 资源。您的 heapster Deployment 配置为 运行 1 个 pod - 这意味着它将始终尝试创建一个具有 1 个 pod 的 ReplicaSet。如果您对 Deployment 进行了更新(例如,一个新的 heapster 版本),那么 Deployment 资源会创建一个新的 ReplicaSet,它将使用新版本调度一个 pod。同时,旧的 ReplicaSet 资源将其期望的 pods 设置为 0,但资源本身仍然保留以便于回滚。可以看到,旧的ReplicaSetrs/heapster-867061013有0pods运行ning。如果您进行回滚,部署 deploy/heapster 会将 rs/heapster-867061013 中 pods 的数量增加到 1,并将 rs/heapster-2708163903 中的数量减少回 0。您还应该检查documentation 关于 Deployment Controller(如果您还没有完成)。

不过,我还是觉得奇怪,为什么您新创建的 Deployment Controller 会立即创建 2 个 ReplicaSet。在删除 Deployment Controller 之后和创建新的 Deployment Controller 之前,您是否等待了几秒钟(比如 20 秒)?对我来说,删除在整个集群中传播之前有时需要一些时间,如果我重新创建得太快,那么相同的资源就会被重用。

关于您提到的 heapster pod 娱乐:pods 有一个 restartPolicy。如果设置为 Never,pod 将在其退出时由其 ReplicaSet 重新创建(这意味着将创建一个新的 pod 资源并删除旧资源)。我的猜测是您的 heapster pod 设置了此 Never 策略。它可能由于某些错误而退出并达到 Failed 状态(您需要使用日志进行检查)。不久之后,ReplicaSet 会创建一个新的 pod。

OK,原来是azure容器服务默认的kubernetes配置出了问题。我得到了 azure 支持者的一些帮助。

通过将标签 addonmanager.kubernetes.io/mode: EnsureExists 添加到 heapster 部署来解决该问题。这是支持者引用的拉取请求:https://github.com/Azure/acs-engine/pull/1133