2014-06-07 07:40:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								/ * 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-02 00:19:44 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								Copyright  2015  The  Kubernetes  Authors  All  rights  reserved . 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-07 07:40:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Licensed  under  the  Apache  License ,  Version  2.0  ( the  "License" ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								you  may  not  use  this  file  except  in  compliance  with  the  License . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								You  may  obtain  a  copy  of  the  License  at 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    http : //www.apache.org/licenses/LICENSE-2.0
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Unless  required  by  applicable  law  or  agreed  to  in  writing ,  software 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								distributed  under  the  License  is  distributed  on  an  "AS IS"  BASIS , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								WITHOUT  WARRANTIES  OR  CONDITIONS  OF  ANY  KIND ,  either  express  or  implied . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								See  the  License  for  the  specific  language  governing  permissions  and 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								limitations  under  the  License . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								* / 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								package  kubelet 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								import  ( 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-22 01:17:27 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									"bytes" 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-06 15:56:30 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									"errors" 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-07 07:40:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
									"fmt" 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-25 05:27:10 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									"io" 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-12 13:21:40 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									"io/ioutil" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									"net" 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-07 07:40:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
									"net/http" 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-07 14:41:16 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									"os" 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-30 01:20:50 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									"path" 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-08 03:19:06 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									"path/filepath" 
							 
						 
					
						
							
								
									
										
										
										
											2014-10-28 08:29:55 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									"sort" 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-07 07:40:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
									"strings" 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-05 18:19:54 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									"sync" 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-07 07:40:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
									"time" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-08-06 06:05:17 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									"github.com/golang/glog" 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-16 11:00:28 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									cadvisorapi  "github.com/google/cadvisor/info/v1" 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-23 04:14:06 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									cadvisorapiv2  "github.com/google/cadvisor/info/v2" 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-06 06:03:47 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									"k8s.io/kubernetes/pkg/api" 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-22 02:06:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									apierrors  "k8s.io/kubernetes/pkg/api/errors" 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-06 06:03:47 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									"k8s.io/kubernetes/pkg/api/resource" 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-18 06:21:55 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									"k8s.io/kubernetes/pkg/api/unversioned" 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-06 06:03:47 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									"k8s.io/kubernetes/pkg/api/validation" 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-04 05:40:58 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									"k8s.io/kubernetes/pkg/client/cache" 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-06 05:58:03 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									clientset  "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-04 05:40:58 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									"k8s.io/kubernetes/pkg/client/record" 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-04 05:43:19 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									client  "k8s.io/kubernetes/pkg/client/unversioned" 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-06 06:03:47 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									"k8s.io/kubernetes/pkg/cloudprovider" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									"k8s.io/kubernetes/pkg/fieldpath" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									"k8s.io/kubernetes/pkg/fields" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									"k8s.io/kubernetes/pkg/kubelet/cadvisor" 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-10 08:09:53 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									"k8s.io/kubernetes/pkg/kubelet/cm" 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-06 06:03:47 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									kubecontainer  "k8s.io/kubernetes/pkg/kubelet/container" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									"k8s.io/kubernetes/pkg/kubelet/dockertools" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									"k8s.io/kubernetes/pkg/kubelet/envvars" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									"k8s.io/kubernetes/pkg/kubelet/metrics" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									"k8s.io/kubernetes/pkg/kubelet/network" 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-08 05:42:21 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									"k8s.io/kubernetes/pkg/kubelet/pleg" 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-13 07:28:23 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									kubepod  "k8s.io/kubernetes/pkg/kubelet/pod" 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-26 01:39:41 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									"k8s.io/kubernetes/pkg/kubelet/prober" 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-20 06:15:59 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									proberesults  "k8s.io/kubernetes/pkg/kubelet/prober/results" 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-06 06:03:47 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									"k8s.io/kubernetes/pkg/kubelet/rkt" 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-11 04:14:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									"k8s.io/kubernetes/pkg/kubelet/server" 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-15 03:19:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									"k8s.io/kubernetes/pkg/kubelet/server/stats" 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-12 03:22:01 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									"k8s.io/kubernetes/pkg/kubelet/status" 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-10 01:24:31 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									kubetypes  "k8s.io/kubernetes/pkg/kubelet/types" 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-21 01:54:37 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									"k8s.io/kubernetes/pkg/kubelet/util/format" 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-03 01:18:11 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									"k8s.io/kubernetes/pkg/kubelet/util/queue" 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-06 06:03:47 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									"k8s.io/kubernetes/pkg/runtime" 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-08 03:19:06 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									"k8s.io/kubernetes/pkg/securitycontext" 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-06 06:03:47 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									"k8s.io/kubernetes/pkg/types" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									"k8s.io/kubernetes/pkg/util" 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-24 18:17:17 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									"k8s.io/kubernetes/pkg/util/atomic" 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-11 06:08:31 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									"k8s.io/kubernetes/pkg/util/bandwidth" 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-14 13:18:37 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									utilerrors  "k8s.io/kubernetes/pkg/util/errors" 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-14 17:51:40 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									kubeio  "k8s.io/kubernetes/pkg/util/io" 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-06 06:03:47 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									"k8s.io/kubernetes/pkg/util/mount" 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-06 23:56:41 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									utilnet  "k8s.io/kubernetes/pkg/util/net" 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-22 02:00:04 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									nodeutil  "k8s.io/kubernetes/pkg/util/node" 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-04 08:28:33 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									"k8s.io/kubernetes/pkg/util/oom" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									"k8s.io/kubernetes/pkg/util/procfs" 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-15 15:32:10 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									utilruntime  "k8s.io/kubernetes/pkg/util/runtime" 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-08 03:19:06 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									"k8s.io/kubernetes/pkg/util/selinux" 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-10 01:45:01 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									"k8s.io/kubernetes/pkg/util/sets" 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-07 07:30:52 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									"k8s.io/kubernetes/pkg/util/validation/field" 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-02 18:57:06 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									"k8s.io/kubernetes/pkg/util/wait" 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-22 02:06:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									"k8s.io/kubernetes/pkg/version" 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-06 06:03:47 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									"k8s.io/kubernetes/pkg/volume" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									"k8s.io/kubernetes/pkg/watch" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									"k8s.io/kubernetes/plugin/pkg/scheduler/algorithm/predicates" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									"k8s.io/kubernetes/third_party/golang/expansion" 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-07 07:40:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-03-06 08:37:08 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								const  ( 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-05 04:14:55 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Max amount of time to wait for the container runtime to come up.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									maxWaitForContainerRuntime  =  5  *  time . Minute 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-24 05:04:45 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-09-22 02:06:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// nodeStatusUpdateRetry specifies how many times kubelet retries when posting node status failed.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									nodeStatusUpdateRetry  =  5 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-04-28 04:03:55 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Location of container logs.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									containerLogsDir  =  "/var/log/containers" 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-13 20:59:15 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-10-15 12:58:20 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// max backoff period, exported for the e2e test
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									MaxContainerBackOff  =  300  *  time . Second 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// Capacity of the channel for storing pods to kill. A small number should
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// suffice because a goroutine is dedicated to check the channel and does
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// not block on anything else.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									podKillingChannelCapacity  =  50 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-29 02:54:32 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-11-04 02:03:39 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Period for performing global cleanup tasks.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									housekeepingPeriod  =  time . Second  *  2 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-22 01:17:27 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									etcHostsPath  =  "/etc/hosts" 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-08 05:42:21 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// Capacity of the channel for recieving pod lifecycle events. This number
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// is a bit arbitrary and may be adjusted in the future.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									plegChannelCapacity  =  1000 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-11-10 02:01:53 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Generic PLEG relies on relisting for discovering container events.
 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-20 10:15:10 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// A longer period means that kubelet will take longer to detect container
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// changes and to update pod status. On the other hand, a shorter period
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// will cause more frequent relisting (e.g., container runtime operations),
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// leading to higher cpu usage.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// Note that even though we set the period to 1s, the relisting itself can
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// take more than 1s to finish if the container runtime responds slowly
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// and/or when there are many container changes in one cycle.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									plegRelistPeriod  =  time . Second  *  1 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-10 02:01:53 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// backOffPeriod is the period to back off when pod syncing resulting in an
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// error. It is also used as the base period for the exponential backoff
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// container restarts and image pulls.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									backOffPeriod  =  time . Second  *  10 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-06 08:37:08 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								) 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-20 11:17:44 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-07-16 04:24:41 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// SyncHandler is an interface implemented by Kubelet, for testability
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								type  SyncHandler  interface  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									HandlePodAdditions ( pods  [ ] * api . Pod ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									HandlePodUpdates ( pods  [ ] * api . Pod ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									HandlePodDeletions ( pods  [ ] * api . Pod ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-09 11:13:09 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									HandlePodReconcile ( pods  [ ] * api . Pod ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									HandlePodSyncs ( pods  [ ] * api . Pod ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									HandlePodCleanups ( )  error 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-16 04:24:41 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-10-06 09:20:57 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								type  SourcesReadyFn  func ( sourcesSeen  sets . String )  bool 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-17 13:11:27 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-11-07 09:03:39 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// New instantiates a new Kubelet object along with all the required internal modules.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// No initialization of Kubelet and its modules should happen here.
 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-23 05:40:59 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								func  NewMainKubelet ( 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-07 10:31:40 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									hostname  string , 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-12 23:40:34 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									nodeName  string , 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-07 10:31:40 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									dockerClient  dockertools . DockerInterface , 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-02 06:30:47 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									kubeClient  clientset . Interface , 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-07 10:31:40 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									rootDirectory  string , 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-21 08:59:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									podInfraContainerImage  string , 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-07 10:31:40 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									resyncInterval  time . Duration , 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-26 12:24:44 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									pullQPS  float32 , 
							 
						 
					
						
							
								
									
										
										
										
											2014-10-28 08:29:55 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									pullBurst  int , 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-09 16:57:21 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									eventQPS  float32 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									eventBurst  int , 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-06 06:35:32 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									containerGCPolicy  kubecontainer . ContainerGCPolicy , 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-06 02:49:36 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									sourcesReady  SourcesReadyFn , 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-21 05:21:03 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									registerNode  bool , 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-16 12:53:33 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									registerSchedulable  bool , 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-13 01:20:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									standaloneMode  bool , 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-12 13:21:40 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									clusterDomain  string , 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-08 23:25:14 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									clusterDNS  net . IP , 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-23 23:47:25 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									masterServiceNamespace  string , 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-19 13:18:31 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									volumePlugins  [ ] volume . VolumePlugin , 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-20 07:14:13 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									networkPlugins  [ ] network . NetworkPlugin , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									networkPluginName  string , 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-03 14:06:20 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									streamingConnectionIdleTimeout  time . Duration , 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-06 15:56:30 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									recorder  record . EventRecorder , 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-24 05:04:45 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									cadvisorInterface  cadvisor . Interface , 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-24 06:31:13 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									imageGCPolicy  ImageGCPolicy , 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-12 16:24:08 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									diskSpacePolicy  DiskSpacePolicy , 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-31 19:17:12 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									cloud  cloudprovider . Interface , 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-14 07:56:51 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									nodeLabels  map [ string ] string , 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-14 08:30:57 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									nodeStatusUpdateFrequency  time . Duration , 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-21 08:26:40 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									resourceContainer  string , 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-24 08:07:52 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									osInterface  kubecontainer . OSInterface , 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-02 05:24:07 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									cgroupRoot  string , 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-04 22:43:10 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									containerRuntime  string , 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-18 01:03:45 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									rktPath  string , 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-01 10:25:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									rktStage1Image  string , 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-13 00:59:02 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									mounter  mount . Interface , 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-14 17:51:40 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									writer  kubeio . Writer , 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-12 05:07:24 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									dockerDaemonContainer  string , 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-20 07:19:12 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									systemContainer  string , 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-17 22:43:49 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									configureCBR0  bool , 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-08 04:44:40 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									nonMasqueradeCIDR  string , 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-25 02:10:10 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									podCIDR  string , 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-16 12:53:33 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									reconcileCIDR  bool , 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-17 09:15:40 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									maxPods  int , 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-29 02:54:32 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									dockerExecHandler  dockertools . ExecHandler , 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-01 21:27:01 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									resolverConfig  string , 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-13 22:05:32 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									cpuCFSQuota  bool , 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-30 18:55:37 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									daemonEndpoints  * api . NodeDaemonEndpoints , 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-21 05:49:44 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									oomAdjuster  * oom . OOMAdjuster , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									serializeImagePulls  bool , 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-10 08:09:53 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									containerManager  cm . ContainerManager , 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-05 04:03:28 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									outOfDiskTransitionFrequency  time . Duration , 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-24 10:11:51 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									flannelExperimentalOverlay  bool , 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-10 10:05:35 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									nodeIP  net . IP , 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-12 09:51:39 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									reservation  kubetypes . Reservation , 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-22 00:44:28 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									enableCustomMetrics  bool , 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-15 03:19:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									volumeStatsAggPeriod  time . Duration , 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-21 05:49:44 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								)  ( * Kubelet ,  error )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-12 08:42:11 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  rootDirectory  ==  ""  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  nil ,  fmt . Errorf ( "invalid root directory %q" ,  rootDirectory ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-07 10:31:40 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  resyncInterval  <=  0  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  nil ,  fmt . Errorf ( "invalid sync frequency %d" ,  resyncInterval ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-20 06:52:12 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  systemContainer  !=  ""  &&  cgroupRoot  ==  ""  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  nil ,  fmt . Errorf ( "invalid configuration: system container was specified and cgroup root was not specified" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-25 12:57:19 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									dockerClient  =  dockertools . NewInstrumentedDockerInterface ( dockerClient ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-06 08:37:08 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-01-27 05:44:53 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									serviceStore  :=  cache . NewStore ( cache . MetaNamespaceKeyFunc ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-17 05:39:31 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  kubeClient  !=  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-28 02:44:44 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										// TODO: cache.NewListWatchFromClient is limited as it takes a client implementation rather
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// than an interface. There is no way to construct a list+watcher using resource name.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										listWatch  :=  & cache . ListWatch { 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-10 17:39:03 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											ListFunc :  func ( options  api . ListOptions )  ( runtime . Object ,  error )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-04 05:21:05 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												return  kubeClient . Core ( ) . Services ( api . NamespaceAll ) . List ( options ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-28 02:44:44 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											} , 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-10 17:39:03 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											WatchFunc :  func ( options  api . ListOptions )  ( watch . Interface ,  error )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-04 05:21:05 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												return  kubeClient . Core ( ) . Services ( api . NamespaceAll ) . Watch ( options ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-28 02:44:44 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										cache . NewReflector ( listWatch ,  & api . Service { } ,  serviceStore ,  0 ) . Run ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-17 05:39:31 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-08 09:52:23 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									serviceLister  :=  & cache . StoreToServiceLister { Store :  serviceStore } 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-08 23:25:14 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-09-22 02:00:04 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									nodeStore  :=  cache . NewStore ( cache . MetaNamespaceKeyFunc ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  kubeClient  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// TODO: cache.NewListWatchFromClient is limited as it takes a client implementation rather
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// than an interface. There is no way to construct a list+watcher using resource name.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										fieldSelector  :=  fields . Set { client . ObjectNameField :  nodeName } . AsSelector ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										listWatch  :=  & cache . ListWatch { 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-10 17:39:03 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											ListFunc :  func ( options  api . ListOptions )  ( runtime . Object ,  error )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												options . FieldSelector  =  fieldSelector 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-04 05:21:05 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												return  kubeClient . Core ( ) . Nodes ( ) . List ( options ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-22 02:00:04 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											} , 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-10 17:39:03 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											WatchFunc :  func ( options  api . ListOptions )  ( watch . Interface ,  error )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												options . FieldSelector  =  fieldSelector 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-04 05:21:05 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												return  kubeClient . Core ( ) . Nodes ( ) . Watch ( options ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-22 02:00:04 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										cache . NewReflector ( listWatch ,  & api . Node { } ,  nodeStore ,  0 ) . Run ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									nodeLister  :=  & cache . StoreToNodeLister { Store :  nodeStore } 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-26 16:57:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									nodeInfo  :=  & predicates . CachedNodeInfo { nodeLister } 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-22 02:00:04 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-09-09 22:18:17 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// TODO: get the real node object of ourself,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// and use the real node name and UID.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-28 04:12:48 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// TODO: what is namespace for node?
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									nodeRef  :=  & api . ObjectReference { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										Kind :       "Node" , 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-12 23:40:34 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										Name :       nodeName , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										UID :        types . UID ( nodeName ) , 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-28 04:12:48 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										Namespace :  "" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-05-12 16:24:08 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									diskSpaceManager ,  err  :=  newDiskSpaceManager ( cadvisorInterface ,  diskSpacePolicy ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  nil ,  fmt . Errorf ( "failed to initialize disk manager: %v" ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-24 05:16:59 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									containerRefManager  :=  kubecontainer . NewRefManager ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-04-16 08:40:07 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									volumeManager  :=  newVolumeManager ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-15 01:13:20 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-04-11 08:29:56 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									oomWatcher  :=  NewOOMWatcher ( cadvisorInterface ,  recorder ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-12-17 07:31:10 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// TODO: remove when internal cbr0 implementation gets removed in favor
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// of the kubenet network plugin
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  networkPluginName  ==  "kubenet"  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										configureCBR0  =  false 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										flannelExperimentalOverlay  =  false 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-01-12 08:42:11 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									klet  :=  & Kubelet { 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-18 06:54:28 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										hostname :                        hostname , 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-12 23:40:34 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										nodeName :                        nodeName , 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-18 06:54:28 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										dockerClient :                    dockerClient , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										kubeClient :                      kubeClient , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										rootDirectory :                   rootDirectory , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										resyncInterval :                  resyncInterval , 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-24 05:16:59 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										containerRefManager :             containerRefManager , 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-18 06:54:28 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										httpClient :                      & http . Client { } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										sourcesReady :                    sourcesReady , 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-22 02:06:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										registerNode :                    registerNode , 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-16 12:53:33 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										registerSchedulable :             registerSchedulable , 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-13 01:20:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										standaloneMode :                  standaloneMode , 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-18 06:54:28 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										clusterDomain :                   clusterDomain , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										clusterDNS :                      clusterDNS , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										serviceLister :                   serviceLister , 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-22 02:00:04 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										nodeLister :                      nodeLister , 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-26 16:57:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										nodeInfo :                        nodeInfo , 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-18 06:54:28 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										masterServiceNamespace :          masterServiceNamespace , 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-09 04:41:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										streamingConnectionIdleTimeout :  streamingConnectionIdleTimeout , 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-03 14:06:20 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										recorder :                        recorder , 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-06 15:56:30 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										cadvisor :                        cadvisorInterface , 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-12 16:24:08 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										diskSpaceManager :                diskSpaceManager , 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-16 08:40:07 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										volumeManager :                   volumeManager , 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-24 06:31:13 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										cloud :                           cloud , 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-28 04:12:48 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										nodeRef :                         nodeRef , 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-14 07:59:23 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										nodeLabels :                      nodeLabels , 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-22 02:06:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										nodeStatusUpdateFrequency :       nodeStatusUpdateFrequency , 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-14 08:30:57 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										resourceContainer :               resourceContainer , 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-21 08:26:40 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										os :                              osInterface , 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-11 08:29:56 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										oomWatcher :                      oomWatcher , 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-24 08:07:52 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										cgroupRoot :                      cgroupRoot , 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-04 22:43:10 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										mounter :                         mounter , 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-14 17:51:40 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										writer :                          writer , 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-12 05:07:24 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										configureCBR0 :                   configureCBR0 , 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-08 04:44:40 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										nonMasqueradeCIDR :               nonMasqueradeCIDR , 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-16 12:53:33 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										reconcileCIDR :                   reconcileCIDR , 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-17 09:15:40 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										maxPods :                         maxPods , 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-24 18:17:17 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										syncLoopMonitor :                 atomic . Value { } , 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-29 02:54:32 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										resolverConfig :                  resolverConfig , 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-01 21:27:01 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										cpuCFSQuota :                     cpuCFSQuota , 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-22 02:06:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										daemonEndpoints :                 daemonEndpoints , 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-10 08:09:53 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										containerManager :                containerManager , 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-24 10:11:51 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										flannelExperimentalOverlay :      flannelExperimentalOverlay , 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-23 08:06:04 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										flannelHelper :                   NewFlannelHelper ( ) , 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-10 10:05:35 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										nodeIP :                          nodeIP , 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-05 04:03:28 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										clock :                           util . RealClock { } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										outOfDiskTransitionFrequency :  outOfDiskTransitionFrequency , 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-12 09:51:39 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										reservation :                   reservation , 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-22 00:44:28 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										enableCustomMetrics :           enableCustomMetrics , 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-24 10:11:51 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-15 03:19:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// TODO: Factor out "StatsProvider" from Kubelet so we don't have a cyclic dependency
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									klet . resourceAnalyzer  =  stats . NewResourceAnalyzer ( klet ,  volumeStatsAggPeriod ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-11-24 10:11:51 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  klet . flannelExperimentalOverlay  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										glog . Infof ( "Flannel is in charge of podCIDR and overlay networking." ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-21 11:41:32 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-10 10:05:35 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  klet . nodeIP  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  err  :=  klet . validateNodeIP ( ) ;  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											return  nil ,  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										glog . Infof ( "Using node IP: %q" ,  klet . nodeIP . String ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-29 02:02:29 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  plug ,  err  :=  network . InitNetworkPlugin ( networkPlugins ,  networkPluginName ,  & networkHost { klet } ) ;  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  nil ,  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										klet . networkPlugin  =  plug 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-02 05:24:07 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-09-22 02:06:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									machineInfo ,  err  :=  klet . GetCachedMachineInfo ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-04 08:28:33 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  nil ,  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-11-14 07:47:25 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									procFs  :=  procfs . NewProcFS ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-21 03:57:56 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									imageBackOff  :=  util . NewBackOff ( backOffPeriod ,  MaxContainerBackOff ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-20 06:15:59 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-11-11 06:00:12 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									klet . livenessManager  =  proberesults . NewManager ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-20 06:15:59 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-01-20 10:15:10 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									klet . podCache  =  kubecontainer . NewCache ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-05-02 05:24:07 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Initialize the runtime.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									switch  containerRuntime  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									case  "docker" : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// Only supported one for now, continue.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-02 06:25:11 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										klet . containerRuntime  =  dockertools . NewDockerManager ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											dockerClient , 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-26 15:18:45 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											kubecontainer . FilterEventRecorder ( recorder ) , 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-20 06:15:59 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											klet . livenessManager , 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-02 06:25:11 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											containerRefManager , 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-04 08:28:33 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											machineInfo , 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-02 06:25:11 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											podInfraContainerImage , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											pullQPS , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											pullBurst , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											containerLogsDir , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											osInterface , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											klet . networkPlugin , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											klet , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											klet . httpClient , 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-04 08:28:33 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											dockerExecHandler , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											oomAdjuster , 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-01 21:27:01 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											procFs , 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-02 21:45:46 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											klet . cpuCFSQuota , 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-21 05:49:44 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											imageBackOff , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											serializeImagePulls , 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-22 00:44:28 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											enableCustomMetrics , 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-21 05:49:44 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										) 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-08 14:26:07 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									case  "rkt" : 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-18 01:03:45 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										conf  :=  & rkt . Config { 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-27 05:48:00 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											Path :             rktPath , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											Stage1Image :      rktStage1Image , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											InsecureOptions :  "image,ondisk" , 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-18 01:03:45 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-08 14:26:07 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										rktRuntime ,  err  :=  rkt . New ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											conf , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											klet , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											recorder , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											containerRefManager , 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-20 06:15:59 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											klet . livenessManager , 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-02 21:45:46 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											klet . volumeManager , 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-21 05:49:44 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											imageBackOff , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											serializeImagePulls , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										) 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-08 14:26:07 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											return  nil ,  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										klet . containerRuntime  =  rktRuntime 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-13 00:59:02 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										// No Docker daemon to put in a container.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										dockerDaemonContainer  =  "" 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-02 05:24:07 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									default : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  nil ,  fmt . Errorf ( "unsupported container runtime %q specified" ,  containerRuntime ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-29 02:02:29 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-01-20 10:15:10 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									klet . pleg  =  pleg . NewGenericPLEG ( klet . containerRuntime ,  plegChannelCapacity ,  plegRelistPeriod ,  klet . podCache ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-27 12:02:59 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									klet . runtimeState  =  newRuntimeState ( maxWaitForContainerRuntime ,  configureCBR0 ,  klet . isContainerRuntimeVersionCompatible ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									klet . updatePodCIDR ( podCIDR ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-07 09:03:39 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-10-03 23:37:07 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// setup containerGC
 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-06 06:35:32 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									containerGC ,  err  :=  kubecontainer . NewContainerGC ( klet . containerRuntime ,  containerGCPolicy ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-03 23:37:07 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  nil ,  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									klet . containerGC  =  containerGC 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-09-26 08:29:08 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// setup imageManager
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									imageManager ,  err  :=  newImageManager ( klet . containerRuntime ,  cadvisorInterface ,  recorder ,  nodeRef ,  imageGCPolicy ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  nil ,  fmt . Errorf ( "failed to initialize image manager: %v" ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									klet . imageManager  =  imageManager 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-05-20 06:52:12 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Setup container manager, can fail if the devices hierarchy is not mounted
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// (it is required by Docker however).
 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-10 08:09:53 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									klet . nodeConfig  =  cm . NodeConfig { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										DockerDaemonContainerName :  dockerDaemonContainer , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										SystemContainerName :        systemContainer , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										KubeletContainerName :       resourceContainer , 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-05 04:14:55 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-05 04:03:28 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									klet . runtimeState . setRuntimeSync ( klet . clock . Now ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-05 04:14:55 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-05-02 06:25:11 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									klet . runner  =  klet . containerRuntime 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-13 07:28:23 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									klet . podManager  =  kubepod . NewBasicPodManager ( kubepod . NewBasicMirrorClient ( klet . kubeClient ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-30 05:04:00 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									klet . statusManager  =  status . NewManager ( kubeClient ,  klet . podManager ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-21 08:22:02 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-08-26 01:39:41 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									klet . probeManager  =  prober . NewManager ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										klet . statusManager , 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-20 06:15:59 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										klet . livenessManager , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										klet . runner , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										containerRefManager , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										recorder ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-26 01:39:41 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-09-25 06:26:25 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  err  :=  klet . volumePluginMgr . InitPlugins ( volumePlugins ,  & volumeHost { klet } ) ;  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  nil ,  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-05-02 06:25:11 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									runtimeCache ,  err  :=  kubecontainer . NewRuntimeCache ( klet . containerRuntime ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-19 17:12:53 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  nil ,  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-14 09:04:11 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									klet . runtimeCache  =  runtimeCache 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-13 05:28:00 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									klet . reasonCache  =  NewReasonCache ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-03 01:18:11 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									klet . workQueue  =  queue . NewBasicWorkQueue ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-21 05:26:02 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									klet . podWorkers  =  newPodWorkers ( klet . syncPod ,  recorder ,  klet . workQueue ,  klet . resyncInterval ,  backOffPeriod ,  klet . podCache ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-19 17:12:53 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-11-10 02:01:53 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									klet . backOff  =  util . NewBackOff ( backOffPeriod ,  MaxContainerBackOff ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-01 07:56:55 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									klet . podKillingCh  =  make ( chan  * kubecontainer . PodPair ,  podKillingChannelCapacity ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-06 09:20:57 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									klet . sourcesSeen  =  sets . NewString ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-12 08:42:11 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									return  klet ,  nil 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-23 05:40:59 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-01-08 23:25:14 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								type  serviceLister  interface  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									List ( )  ( api . ServiceList ,  error ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-09-22 02:00:04 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								type  nodeLister  interface  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									List ( )  ( machines  api . NodeList ,  err  error ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-07-10 20:26:24 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// Kubelet is the main kubelet implementation.
 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-07 07:40:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								type  Kubelet  struct  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-03 01:18:11 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									hostname       string 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									nodeName       string 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									dockerClient   dockertools . DockerInterface 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									runtimeCache   kubecontainer . RuntimeCache 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-02 06:30:47 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									kubeClient     clientset . Interface 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-03 01:18:11 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									rootDirectory  string 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									podWorkers     PodWorkers 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-04-09 09:56:58 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									resyncInterval  time . Duration 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									sourcesReady    SourcesReadyFn 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-06 09:20:57 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// sourcesSeen records the sources seen by kubelet. This set is not thread
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// safe and should only be access by the main kubelet syncloop goroutine.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									sourcesSeen  sets . String 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-16 04:24:41 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-10-13 07:28:23 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									podManager  kubepod . Manager 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-19 02:43:59 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-11-04 08:16:31 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Needed to report events for containers belonging to deleted/modified pods.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// Tracks references for reporting events
 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-27 02:44:52 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									containerRefManager  * kubecontainer . RefManager 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-04 08:16:31 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-07-16 04:24:41 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Optional, defaults to /logs/ from /var/log
 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-23 05:40:59 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									logServer  http . Handler 
							 
						 
					
						
							
								
									
										
										
										
											2014-08-08 02:15:11 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Optional, defaults to simple Docker implementation
 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-12 06:32:51 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									runner  kubecontainer . ContainerCommandRunner 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-04 04:39:56 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Optional, client for http requests, defaults to empty client
 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-10 01:24:31 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									httpClient  kubetypes . HttpGetter 
							 
						 
					
						
							
								
									
										
										
										
											2014-10-09 08:05:04 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-03-06 15:56:30 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// cAdvisor used for container information.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									cadvisor  cadvisor . Interface 
							 
						 
					
						
							
								
									
										
										
										
											2014-10-28 08:29:55 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-09-22 02:06:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Set to true to have the node register itself with the apiserver.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									registerNode  bool 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-16 12:53:33 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Set to true to have the node register itself as schedulable.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									registerSchedulable  bool 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-01 09:49:18 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// for internal book keeping; access only from within registerWithApiserver
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									registrationCompleted  bool 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-21 05:21:03 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-06-13 01:20:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Set to true if the kubelet is in standalone mode (i.e. setup without an apiserver)
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									standaloneMode  bool 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-11-12 13:21:40 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// If non-empty, use this for container DNS search.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									clusterDomain  string 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// If non-nil, use this for container DNS server.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									clusterDNS  net . IP 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-08 23:25:14 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									masterServiceNamespace  string 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									serviceLister           serviceLister 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-22 02:00:04 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									nodeLister              nodeLister 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-26 16:57:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									nodeInfo                predicates . NodeInfo 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-23 23:47:25 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-11-14 07:59:23 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// a list of node labels to register
 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-14 07:56:51 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									nodeLabels  map [ string ] string 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-14 07:59:23 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-07-04 04:29:14 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Last timestamp when runtime responded on ping.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-05 18:19:54 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Mutex is used to protect this value.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-26 02:00:14 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									runtimeState  * runtimeState 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-25 02:10:10 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-11-23 23:47:25 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Volume plugins.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-19 13:18:31 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									volumePluginMgr  volume . VolumePluginMgr 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-03 02:51:52 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-04-18 06:54:28 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Network plugin.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-20 07:14:13 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									networkPlugin  network . NetworkPlugin 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-10-20 06:15:59 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Handles container probing.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-26 01:39:41 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									probeManager  prober . Manager 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-20 06:15:59 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Manages container health check results.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									livenessManager  proberesults . Manager 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-09 04:41:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-03-21 00:37:08 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// How long to keep idle streaming command execution/port forwarding
 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-09 04:41:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// connections open before terminating them
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									streamingConnectionIdleTimeout  time . Duration 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-03 14:06:20 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-03-21 00:37:08 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// The EventRecorder to use
 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-03 14:06:20 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									recorder  record . EventRecorder 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-04 02:33:25 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-03-15 01:13:20 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Policy for handling garbage collection of dead containers.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-06 06:35:32 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									containerGC  kubecontainer . ContainerGC 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-16 12:00:46 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// Manager for images.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									imageManager  imageManager 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-16 20:50:00 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-05-12 16:24:08 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Diskspace manager.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									diskSpaceManager  diskSpaceManager 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-03-16 20:50:00 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Cached MachineInfo returned by cadvisor.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-16 11:00:28 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									machineInfo  * cadvisorapi . MachineInfo 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-21 00:37:08 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// Syncs pods statuses with apiserver; also used as a cache of statuses.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-12 03:22:01 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									statusManager  status . Manager 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-24 06:31:13 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-04-16 08:40:07 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Manager for the volume maps for the pods.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									volumeManager  * volumeManager 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-09-22 02:06:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									//Cloud provider interface
 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-24 06:31:13 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									cloud  cloudprovider . Interface 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-28 04:12:48 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// Reference to this node.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									nodeRef  * api . ObjectReference 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-03 04:14:52 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-05-02 06:25:11 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Container runtime.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									containerRuntime  kubecontainer . Runtime 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-31 19:17:12 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-01-13 05:28:00 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// reasonCache caches the failure reason of the last creation of all containers, which is
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// used for generating ContainerStatus.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									reasonCache  * ReasonCache 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-09-22 02:06:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// nodeStatusUpdateFrequency specifies how often kubelet posts node status to master.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// Note: be cautious when changing the constant, it must work with nodeMonitorGracePeriod
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// in nodecontroller. There are several constraints:
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// 1. nodeMonitorGracePeriod must be N times more than nodeStatusUpdateFrequency, where
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									//    N means number of retries allowed for kubelet to post node status. It is pointless
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									//    to make nodeMonitorGracePeriod be less than nodeStatusUpdateFrequency, since there
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									//    will only be fresh values from Kubelet at an interval of nodeStatusUpdateFrequency.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									//    The constant must be less than podEvictionTimeout.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// 2. nodeStatusUpdateFrequency needs to be large enough for kubelet to generate node
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									//    status. Kubelet may fail to update node status reliably if the value is too small,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									//    as it takes time to gather all necessary node information.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									nodeStatusUpdateFrequency  time . Duration 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-08-08 05:42:21 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Generates pod events.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									pleg  pleg . PodLifecycleEventGenerator 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-01-20 10:15:10 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Store kubecontainer.PodStatus for all pods.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									podCache  kubecontainer . Cache 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-04-14 08:30:57 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// The name of the resource-only container to run the Kubelet in (empty for no container).
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// Name must be absolute.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									resourceContainer  string 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-21 08:26:40 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-04-30 04:44:29 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									os  kubecontainer . OSInterface 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// Watcher of out of memory events.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-11 08:29:56 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									oomWatcher  OOMWatcher 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-30 04:44:29 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-01-15 03:19:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Monitor resource usage
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									resourceAnalyzer  stats . ResourceAnalyzer 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-04-24 08:07:52 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// If non-empty, pass this to the container runtime as the root cgroup.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									cgroupRoot  string 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-04 22:43:10 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// Mounter to use for volumes.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									mounter  mount . Interface 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-13 00:59:02 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-09-14 17:51:40 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Writer interface to use for volumes.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									writer  kubeio . Writer 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-05-13 00:59:02 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Manager of non-Runtime containers.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-10 08:09:53 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									containerManager  cm . ContainerManager 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									nodeConfig        cm . NodeConfig 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-12 05:07:24 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// Whether or not kubelet should take responsibility for keeping cbr0 in
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// the correct state.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									configureCBR0  bool 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-16 12:53:33 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									reconcileCIDR  bool 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-17 22:43:49 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-01-08 04:44:40 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Traffic to IPs outside this range will use IP masquerade.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									nonMasqueradeCIDR  string 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-11-17 09:15:40 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Maximum Number of Pods which can be run by this Kubelet
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									maxPods  int 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-18 06:31:46 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// Monitor Kubelet's sync loop
 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-24 18:17:17 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									syncLoopMonitor  atomic . Value 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-13 20:59:15 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// Container restart Backoff
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									backOff  * util . Backoff 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// Channel for sending pods to kill.
 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-01 07:56:55 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									podKillingCh  chan  * kubecontainer . PodPair 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-29 02:54:32 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// The configuration file used as the base to generate the container's
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// DNS resolver configuration file. This can be used in conjunction with
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// clusterDomain and clusterDNS.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									resolverConfig  string 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-11 06:08:31 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// Optionally shape the bandwidth of a pod
 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-17 07:31:10 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// TODO: remove when kubenet plugin is ready
 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-11 06:08:31 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									shaper  bandwidth . BandwidthShaper 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-01 21:27:01 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// True if container cpu limits should be enforced via cgroup CFS quota
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									cpuCFSQuota  bool 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-22 02:06:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// Information about the ports which are opened by daemons on Node running this Kubelet server.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									daemonEndpoints  * api . NodeDaemonEndpoints 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-03 01:18:11 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// A queue used to trigger pod workers.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									workQueue  queue . WorkQueue 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-07 09:03:39 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// oneTimeInitializer is used to initialize modules that are dependent on the runtime to be up.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									oneTimeInitializer  sync . Once 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-21 11:41:32 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-11-24 10:11:51 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									flannelExperimentalOverlay  bool 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// TODO: Flannelhelper doesn't store any state, we can instantiate it
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// on the fly if we're confident the dbus connetions it opens doesn't
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// put the system under duress.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									flannelHelper  * FlannelHelper 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-10 10:05:35 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// If non-nil, use this IP address for the node
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									nodeIP  net . IP 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-05 04:03:28 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// clock is an interface that provides time related functionality in a way that makes it
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// easy to test the code.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									clock  util . Clock 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// outOfDiskTransitionFrequency specifies the amount of time the kubelet has to be actually
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// not out of disk before it can transition the node condition status from out-of-disk to
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// not-out-of-disk. This prevents a pod that causes out-of-disk condition from repeatedly
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// getting rescheduled onto the node.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									outOfDiskTransitionFrequency  time . Duration 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-12 09:51:39 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// reservation specifies resources which are reserved for non-pod usage, including kubernetes and
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// non-kubernetes system processes.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									reservation  kubetypes . Reservation 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-22 00:44:28 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// support gathering custom metrics.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									enableCustomMetrics  bool 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-10 10:05:35 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// Validate given node IP belongs to the current host
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  validateNodeIP ( )  error  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  kl . nodeIP  ==  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// Honor IP limitations set in setNodeStatus()
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  kl . nodeIP . IsLoopback ( )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  fmt . Errorf ( "nodeIP can't be loopback address" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  kl . nodeIP . To4 ( )  ==  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  fmt . Errorf ( "nodeIP must be IPv4 address" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									addrs ,  err  :=  net . InterfaceAddrs ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									for  _ ,  addr  :=  range  addrs  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										var  ip  net . IP 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										switch  v  :=  addr . ( type )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										case  * net . IPNet : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											ip  =  v . IP 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										case  * net . IPAddr : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											ip  =  v . IP 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  ip  !=  nil  &&  ip . Equal ( kl . nodeIP )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											return  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  fmt . Errorf ( "Node IP: %q not found in the host's network interfaces" ,  kl . nodeIP . String ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-10-28 08:29:55 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-10-06 09:20:57 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  allSourcesReady ( )  bool  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// Make a copy of the sourcesSeen list because it's not thread-safe.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  kl . sourcesReady ( sets . NewString ( kl . sourcesSeen . List ( ) ... ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  addSource ( source  string )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									kl . sourcesSeen . Insert ( source ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-11-23 23:47:25 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// getRootDir returns the full path to the directory under which kubelet can
 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-30 03:02:28 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// store data.  These functions are useful to pass interfaces to other modules
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// that may need to know where to write data without getting a whole kubelet
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// instance.
 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-23 23:47:25 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  getRootDir ( )  string  { 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-30 03:02:28 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									return  kl . rootDirectory 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-11-23 23:47:25 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// getPodsDir returns the full path to the directory under which pod
 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-30 03:02:28 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// directories are created.
 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-23 23:47:25 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  getPodsDir ( )  string  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  path . Join ( kl . getRootDir ( ) ,  "pods" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// getPluginsDir returns the full path to the directory under which plugin
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// directories are created.  Plugins can use these directories for data that
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// they need to persist.  Plugins should create subdirectories under this named
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// after their own names.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  getPluginsDir ( )  string  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  path . Join ( kl . getRootDir ( ) ,  "plugins" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// getPluginDir returns a data directory name for a given plugin name.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// Plugins can use these directories to store data that they need to persist.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// For per-pod plugin data, see getPodPluginDir.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  getPluginDir ( pluginName  string )  string  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  path . Join ( kl . getPluginsDir ( ) ,  pluginName ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-30 03:02:28 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-11-23 23:47:25 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// getPodDir returns the full path to the per-pod data directory for the
 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-30 03:02:28 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// specified pod.  This directory may not exist if the pod does not exist.
 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-23 23:47:25 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  getPodDir ( podUID  types . UID )  string  { 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-30 03:02:28 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Backwards compat.  The "old" stuff should be removed before 1.0
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// release.  The thinking here is this:
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									//     !old && !new = use new
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									//     !old && new  = use new
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									//     old && !new  = use old
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									//     old && new   = use new (but warn)
 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-23 23:47:25 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									oldPath  :=  path . Join ( kl . getRootDir ( ) ,  string ( podUID ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-30 03:02:28 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									oldExists  :=  dirExists ( oldPath ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-23 23:47:25 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									newPath  :=  path . Join ( kl . getPodsDir ( ) ,  string ( podUID ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-30 03:02:28 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									newExists  :=  dirExists ( newPath ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  oldExists  &&  ! newExists  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  oldPath 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  oldExists  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										glog . Warningf ( "Data dir for pod %q exists in both old and new form, using new" ,  podUID ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  newPath 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-30 03:02:28 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-11-23 23:47:25 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// getPodVolumesDir returns the full path to the per-pod data directory under
 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-30 03:02:28 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// which volumes are created for the specified pod.  This directory may not
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// exist if the pod does not exist.
 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-23 23:47:25 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  getPodVolumesDir ( podUID  types . UID )  string  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  path . Join ( kl . getPodDir ( podUID ) ,  "volumes" ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-30 03:02:28 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-11-23 23:47:25 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// getPodVolumeDir returns the full path to the directory which represents the
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// named volume under the named plugin for specified pod.  This directory may not
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// exist if the pod does not exist.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  getPodVolumeDir ( podUID  types . UID ,  pluginName  string ,  volumeName  string )  string  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  path . Join ( kl . getPodVolumesDir ( podUID ) ,  pluginName ,  volumeName ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// getPodPluginsDir returns the full path to the per-pod data directory under
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// which plugins may store data for the specified pod.  This directory may not
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// exist if the pod does not exist.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  getPodPluginsDir ( podUID  types . UID )  string  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  path . Join ( kl . getPodDir ( podUID ) ,  "plugins" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// getPodPluginDir returns a data directory name for a given plugin name for a
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// given pod UID.  Plugins can use these directories to store data that they
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// need to persist.  For non-per-pod plugin data, see getPluginDir.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  getPodPluginDir ( podUID  types . UID ,  pluginName  string )  string  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  path . Join ( kl . getPodPluginsDir ( podUID ) ,  pluginName ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// getPodContainerDir returns the full path to the per-pod data directory under
 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-30 03:02:28 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// which container data is held for the specified pod.  This directory may not
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// exist if the pod or container does not exist.
 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-23 23:47:25 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  getPodContainerDir ( podUID  types . UID ,  ctrName  string )  string  { 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-30 03:02:28 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Backwards compat.  The "old" stuff should be removed before 1.0
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// release.  The thinking here is this:
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									//     !old && !new = use new
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									//     !old && new  = use new
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									//     old && !new  = use old
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									//     old && new   = use new (but warn)
 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-23 23:47:25 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									oldPath  :=  path . Join ( kl . getPodDir ( podUID ) ,  ctrName ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-30 03:02:28 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									oldExists  :=  dirExists ( oldPath ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-23 23:47:25 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									newPath  :=  path . Join ( kl . getPodDir ( podUID ) ,  "containers" ,  ctrName ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-30 03:02:28 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									newExists  :=  dirExists ( newPath ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  oldExists  &&  ! newExists  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  oldPath 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  oldExists  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										glog . Warningf ( "Data dir for pod %q, container %q exists in both old and new form, using new" ,  podUID ,  ctrName ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  newPath 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  dirExists ( path  string )  bool  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									s ,  err  :=  os . Stat ( path ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  false 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  s . IsDir ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-30 03:02:28 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-01-12 08:42:11 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  setupDataDirs ( )  error  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									kl . rootDirectory  =  path . Clean ( kl . rootDirectory ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-23 23:47:25 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  err  :=  os . MkdirAll ( kl . getRootDir ( ) ,  0750 ) ;  err  !=  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-12 08:42:11 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										return  fmt . Errorf ( "error creating root directory: %v" ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-23 23:47:25 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  err  :=  os . MkdirAll ( kl . getPodsDir ( ) ,  0750 ) ;  err  !=  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-12 08:42:11 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										return  fmt . Errorf ( "error creating pods directory: %v" ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-23 23:47:25 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  err  :=  os . MkdirAll ( kl . getPluginsDir ( ) ,  0750 ) ;  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  fmt . Errorf ( "error creating plugins directory: %v" ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-12 08:42:11 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									return  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// Get a list of pods that have data directories.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-15 07:22:21 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  listPodsFromDisk ( )  ( [ ] types . UID ,  error )  { 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-23 23:47:25 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									podInfos ,  err  :=  ioutil . ReadDir ( kl . getPodsDir ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-12 08:42:11 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  nil ,  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-15 07:22:21 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									pods  :=  [ ] types . UID { } 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-12 08:42:11 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									for  i  :=  range  podInfos  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  podInfos [ i ] . IsDir ( )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-15 07:22:21 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											pods  =  append ( pods ,  types . UID ( podInfos [ i ] . Name ( ) ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-12 08:42:11 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  pods ,  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-09-22 02:00:04 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  GetNode ( )  ( * api . Node ,  error )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  kl . standaloneMode  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  nil ,  errors . New ( "no node entry for kubelet in standalone mode" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-26 16:57:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									return  kl . nodeInfo . GetNodeInfo ( kl . nodeName ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-22 02:00:04 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-07-04 04:29:14 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// Starts garbage collection threads.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-16 12:00:46 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  StartGarbageCollection ( )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-02 18:57:06 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									go  wait . Until ( func ( )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-15 01:13:20 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if  err  :=  kl . containerGC . GarbageCollect ( ) ;  err  !=  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-16 12:00:46 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											glog . Errorf ( "Container garbage collection failed: %v" ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-02 18:57:06 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} ,  time . Minute ,  wait . NeverStop ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-16 12:00:46 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-02-02 18:57:06 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									go  wait . Until ( func ( )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-16 12:00:46 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if  err  :=  kl . imageManager . GarbageCollect ( ) ;  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											glog . Errorf ( "Image garbage collection failed: %v" ,  err ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-23 03:54:07 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-02 18:57:06 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} ,  5 * time . Minute ,  wait . NeverStop ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-23 03:54:07 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-11-07 09:03:39 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// initializeModules will initialize internal modules that do not require the container runtime to be up.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// Note that the modules here must not depend on modules that are not initialized here.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  initializeModules ( )  error  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-05 05:34:56 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Step 1: Move Kubelet to a container, if required.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  kl . resourceContainer  !=  ""  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// Fixme: I need to reside inside ContainerManager interface.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										err  :=  util . RunInResourceContainer ( kl . resourceContainer ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											glog . Warningf ( "Failed to move Kubelet to container %q: %v" ,  kl . resourceContainer ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										glog . Infof ( "Running in container %q" ,  kl . resourceContainer ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// Step 2: Promethues metrics.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-25 06:26:25 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									metrics . Register ( kl . runtimeCache ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-02-05 05:34:56 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Step 3: Setup filesystem directories.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-25 06:26:25 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  err  :=  kl . setupDataDirs ( ) ;  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  err 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-15 15:04:30 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-07 09:03:39 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-02-05 05:34:56 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Step 4: If the container logs directory does not exist, create it.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-25 06:26:25 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  _ ,  err  :=  os . Stat ( containerLogsDir ) ;  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  err  :=  kl . os . Mkdir ( containerLogsDir ,  0755 ) ;  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											glog . Errorf ( "Failed to create directory %q: %v" ,  containerLogsDir ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-24 05:04:45 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-14 08:30:57 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-02-05 05:34:56 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Step 5: Start the image manager.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-21 05:21:03 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  err  :=  kl . imageManager . Start ( ) ;  err  !=  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-25 06:26:25 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										return  fmt . Errorf ( "Failed to start ImageManager, images may not be garbage collected: %v" ,  err ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-06 02:15:12 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-02-05 05:34:56 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Step 6: Start container manager.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-10 08:09:53 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  err  :=  kl . containerManager . Start ( kl . nodeConfig ) ;  err  !=  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-25 06:26:25 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										return  fmt . Errorf ( "Failed to start ContainerManager %v" ,  err ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-13 00:59:02 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-02-05 05:34:56 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Step 7: Start out of memory watcher.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-21 05:21:03 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  err  :=  kl . oomWatcher . Start ( kl . nodeRef ) ;  err  !=  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-25 06:26:25 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										return  fmt . Errorf ( "Failed to start OOM watcher %v" ,  err ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-16 04:24:24 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-15 03:19:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// Step 7: Start resource analyzer
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									kl . resourceAnalyzer . Start ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-25 06:26:25 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									return  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-16 04:24:24 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-11-07 09:03:39 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// initializeRuntimeDependentModules will initialize internal modules that require the container runtime to be up.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  initializeRuntimeDependentModules ( )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  err  :=  kl . cadvisor . Start ( ) ;  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										kl . runtimeState . setInternalError ( fmt . Errorf ( "Failed to start cAdvisor %v" ,  err ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-13 00:59:02 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-07 09:03:39 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-13 00:59:02 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-09-25 06:26:25 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// Run starts the kubelet reacting to config updates
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  Run ( updates  <- chan  kubetypes . PodUpdate )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  kl . logServer  ==  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										kl . logServer  =  http . StripPrefix ( "/logs/" ,  http . FileServer ( http . Dir ( "/var/log/" ) ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  kl . kubeClient  ==  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										glog . Warning ( "No api server defined - no node status update will be sent." ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-07 09:03:39 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  err  :=  kl . initializeModules ( ) ;  err  !=  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-14 06:30:01 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										kl . recorder . Eventf ( kl . nodeRef ,  api . EventTypeWarning ,  kubecontainer . KubeletSetupFailed ,  err . Error ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-25 06:26:25 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										glog . Error ( err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										kl . runtimeState . setInitError ( err ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-19 03:18:12 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-09-25 06:26:25 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  kl . kubeClient  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// Start syncing node status immediately, this may set up things the runtime needs to run.
 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-02 18:57:06 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										go  wait . Until ( kl . syncNodeStatus ,  kl . nodeStatusUpdateFrequency ,  wait . NeverStop ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-19 03:18:12 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-02 18:57:06 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									go  wait . Until ( kl . syncNetworkStatus ,  30 * time . Second ,  wait . NeverStop ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									go  wait . Until ( kl . updateRuntimeUp ,  5 * time . Second ,  wait . NeverStop ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-25 02:10:10 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Start a goroutine responsible for killing pods (that are not properly
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// handled by pod workers).
 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-02 18:57:06 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									go  wait . Until ( kl . podKiller ,  1 * time . Second ,  wait . NeverStop ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-12-10 02:58:15 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Start component sync loops.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-21 00:37:08 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									kl . statusManager . Start ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-10 02:58:15 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									kl . probeManager . Start ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-08 05:42:21 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Start the pod lifecycle event generator.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									kl . pleg . Start ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-16 04:24:41 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									kl . syncLoop ( updates ,  kl ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-07 07:40:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-09-22 02:06:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  initialNodeStatus ( )  ( * api . Node ,  error )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									node  :=  & api . Node { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										ObjectMeta :  api . ObjectMeta { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											Name :    kl . nodeName , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											Labels :  map [ string ] string { "kubernetes.io/hostname" :  kl . hostname } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} , 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-16 12:53:33 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										Spec :  api . NodeSpec { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											Unschedulable :  ! kl . registerSchedulable , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} , 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-22 02:06:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-14 07:59:23 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// @question: should this be place after the call to the cloud provider? which also applies labels
 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-14 07:56:51 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									for  k ,  v  :=  range  kl . nodeLabels  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-14 07:59:23 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if  cv ,  found  :=  node . ObjectMeta . Labels [ k ] ;  found  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											glog . Warningf ( "the node label %s=%s will overwrite default setting %s" ,  k ,  v ,  cv ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										node . ObjectMeta . Labels [ k ]  =  v 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-09-22 02:06:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  kl . cloud  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										instances ,  ok  :=  kl . cloud . Instances ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  ! ok  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											return  nil ,  fmt . Errorf ( "failed to get instances from cloud provider" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// TODO(roberthbailey): Can we do this without having credentials to talk
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// to the cloud provider?
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// TODO: ExternalID is deprecated, we'll have to drop this code
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										externalID ,  err  :=  instances . ExternalID ( kl . nodeName ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											return  nil ,  fmt . Errorf ( "failed to get external ID from cloud provider: %v" ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										node . Spec . ExternalID  =  externalID 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// TODO: We can't assume that the node has credentials to talk to the
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// cloudprovider from arbitrary nodes. At most, we should talk to a
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// local metadata server here.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										node . Spec . ProviderID ,  err  =  cloudprovider . GetInstanceProviderID ( kl . cloud ,  kl . nodeName ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											return  nil ,  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-06 03:32:06 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// If the cloud has zone information, label the node with the zone information
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										zones ,  ok  :=  kl . cloud . Zones ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  ok  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											zone ,  err  :=  zones . GetZone ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												return  nil ,  fmt . Errorf ( "failed to get zone from cloud provider: %v" ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											if  zone . FailureDomain  !=  ""  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												glog . Infof ( "Adding node label from cloud provider: %s=%s" ,  unversioned . LabelZoneFailureDomain ,  zone . FailureDomain ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												node . ObjectMeta . Labels [ unversioned . LabelZoneFailureDomain ]  =  zone . FailureDomain 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											if  zone . Region  !=  ""  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												glog . Infof ( "Adding node label from cloud provider: %s=%s" ,  unversioned . LabelZoneRegion ,  zone . Region ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												node . ObjectMeta . Labels [ unversioned . LabelZoneRegion ]  =  zone . Region 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-22 02:06:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										node . Spec . ExternalID  =  kl . hostname 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  err  :=  kl . setNodeStatus ( node ) ;  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  nil ,  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  node ,  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// registerWithApiserver registers the node with the cluster master. It is safe
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// to call multiple times, but not concurrently (kl.registrationCompleted is
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// not locked).
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  registerWithApiserver ( )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  kl . registrationCompleted  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									step  :=  100  *  time . Millisecond 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									for  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										time . Sleep ( step ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										step  =  step  *  2 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  step  >=  7 * time . Second  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											step  =  7  *  time . Second 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										node ,  err  :=  kl . initialNodeStatus ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											glog . Errorf ( "Unable to construct api.Node object for kubelet: %v" ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											continue 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										glog . V ( 2 ) . Infof ( "Attempting to register node %s" ,  node . Name ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-04 05:21:05 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if  _ ,  err  :=  kl . kubeClient . Core ( ) . Nodes ( ) . Create ( node ) ;  err  !=  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-22 02:06:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											if  ! apierrors . IsAlreadyExists ( err )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												glog . V ( 2 ) . Infof ( "Unable to register %s with the apiserver: %v" ,  node . Name ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												continue 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-04 05:21:05 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											currentNode ,  err  :=  kl . kubeClient . Core ( ) . Nodes ( ) . Get ( kl . nodeName ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-22 02:06:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												glog . Errorf ( "error getting node %q: %v" ,  kl . nodeName ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												continue 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											if  currentNode  ==  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												glog . Errorf ( "no node instance returned for %q" ,  kl . nodeName ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												continue 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											if  currentNode . Spec . ExternalID  ==  node . Spec . ExternalID  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												glog . Infof ( "Node %s was previously registered" ,  node . Name ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												kl . registrationCompleted  =  true 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											glog . Errorf ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												"Previously %q had externalID %q; now it is %q; will delete and recreate." , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												kl . nodeName ,  node . Spec . ExternalID ,  currentNode . Spec . ExternalID , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											) 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-04 05:21:05 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											if  err  :=  kl . kubeClient . Core ( ) . Nodes ( ) . Delete ( node . Name ,  nil ) ;  err  !=  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-22 02:06:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												glog . Errorf ( "Unable to delete old node: %v" ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												glog . Errorf ( "Deleted old node object %q" ,  kl . nodeName ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											continue 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										glog . Infof ( "Successfully registered node %s" ,  node . Name ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										kl . registrationCompleted  =  true 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// syncNodeStatus should be called periodically from a goroutine.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// It synchronizes node status to master, registering the kubelet first if
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// necessary.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  syncNodeStatus ( )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  kl . kubeClient  ==  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  kl . registerNode  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// This will exit immediately if it doesn't need to do anything.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										kl . registerWithApiserver ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  err  :=  kl . updateNodeStatus ( ) ;  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										glog . Errorf ( "Unable to update node status: %v" ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-10-08 03:19:06 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// relabelVolumes relabels SELinux volumes to match the pod's
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// SELinuxOptions specification. This is only needed if the pod uses
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// hostPID or hostIPC. Otherwise relabeling is delegated to docker.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  relabelVolumes ( pod  * api . Pod ,  volumes  kubecontainer . VolumeMap )  error  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  pod . Spec . SecurityContext . SELinuxOptions  ==  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									rootDirContext ,  err  :=  kl . getRootDirContext ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									chconRunner  :=  selinux . NewChconRunner ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// Apply the pod's Level to the rootDirContext
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									rootDirSELinuxOptions ,  err  :=  securitycontext . ParseSELinuxOptions ( rootDirContext ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									rootDirSELinuxOptions . Level  =  pod . Spec . SecurityContext . SELinuxOptions . Level 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									volumeContext  :=  fmt . Sprintf ( "%s:%s:%s:%s" ,  rootDirSELinuxOptions . User ,  rootDirSELinuxOptions . Role ,  rootDirSELinuxOptions . Type ,  rootDirSELinuxOptions . Level ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-10-31 04:25:36 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									for  _ ,  vol  :=  range  volumes  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  vol . Builder . GetAttributes ( ) . Managed  &&  vol . Builder . GetAttributes ( ) . SupportsSELinux  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-08 03:19:06 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											// Relabel the volume and its content to match the 'Level' of the pod
 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-31 04:25:36 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											err  :=  filepath . Walk ( vol . Builder . GetPath ( ) ,  func ( path  string ,  info  os . FileInfo ,  err  error )  error  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-08 03:19:06 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
													return  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												return  chconRunner . SetContext ( path ,  volumeContext ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												return  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-31 04:25:36 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											vol . SELinuxLabeled  =  true 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-08 03:19:06 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-10-22 01:17:27 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								func  makeMounts ( pod  * api . Pod ,  podDir  string ,  container  * api . Container ,  podVolumes  kubecontainer . VolumeMap )  ( [ ] kubecontainer . Mount ,  error )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// Kubernetes only mounts on /etc/hosts if :
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// - container does not use hostNetwork and
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// - container is not a infrastructure(pause) container
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// - container is not already mounting on /etc/hosts
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// When the pause container is being created, its IP is still unknown. Hence, PodIP will not have been set.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-24 02:52:59 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									mountEtcHostsFile  :=  ( pod . Spec . SecurityContext  ==  nil  ||  ! pod . Spec . SecurityContext . HostNetwork )  &&  len ( pod . Status . PodIP )  >  0 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-04 07:25:03 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									glog . V ( 3 ) . Infof ( "container: %v/%v/%v podIP: %q creating hosts mount: %v" ,  pod . Namespace ,  pod . Name ,  container . Name ,  pod . Status . PodIP ,  mountEtcHostsFile ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-22 01:17:27 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									mounts  :=  [ ] kubecontainer . Mount { } 
							 
						 
					
						
							
								
									
										
										
										
											2014-08-27 13:08:06 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									for  _ ,  mount  :=  range  container . VolumeMounts  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-22 01:17:27 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										mountEtcHostsFile  =  mountEtcHostsFile  &&  ( mount . MountPath  !=  etcHostsPath ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-08-27 13:08:06 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										vol ,  ok  :=  podVolumes [ mount . Name ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  ! ok  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-16 08:40:07 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											glog . Warningf ( "Mount cannot be satisified for container %q, because the volume is missing: %q" ,  container . Name ,  mount ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-08-27 13:08:06 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											continue 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-20 07:59:48 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-08 03:19:06 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										relabelVolume  :=  false 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// If the volume supports SELinux and it has not been
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// relabeled already and it is not a read-only volume,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// relabel it and mark it as labeled
 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-21 02:01:45 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if  vol . Builder . GetAttributes ( ) . Managed  &&  vol . Builder . GetAttributes ( ) . SupportsSELinux  &&  ! vol . SELinuxLabeled  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-08 03:19:06 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											vol . SELinuxLabeled  =  true 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											relabelVolume  =  true 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-13 05:49:35 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										mounts  =  append ( mounts ,  kubecontainer . Mount { 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-08 03:19:06 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											Name :            mount . Name , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											ContainerPath :   mount . MountPath , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											HostPath :        vol . Builder . GetPath ( ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											ReadOnly :        mount . ReadOnly , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											SELinuxRelabel :  relabelVolume , 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-13 05:49:35 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-22 01:17:27 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  mountEtcHostsFile  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										hostsMount ,  err  :=  makeHostsMount ( podDir ,  pod . Status . PodIP ,  pod . Name ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											return  nil ,  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										mounts  =  append ( mounts ,  * hostsMount ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  mounts ,  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  makeHostsMount ( podDir ,  podIP ,  podName  string )  ( * kubecontainer . Mount ,  error )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									hostsFilePath  :=  path . Join ( podDir ,  "etc-hosts" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  err  :=  ensureHostsFile ( hostsFilePath ,  podIP ,  podName ) ;  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  nil ,  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  & kubecontainer . Mount { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										Name :           "k8s-managed-etc-hosts" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										ContainerPath :  etcHostsPath , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										HostPath :       hostsFilePath , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										ReadOnly :       false , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} ,  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ensureHostsFile ( fileName  string ,  hostIP ,  hostName  string )  error  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  _ ,  err  :=  os . Stat ( fileName ) ;  os . IsExist ( err )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										glog . V ( 4 ) . Infof ( "kubernetes-managed etc-hosts file exits. Will not be recreated: %q" ,  fileName ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									var  buffer  bytes . Buffer 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									buffer . WriteString ( "# Kubernetes-managed hosts file.\n" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									buffer . WriteString ( "127.0.0.1\tlocalhost\n" )                       // ipv4 localhost
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									buffer . WriteString ( "::1\tlocalhost ip6-localhost ip6-loopback\n" )  // ipv6 localhost
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									buffer . WriteString ( "fe00::0\tip6-localnet\n" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									buffer . WriteString ( "fe00::0\tip6-mcastprefix\n" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									buffer . WriteString ( "fe00::1\tip6-allnodes\n" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									buffer . WriteString ( "fe00::2\tip6-allrouters\n" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									buffer . WriteString ( fmt . Sprintf ( "%s\t%s\n" ,  hostIP ,  hostName ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  ioutil . WriteFile ( fileName ,  buffer . Bytes ( ) ,  0644 ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-13 05:49:35 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  makePortMappings ( container  * api . Container )  ( ports  [ ] kubecontainer . PortMapping )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									names  :=  make ( map [ string ] struct { } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									for  _ ,  p  :=  range  container . Ports  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										pm  :=  kubecontainer . PortMapping { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											HostPort :       p . HostPort , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											ContainerPort :  p . ContainerPort , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											Protocol :       p . Protocol , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											HostIP :         p . HostIP , 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-07 07:40:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-13 05:49:35 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// We need to create some default port name if it's not specified, since
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// this is necessary for rkt.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-06 09:08:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										// http://issue.k8s.io/7710
 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-13 05:49:35 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if  p . Name  ==  ""  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											pm . Name  =  fmt . Sprintf ( "%s-%s:%d" ,  container . Name ,  p . Protocol ,  p . ContainerPort ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											pm . Name  =  fmt . Sprintf ( "%s-%s" ,  container . Name ,  p . Name ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// Protect against exposing the same protocol-port more than once in a container.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  _ ,  ok  :=  names [ pm . Name ] ;  ok  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											glog . Warningf ( "Port name conflicted, %q is defined more than once" ,  pm . Name ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											continue 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										ports  =  append ( ports ,  pm ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										names [ pm . Name ]  =  struct { } { } 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-07 07:40:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-16 08:40:07 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									return 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-10 04:47:25 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-24 05:04:45 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-04-24 04:55:50 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// GenerateRunContainerOptions generates the RunContainerOptions, which can be used by
 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-27 02:59:41 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// the container runtime to set parameters for launching a container.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-13 05:18:00 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  GenerateRunContainerOptions ( pod  * api . Pod ,  container  * api . Container )  ( * kubecontainer . RunContainerOptions ,  error )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-27 02:59:41 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									var  err  error 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-13 05:18:00 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									opts  :=  & kubecontainer . RunContainerOptions { CgroupParent :  kl . cgroupRoot } 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-15 03:34:41 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-04-16 08:40:07 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									vol ,  ok  :=  kl . volumeManager . GetVolumes ( pod . UID ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  ! ok  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-22 03:25:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										return  nil ,  fmt . Errorf ( "impossible: cannot find the mounted volumes for pod %q" ,  format . Pod ( pod ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-16 08:40:07 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-13 05:49:35 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									opts . PortMappings  =  makePortMappings ( container ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-08 03:19:06 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Docker does not relabel volumes if the container is running
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// in the host pid or ipc namespaces so the kubelet must
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// relabel the volumes
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  pod . Spec . SecurityContext  !=  nil  &&  ( pod . Spec . SecurityContext . HostIPC  ||  pod . Spec . SecurityContext . HostPID )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										err  =  kl . relabelVolumes ( pod ,  vol ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											return  nil ,  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-10-22 01:17:27 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									opts . Mounts ,  err  =  makeMounts ( pod ,  kl . getPodDir ( pod . UID ) ,  container ,  vol ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  nil ,  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-24 04:57:30 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									opts . Envs ,  err  =  kl . makeEnvironmentVariables ( pod ,  container ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-07 07:40:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-27 02:59:41 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										return  nil ,  err 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-15 03:34:41 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-11-07 14:41:16 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  len ( container . TerminationMessagePath )  !=  0  { 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-23 23:47:25 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										p  :=  kl . getPodContainerDir ( pod . UID ,  container . Name ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-07 14:41:16 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if  err  :=  os . MkdirAll ( p ,  0750 ) ;  err  !=  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-06 08:38:47 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											glog . Errorf ( "Error on creating %q: %v" ,  p ,  err ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-07 14:41:16 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-27 02:59:41 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											opts . PodContainerDir  =  p 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-07 14:41:16 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-29 02:54:32 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-01-29 07:57:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									opts . DNS ,  opts . DNSSearch ,  err  =  kl . GetClusterDNS ( pod ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-29 02:54:32 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  nil ,  err 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-12 13:21:40 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-29 02:54:32 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-03-27 02:59:41 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									return  opts ,  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-09-10 01:45:01 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								var  masterServices  =  sets . NewString ( "kubernetes" ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-08 23:25:14 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// getServiceEnvVarMap makes a map[string]string of env vars for services a pod in namespace ns should see
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  getServiceEnvVarMap ( ns  string )  ( map [ string ] string ,  error )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									var  ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										serviceMap  =  make ( map [ string ] api . Service ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										m           =  make ( map [ string ] string ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// Get all service resources from the master (via a cache),
 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-04 04:29:14 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// and populate them into service environment variables.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-08 23:25:14 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  kl . serviceLister  ==  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// Kubelets without masters (e.g. plain GCE ContainerVM) don't set env vars.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  m ,  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									services ,  err  :=  kl . serviceLister . List ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-17 01:33:20 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										return  m ,  fmt . Errorf ( "failed to list services when setting up env vars." ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-08 23:25:14 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// project the services in namespace ns onto the master services
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									for  _ ,  service  :=  range  services . Items  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-24 04:41:11 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										// ignore services where ClusterIP is "None" or empty
 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-17 05:36:30 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if  ! api . IsServiceIPSet ( & service )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											continue 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-08 23:25:14 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										serviceName  :=  service . Name 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										switch  service . Namespace  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// for the case whether the master service namespace is the namespace the pod
 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-29 01:00:53 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										// is in, the pod should receive all the services in the namespace.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-08 23:25:14 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										//
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// ordering of the case clauses below enforces this
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										case  ns : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											serviceMap [ serviceName ]  =  service 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										case  kl . masterServiceNamespace : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											if  masterServices . Has ( serviceName )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-03 02:46:57 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												if  _ ,  exists  :=  serviceMap [ serviceName ] ;  ! exists  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-08 23:25:14 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
													serviceMap [ serviceName ]  =  service 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									services . Items  =  [ ] api . Service { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									for  _ ,  service  :=  range  serviceMap  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										services . Items  =  append ( services . Items ,  service ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									for  _ ,  e  :=  range  envvars . FromServices ( & services )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										m [ e . Name ]  =  e . Value 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  m ,  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// Make the service environment variables for a pod in the given namespace.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-13 05:49:35 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  makeEnvironmentVariables ( pod  * api . Pod ,  container  * api . Container )  ( [ ] kubecontainer . EnvVar ,  error )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									var  result  [ ] kubecontainer . EnvVar 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-08 23:25:14 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Note:  These are added to the docker.Config, but are not included in the checksum computed
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// by dockertools.BuildDockerName(...).  That way, we can still determine whether an
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// api.Container is already running by its hash. (We don't want to restart a container just
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// because some service changed.)
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									//
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// Note that there is a race between Kubelet seeing the pod and kubelet seeing the service.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// To avoid this users can: (1) wait between starting a service and starting; or (2) detect
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// missing service env var and exit and be restarted; or (3) use DNS instead of env vars
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// and keep trying to resolve the DNS name of the service (recommended).
 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-24 04:57:30 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									serviceEnv ,  err  :=  kl . getServiceEnvVarMap ( pod . Namespace ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-08 23:25:14 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  result ,  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-05-23 06:21:03 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Determine the final values of variables:
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									//
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// 1.  Determine the final value of each variable:
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									//     a.  If the variable's Value is set, expand the `$(var)` references to other
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									//         variables in the .Value field; the sources of variables are the declared
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									//         variables of the container and the service environment variables
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									//     b.  If a source is defined for an environment variable, resolve the source
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// 2.  Create the container's environment in the order variables are declared
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// 3.  Add remaining service environment vars
 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-18 04:51:51 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									var  ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										tmpEnv       =  make ( map [ string ] string ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-16 00:48:36 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										configMaps   =  make ( map [ string ] * api . ConfigMap ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-19 01:20:51 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										secrets      =  make ( map [ string ] * api . Secret ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-18 04:51:51 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										mappingFunc  =  expansion . MappingFuncFor ( tmpEnv ,  serviceEnv ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									) 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-23 06:21:03 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									for  _ ,  envVar  :=  range  container . Env  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-12 22:39:22 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										// Accesses apiserver+Pods.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-08 23:25:14 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										// So, the master may set service env vars, or kubelet may.  In case both are doing
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// it, we delete the key from the kubelet-generated ones so we don't have duplicate
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// env vars.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// TODO: remove this net line once all platforms use apiserver+Pods.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-23 06:21:03 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										delete ( serviceEnv ,  envVar . Name ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										runtimeVal  :=  envVar . Value 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  runtimeVal  !=  ""  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											// Step 1a: expand variable references
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											runtimeVal  =  expansion . Expand ( runtimeVal ,  mappingFunc ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-18 04:51:51 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										}  else  if  envVar . ValueFrom  !=  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-23 06:21:03 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											// Step 1b: resolve alternate env var sources
 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-18 04:51:51 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											switch  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											case  envVar . ValueFrom . FieldRef  !=  nil : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												runtimeVal ,  err  =  kl . podFieldSelectorRuntimeValue ( envVar . ValueFrom . FieldRef ,  pod ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
													return  result ,  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											case  envVar . ValueFrom . ConfigMapKeyRef  !=  nil : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												name  :=  envVar . ValueFrom . ConfigMapKeyRef . Name 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												key  :=  envVar . ValueFrom . ConfigMapKeyRef . Key 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												configMap ,  ok  :=  configMaps [ name ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												if  ! ok  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-04 05:21:05 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
													configMap ,  err  =  kl . kubeClient . Core ( ) . ConfigMaps ( pod . Namespace ) . Get ( name ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-18 04:51:51 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
													if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
														return  result ,  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												runtimeVal ,  ok  =  configMap . Data [ key ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												if  ! ok  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
													return  result ,  fmt . Errorf ( "Couldn't find key %v in ConfigMap %v/%v" ,  key ,  pod . Namespace ,  name ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-19 01:20:51 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											case  envVar . ValueFrom . SecretKeyRef  !=  nil : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												name  :=  envVar . ValueFrom . SecretKeyRef . Name 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												key  :=  envVar . ValueFrom . SecretKeyRef . Key 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												secret ,  ok  :=  secrets [ name ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												if  ! ok  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-04 05:21:05 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
													secret ,  err  =  kl . kubeClient . Core ( ) . Secrets ( pod . Namespace ) . Get ( name ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-19 01:20:51 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
													if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
														return  result ,  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												runtimeValBytes ,  ok  :=  secret . Data [ key ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												if  ! ok  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
													return  result ,  fmt . Errorf ( "Couldn't find key %v in Secret %v/%v" ,  key ,  pod . Namespace ,  name ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												runtimeVal  =  string ( runtimeValBytes ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-23 06:21:03 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-24 04:57:30 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-05-23 06:21:03 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										tmpEnv [ envVar . Name ]  =  runtimeVal 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										result  =  append ( result ,  kubecontainer . EnvVar { Name :  envVar . Name ,  Value :  tmpEnv [ envVar . Name ] } ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-08 23:25:14 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// Append remaining service env vars.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									for  k ,  v  :=  range  serviceEnv  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-13 05:49:35 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										result  =  append ( result ,  kubecontainer . EnvVar { Name :  k ,  Value :  v } ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-08 23:25:14 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  result ,  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-04-24 04:57:30 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  podFieldSelectorRuntimeValue ( fs  * api . ObjectFieldSelector ,  pod  * api . Pod )  ( string ,  error )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									internalFieldPath ,  _ ,  err  :=  api . Scheme . ConvertFieldLabel ( fs . APIVersion ,  "Pod" ,  fs . FieldPath ,  "" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  "" ,  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-13 02:14:49 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									switch  internalFieldPath  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									case  "status.podIP" : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  pod . Status . PodIP ,  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-24 04:57:30 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									return  fieldpath . ExtractFieldPathAsString ( pod ,  internalFieldPath ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-01-29 07:57:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// GetClusterDNS returns a list of the DNS servers and a list of the DNS search
 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-27 02:59:41 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// domains of the cluster.
 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-29 07:57:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  GetClusterDNS ( pod  * api . Pod )  ( [ ] string ,  [ ] string ,  error )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-29 02:54:32 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									var  hostDNS ,  hostSearch  [ ] string 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-15 01:34:29 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Get host DNS settings
 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-29 02:54:32 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  kl . resolverConfig  !=  ""  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										f ,  err  :=  os . Open ( kl . resolverConfig ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											return  nil ,  nil ,  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										defer  f . Close ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-12 13:21:40 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-10-24 08:01:49 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										hostDNS ,  hostSearch ,  err  =  kl . parseResolvConf ( f ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-29 02:54:32 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											return  nil ,  nil ,  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-15 01:34:29 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									useClusterFirstPolicy  :=  pod . Spec . DNSPolicy  ==  api . DNSClusterFirst 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  useClusterFirstPolicy  &&  kl . clusterDNS  ==  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// clusterDNS is not known.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// pod with ClusterDNSFirst Policy cannot be created
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										kl . recorder . Eventf ( pod ,  api . EventTypeWarning ,  "MissingClusterDNS" ,  "kubelet does not have ClusterDNS IP configured and cannot create Pod using %q policy. Falling back to DNSDefault policy." ,  pod . Spec . DNSPolicy ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-22 03:25:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										log  :=  fmt . Sprintf ( "kubelet does not have ClusterDNS IP configured and cannot create Pod using %q policy. pod: %q. Falling back to DNSDefault policy." ,  pod . Spec . DNSPolicy ,  format . Pod ( pod ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-15 01:34:29 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										kl . recorder . Eventf ( kl . nodeRef ,  api . EventTypeWarning ,  "MissingClusterDNS" ,  log ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// fallback to DNSDefault
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										useClusterFirstPolicy  =  false 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  ! useClusterFirstPolicy  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-29 02:54:32 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										// When the kubelet --resolv-conf flag is set to the empty string, use
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// DNS settings that override the docker default (which is to use
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// /etc/resolv.conf) and effectivly disable DNS lookups. According to
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// the bind documentation, the behavior of the DNS client library when
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// "nameservers" are not specified is to "use the nameserver on the
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// local machine". A nameserver setting of localhost is equivalent to
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// this documented behavior.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  kl . resolverConfig  ==  ""  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											hostDNS  =  [ ] string { "127.0.0.1" } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											hostSearch  =  [ ] string { "." } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  hostDNS ,  hostSearch ,  nil 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-12 13:21:40 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-27 02:59:41 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-10-15 01:34:29 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// for a pod with DNSClusterFirst policy, the cluster DNS server is the only nameserver configured for
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// the pod. The cluster DNS server itself will forward queries to other nameservers that is configured to use,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// in case the cluster DNS server cannot resolve the DNS query itself
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									dns  :=  [ ] string { kl . clusterDNS . String ( ) } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									var  dnsSearch  [ ] string 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-12 13:21:40 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  kl . clusterDomain  !=  ""  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-02 03:21:39 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										nsSvcDomain  :=  fmt . Sprintf ( "%s.svc.%s" ,  pod . Namespace ,  kl . clusterDomain ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										svcDomain  :=  fmt . Sprintf ( "svc.%s" ,  kl . clusterDomain ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										dnsSearch  =  append ( [ ] string { nsSvcDomain ,  svcDomain ,  kl . clusterDomain } ,  hostSearch ... ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-29 02:54:32 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										dnsSearch  =  hostSearch 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-12 13:21:40 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-27 02:59:41 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									return  dns ,  dnsSearch ,  nil 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-12 13:21:40 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// Returns the list of DNS servers and DNS search domains.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-24 08:01:49 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  parseResolvConf ( reader  io . Reader )  ( nameservers  [ ] string ,  searches  [ ] string ,  err  error )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									var  scrubber  dnsScrubber 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  kl . cloud  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										scrubber  =  kl . cloud 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  parseResolvConf ( reader ,  scrubber ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// A helper for testing.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								type  dnsScrubber  interface  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									ScrubDNS ( nameservers ,  searches  [ ] string )  ( nsOut ,  srchOut  [ ] string ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  parseResolvConf ( reader  io . Reader ,  dnsScrubber  dnsScrubber )  ( nameservers  [ ] string ,  searches  [ ] string ,  err  error )  { 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-12 13:21:40 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									file ,  err  :=  ioutil . ReadAll ( reader ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  nil ,  nil ,  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// Lines of the form "nameserver 1.2.3.4" accumulate.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									nameservers  =  [ ] string { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// Lines of the form "search example.com" overrule - last one wins.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									searches  =  [ ] string { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									lines  :=  strings . Split ( string ( file ) ,  "\n" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									for  l  :=  range  lines  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										trimmed  :=  strings . TrimSpace ( lines [ l ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  strings . HasPrefix ( trimmed ,  "#" )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											continue 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										fields  :=  strings . Fields ( trimmed ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  len ( fields )  ==  0  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											continue 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  fields [ 0 ]  ==  "nameserver"  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											nameservers  =  append ( nameservers ,  fields [ 1 : ] ... ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  fields [ 0 ]  ==  "search"  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											searches  =  fields [ 1 : ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-24 08:01:49 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// Give the cloud-provider a chance to post-process DNS settings.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  dnsScrubber  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										nameservers ,  searches  =  dnsScrubber . ScrubDNS ( nameservers ,  searches ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-12 13:21:40 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									return  nameservers ,  searches ,  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-01-21 05:26:02 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// One of the following aruguements must be non-nil: runningPod, status.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// TODO: Modify containerRuntime.KillPod() to accept the right arguements.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  killPod ( pod  * api . Pod ,  runningPod  * kubecontainer . Pod ,  status  * kubecontainer . PodStatus )  error  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									var  p  kubecontainer . Pod 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  runningPod  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										p  =  * runningPod 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									}  else  if  status  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										p  =  kubecontainer . ConvertPodStatusToRunningPod ( status ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  kl . containerRuntime . KillPod ( pod ,  p ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-08-08 12:49:17 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-07-19 02:42:47 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								type  empty  struct { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-03-04 09:33:48 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// makePodDataDirs creates the dirs for the pod datas.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-13 21:19:07 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  makePodDataDirs ( pod  * api . Pod )  error  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-04 09:33:48 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									uid  :=  pod . UID 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  err  :=  os . Mkdir ( kl . getPodDir ( uid ) ,  0750 ) ;  err  !=  nil  &&  ! os . IsExist ( err )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  err  :=  os . Mkdir ( kl . getPodVolumesDir ( uid ) ,  0750 ) ;  err  !=  nil  &&  ! os . IsExist ( err )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  err  :=  os . Mkdir ( kl . getPodPluginsDir ( uid ) ,  0750 ) ;  err  !=  nil  &&  ! os . IsExist ( err )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-01-21 05:26:02 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  syncPod ( pod  * api . Pod ,  mirrorPod  * api . Pod ,  podStatus  * kubecontainer . PodStatus ,  updateType  kubetypes . SyncPodType )  error  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-06 03:42:23 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									var  firstSeenTime  time . Time 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-20 10:15:10 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  firstSeenTimeStr ,  ok  :=  pod . Annotations [ kubetypes . ConfigFirstSeenAnnotationKey ] ;  ok  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-10 01:24:31 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										firstSeenTime  =  kubetypes . ConvertToTimestamp ( firstSeenTimeStr ) . Get ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-06 03:42:23 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-09 22:23:52 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-01-20 10:15:10 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  updateType  ==  kubetypes . SyncPodCreate  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  ! firstSeenTime . IsZero ( )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											// This is the first time we are syncing the pod. Record the latency
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											// since kubelet first saw the pod if firstSeenTime is set.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											metrics . PodWorkerStartLatency . Observe ( metrics . SinceInMicroseconds ( firstSeenTime ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-09 22:23:52 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-20 10:15:10 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											glog . V ( 3 ) . Infof ( "First seen time not recorded for pod %q" ,  pod . UID ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-09 22:23:52 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-20 10:15:10 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-01-27 09:12:12 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									apiPodStatus  :=  kl . generatePodStatus ( pod ,  podStatus ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-20 10:15:10 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Record the time it takes for the pod to become running.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									existingStatus ,  ok  :=  kl . statusManager . GetPodStatus ( pod . UID ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-21 05:26:02 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ! ok  ||  existingStatus . Phase  ==  api . PodPending  &&  apiPodStatus . Phase  ==  api . PodRunning  && 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-20 10:15:10 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										! firstSeenTime . IsZero ( )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										metrics . PodStartLatency . Observe ( metrics . SinceInMicroseconds ( firstSeenTime ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									kl . statusManager . SetPodStatus ( pod ,  apiPodStatus ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-09 22:23:52 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-03-27 02:25:48 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Kill pods we can't run.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-20 09:57:58 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  err  :=  canRunPod ( pod ) ;  err  !=  nil  ||  pod . DeletionTimestamp  !=  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-21 05:26:02 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if  err  :=  kl . killPod ( pod ,  nil ,  podStatus ) ;  err  !=  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-15 15:32:10 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											utilruntime . HandleError ( err ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-20 09:57:58 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-27 02:25:48 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										return  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-11-05 02:50:43 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Create Mirror Pod for Static Pod if it doesn't already exist
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  kubepod . IsStaticPod ( pod )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-08 05:31:02 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										podFullName  :=  kubecontainer . GetPodFullName ( pod ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-22 03:55:37 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										deleted  :=  false 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-05 02:50:43 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if  mirrorPod  !=  nil  &&  ! kl . podManager . IsMirrorPodOf ( mirrorPod ,  pod )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											// The mirror pod is semantically different from the static pod. Remove
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											// it. The mirror pod will get recreated later.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-08 05:31:02 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											glog . Errorf ( "Deleting mirror pod %q because it is outdated" ,  format . Pod ( mirrorPod ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-05 02:50:43 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											if  err  :=  kl . podManager . DeleteMirrorPod ( podFullName ) ;  err  !=  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-08 05:31:02 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												glog . Errorf ( "Failed deleting mirror pod %q: %v" ,  format . Pod ( mirrorPod ) ,  err ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-22 03:55:37 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												deleted  =  true 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-05 02:50:43 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-22 03:55:37 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if  mirrorPod  ==  nil  ||  deleted  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-08 05:31:02 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											glog . V ( 3 ) . Infof ( "Creating a mirror pod for static pod %q" ,  format . Pod ( pod ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-05 02:50:43 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											if  err  :=  kl . podManager . CreateMirrorPod ( pod ) ;  err  !=  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-08 05:31:02 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												glog . Errorf ( "Failed creating a mirror pod for %q: %v" ,  format . Pod ( pod ) ,  err ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-05 02:50:43 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-04-18 07:12:08 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  err  :=  kl . makePodDataDirs ( pod ) ;  err  !=  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-08 05:31:02 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										glog . Errorf ( "Unable to make pod data directories for pod %q: %v" ,  format . Pod ( pod ) ,  err ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-18 07:12:08 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										return  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-04-16 08:40:07 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Mount volumes.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									podVolumes ,  err  :=  kl . mountExternalVolumes ( pod ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-25 10:54:27 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										ref ,  errGetRef  :=  api . GetReference ( pod ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  errGetRef  ==  nil  &&  ref  !=  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-08 05:31:02 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											kl . recorder . Eventf ( ref ,  api . EventTypeWarning ,  kubecontainer . FailedMountVolume ,  "Unable to mount volumes for pod %q: %v" ,  format . Pod ( pod ) ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											glog . Errorf ( "Unable to mount volumes for pod %q: %v; skipping pod" ,  format . Pod ( pod ) ,  err ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-25 10:54:27 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											return  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-16 08:40:07 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									kl . volumeManager . SetVolumes ( pod . UID ,  podVolumes ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-05-09 01:53:00 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									pullSecrets ,  err  :=  kl . getPullSecretsForPod ( pod ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-08 05:31:02 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										glog . Errorf ( "Unable to get pull secrets for pod %q: %v" ,  format . Pod ( pod ) ,  err ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-09 01:53:00 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										return  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-01-12 18:19:13 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									result  :=  kl . containerRuntime . SyncPod ( pod ,  apiPodStatus ,  podStatus ,  pullSecrets ,  kl . backOff ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-13 05:28:00 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									kl . reasonCache . Update ( pod . UID ,  result ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  err  =  result . Error ( ) ;  err  !=  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-01 09:37:15 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										return  err 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-10 22:09:55 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-08-11 06:08:31 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									ingress ,  egress ,  err  :=  extractBandwidthResources ( pod ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  egress  !=  nil  ||  ingress  !=  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-15 05:56:51 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if  podUsesHostNetwork ( pod )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-14 06:30:01 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											kl . recorder . Event ( pod ,  api . EventTypeWarning ,  kubecontainer . HostNetworkNotSupported ,  "Bandwidth shaping is not currently supported on the host network" ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-11 06:08:31 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										}  else  if  kl . shaper  !=  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-18 16:23:48 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											if  len ( apiPodStatus . PodIP )  >  0  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												err  =  kl . shaper . ReconcileCIDR ( fmt . Sprintf ( "%s/32" ,  apiPodStatus . PodIP ) ,  egress ,  ingress ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-11 06:08:31 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-14 06:30:01 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											kl . recorder . Event ( pod ,  api . EventTypeWarning ,  kubecontainer . UndefinedShaper ,  "Pod requests bandwidth shaping, but the shaper is undefined" ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-11 06:08:31 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-07-01 13:27:56 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									return  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-09-15 05:56:51 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								func  podUsesHostNetwork ( pod  * api . Pod )  bool  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  pod . Spec . SecurityContext  !=  nil  &&  pod . Spec . SecurityContext . HostNetwork 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-05-09 01:53:00 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// getPullSecretsForPod inspects the Pod and retrieves the referenced pull secrets
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// TODO duplicate secrets are being retrieved multiple times and there is no cache.  Creating and using a secret manager interface will make this easier to address.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  getPullSecretsForPod ( pod  * api . Pod )  ( [ ] api . Secret ,  error )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									pullSecrets  :=  [ ] api . Secret { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									for  _ ,  secretRef  :=  range  pod . Spec . ImagePullSecrets  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-04 05:21:05 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										secret ,  err  :=  kl . kubeClient . Core ( ) . Secrets ( pod . Namespace ) . Get ( secretRef . Name ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-09 01:53:00 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if  err  !=  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-15 00:51:28 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											glog . Warningf ( "Unable to retrieve pull secret %s/%s for %s/%s due to %v.  The image pull may not succeed." ,  pod . Namespace ,  secretRef . Name ,  pod . Namespace ,  pod . Name ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											continue 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-09 01:53:00 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										pullSecrets  =  append ( pullSecrets ,  * secret ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  pullSecrets ,  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-02-03 17:00:09 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// Return name of a volume. When the volume is a PersistentVolumeClaim,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// it returns name of the real PersistentVolume bound to the claim.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// It returns errror when the clam is not bound yet.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  resolveVolumeName ( pod  * api . Pod ,  volume  * api . Volume )  ( string ,  error )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									claimSource  :=  volume . VolumeSource . PersistentVolumeClaim 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  claimSource  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// resolve real volume behind the claim
 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-04 05:21:05 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										claim ,  err  :=  kl . kubeClient . Core ( ) . PersistentVolumeClaims ( pod . Namespace ) . Get ( claimSource . ClaimName ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-03 17:00:09 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											return  "" ,  fmt . Errorf ( "Cannot find claim %s/%s for volume %s" ,  pod . Namespace ,  claimSource . ClaimName ,  volume . Name ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  claim . Status . Phase  !=  api . ClaimBound  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											return  "" ,  fmt . Errorf ( "Claim for volume %s/%s is not bound yet" ,  pod . Namespace ,  claimSource . ClaimName ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// Use the real bound volume instead of PersistentVolume.Name
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  claim . Spec . VolumeName ,  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  volume . Name ,  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-07-31 05:04:19 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// Stores all volumes defined by the set of pods into a map.
 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-03 17:00:09 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// It stores real volumes there, i.e. persistent volume claims are resolved
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// to volumes that are bound to them.
 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-31 05:04:19 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// Keys for each entry are in the format (POD_ID)/(VOLUME_NAME)
 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-03 17:00:09 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  getDesiredVolumes ( pods  [ ] * api . Pod )  map [ string ] api . Volume  { 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-31 05:04:19 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									desiredVolumes  :=  make ( map [ string ] api . Volume ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-26 04:16:59 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									for  _ ,  pod  :=  range  pods  { 
							 
						 
					
						
							
								
									
										
										
										
											2014-10-09 03:56:02 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										for  _ ,  volume  :=  range  pod . Spec . Volumes  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-03 17:00:09 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											volumeName ,  err  :=  kl . resolveVolumeName ( pod ,  & volume ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												glog . V ( 3 ) . Infof ( "%v" ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												// Ignore the error and hope it's resolved next time
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												continue 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											identifier  :=  path . Join ( string ( pod . UID ) ,  volumeName ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-31 05:04:19 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											desiredVolumes [ identifier ]  =  volume 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-26 04:16:59 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-31 05:04:19 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									return  desiredVolumes 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-26 04:16:59 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-07-02 06:25:41 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// cleanupOrphanedPodDirs removes a pod directory if the pod is not in the
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// desired set of pods and there is no running containers in the pod.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  cleanupOrphanedPodDirs ( pods  [ ] * api . Pod ,  runningPods  [ ] * kubecontainer . Pod )  error  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-10 01:45:01 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									active  :=  sets . NewString ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-04 06:51:50 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									for  _ ,  pod  :=  range  pods  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-02 06:25:41 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										active . Insert ( string ( pod . UID ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-12 08:42:11 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-02 06:25:41 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									for  _ ,  pod  :=  range  runningPods  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										active . Insert ( string ( pod . ID ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-01-12 08:42:11 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									found ,  err  :=  kl . listPodsFromDisk ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									errlist  :=  [ ] error { } 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-28 13:17:57 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									for  _ ,  uid  :=  range  found  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  active . Has ( string ( uid ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											continue 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-02 06:32:03 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if  volumes ,  err  :=  kl . getPodVolumes ( uid ) ;  err  !=  nil  ||  len ( volumes )  !=  0  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											glog . V ( 3 ) . Infof ( "Orphaned pod %q found, but volumes are not cleaned up; err: %v, volumes: %v " ,  uid ,  err ,  volumes ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-28 13:17:57 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											continue 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-02 06:32:03 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-08-28 13:17:57 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										glog . V ( 3 ) . Infof ( "Orphaned pod %q found, removing" ,  uid ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  err  :=  os . RemoveAll ( kl . getPodDir ( uid ) ) ;  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											errlist  =  append ( errlist ,  err ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-12 08:42:11 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-14 13:18:37 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									return  utilerrors . NewAggregate ( errlist ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-12 08:42:11 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-08-11 06:08:31 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  cleanupBandwidthLimits ( allPods  [ ] * api . Pod )  error  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  kl . shaper  ==  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									currentCIDRs ,  err  :=  kl . shaper . GetCIDRs ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-10 01:45:01 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									possibleCIDRs  :=  sets . String { } 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-11 06:08:31 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									for  ix  :=  range  allPods  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										pod  :=  allPods [ ix ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										ingress ,  egress ,  err  :=  extractBandwidthResources ( pod ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											return  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  ingress  ==  nil  &&  egress  ==  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											glog . V ( 8 ) . Infof ( "Not a bandwidth limited container..." ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											continue 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										status ,  found  :=  kl . statusManager . GetPodStatus ( pod . UID ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  ! found  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-27 09:12:12 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											// TODO(random-liu): Cleanup status get functions. (issue #20477)
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											s ,  err  :=  kl . containerRuntime . GetPodStatus ( pod . UID ,  pod . Name ,  pod . Namespace ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-11 06:08:31 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												return  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-27 09:12:12 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											status  =  kl . generatePodStatus ( pod ,  s ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-11 06:08:31 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  status . Phase  ==  api . PodRunning  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											possibleCIDRs . Insert ( fmt . Sprintf ( "%s/32" ,  status . PodIP ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									for  _ ,  cidr  :=  range  currentCIDRs  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  ! possibleCIDRs . Has ( cidr )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											glog . V ( 2 ) . Infof ( "Removing CIDR: %s (%v)" ,  cidr ,  possibleCIDRs ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											if  err  :=  kl . shaper . Reset ( cidr ) ;  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												return  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-07-31 05:04:19 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// Compares the map of current volumes to the map of desired volumes.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// If an active volume does not have a respective desired volume, clean it up.
 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-03 17:00:09 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// This method is blocking:
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// 1) it talks to API server to find volumes bound to persistent volume claims
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// 2) it talks to cloud to detach volumes
 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-30 01:47:25 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  cleanupOrphanedVolumes ( pods  [ ] * api . Pod ,  runningPods  [ ] * kubecontainer . Pod )  error  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-03 17:00:09 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									desiredVolumes  :=  kl . getDesiredVolumes ( pods ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-23 23:47:25 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									currentVolumes  :=  kl . getPodVolumesFromDisk ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-30 01:47:25 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-09-10 01:45:01 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									runningSet  :=  sets . String { } 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-30 01:47:25 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									for  _ ,  pod  :=  range  runningPods  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										runningSet . Insert ( string ( pod . ID ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-04 04:14:16 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-30 01:47:25 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-07-31 05:04:19 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									for  name ,  vol  :=  range  currentVolumes  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  _ ,  ok  :=  desiredVolumes [ name ] ;  ! ok  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-04 04:14:16 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											parts  :=  strings . Split ( name ,  "/" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											if  runningSet . Has ( parts [ 0 ] )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-20 07:51:34 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												glog . Infof ( "volume %q, still has a container running %q, skipping teardown" ,  name ,  parts [ 0 ] ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-04 04:14:16 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												continue 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-31 05:04:19 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											//TODO (jonesdl) We should somehow differentiate between volumes that are supposed
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											//to be deleted and volumes that are leftover after a crash.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-06 08:38:47 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											glog . Warningf ( "Orphaned volume %q found, tearing down volume" ,  name ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-16 08:40:07 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											// TODO(yifan): Refactor this hacky string manipulation.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											kl . volumeManager . DeleteVolumes ( types . UID ( parts [ 0 ] ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-31 05:04:19 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											//TODO (jonesdl) This should not block other kubelet synchronization procedures
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											err  :=  vol . TearDown ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-30 01:20:50 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											if  err  !=  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-06 08:38:47 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												glog . Errorf ( "Could not tear down volume %q: %v" ,  name ,  err ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-30 01:20:50 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-26 04:16:59 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-08-20 09:57:58 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// Delete any pods that are no longer running and are marked for deletion.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  cleanupTerminatedPods ( pods  [ ] * api . Pod ,  runningPods  [ ] * kubecontainer . Pod )  error  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									var  terminating  [ ] * api . Pod 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									for  _ ,  pod  :=  range  pods  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  pod . DeletionTimestamp  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											found  :=  false 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											for  _ ,  runningPod  :=  range  runningPods  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												if  runningPod . ID  ==  pod . UID  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
													found  =  true 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
													break 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											if  found  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-08 05:31:02 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												glog . V ( 5 ) . Infof ( "Keeping terminated pod %q, still running" ,  format . Pod ( pod ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-20 09:57:58 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												continue 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											terminating  =  append ( terminating ,  pod ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  ! kl . statusManager . TerminatePods ( terminating )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  errors . New ( "not all pods were successfully terminated" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-05-16 08:01:56 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// pastActiveDeadline returns true if the pod has been active for more than
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// ActiveDeadlineSeconds.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  pastActiveDeadline ( pod  * api . Pod )  bool  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  pod . Spec . ActiveDeadlineSeconds  !=  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 04:26:56 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										podStatus ,  ok  :=  kl . statusManager . GetPodStatus ( pod . UID ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-16 08:01:56 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if  ! ok  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											podStatus  =  pod . Status 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-09 13:01:43 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-16 08:01:56 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if  ! podStatus . StartTime . IsZero ( )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											startTime  :=  podStatus . StartTime . Time 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-05 04:03:28 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											duration  :=  kl . clock . Since ( startTime ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-16 08:01:56 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											allowedDuration  :=  time . Duration ( * pod . Spec . ActiveDeadlineSeconds )  *  time . Second 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											if  duration  >=  allowedDuration  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												return  true 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-09 13:01:43 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-16 08:01:56 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									return  false 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-11-05 13:59:15 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// Get pods which should be resynchronized. Currently, the following pod should be resynchronized:
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								//   * pod whose work is ready.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								//   * pod past the active deadline.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  getPodsToSync ( )  [ ] * api . Pod  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									allPods  :=  kl . podManager . GetPods ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									podUIDs  :=  kl . workQueue . GetWork ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									podUIDSet  :=  sets . NewString ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									for  _ ,  podUID  :=  range  podUIDs  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										podUIDSet . Insert ( string ( podUID ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									var  podsToSync  [ ] * api . Pod 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									for  _ ,  pod  :=  range  allPods  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  kl . pastActiveDeadline ( pod )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											// The pod has passed the active deadline
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											podsToSync  =  append ( podsToSync ,  pod ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											continue 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  podUIDSet . Has ( string ( pod . UID ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											// The work of the pod is ready
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											podsToSync  =  append ( podsToSync ,  pod ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  podsToSync 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// Returns true if pod is in the terminated state ("Failed" or "Succeeded").
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  podIsTerminated ( pod  * api . Pod )  bool  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									var  status  api . PodStatus 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// Check the cached pod status which was set after the last sync.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									status ,  ok  :=  kl . statusManager . GetPodStatus ( pod . UID ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  ! ok  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// If there is no cached status, use the status from the
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// apiserver. This is useful if kubelet has recently been
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// restarted.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										status  =  pod . Status 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-16 08:01:56 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  status . Phase  ==  api . PodFailed  ||  status . Phase  ==  api . PodSucceeded  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  true 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-05-16 08:01:56 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									return  false 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-09 13:01:43 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  filterOutTerminatedPods ( pods  [ ] * api . Pod )  [ ] * api . Pod  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									var  filteredPods  [ ] * api . Pod 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									for  _ ,  p  :=  range  pods  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  kl . podIsTerminated ( p )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-25 02:20:23 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											continue 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										filteredPods  =  append ( filteredPods ,  p ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-25 02:20:23 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									return  filteredPods 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-12 07:25:17 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-16 01:26:56 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-08-12 07:25:17 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// removeOrphanedPodStatuses removes obsolete entries in podStatus where
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// the pod is no longer considered bound to this node.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  removeOrphanedPodStatuses ( pods  [ ] * api . Pod ,  mirrorPods  [ ] * api . Pod )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 04:26:56 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									podUIDs  :=  make ( map [ types . UID ] bool ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-12 07:25:17 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									for  _ ,  pod  :=  range  pods  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 04:26:56 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										podUIDs [ pod . UID ]  =  true 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-12 07:25:17 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 04:26:56 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									for  _ ,  pod  :=  range  mirrorPods  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										podUIDs [ pod . UID ]  =  true 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									kl . statusManager . RemoveOrphanedStatuses ( podUIDs ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-12 07:25:17 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-02-01 07:56:55 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  deletePod ( pod  * api . Pod )  error  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  pod  ==  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  fmt . Errorf ( "deletePod does not allow nil pod" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-06 09:20:57 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ! kl . allSourcesReady ( )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										// If the sources aren't ready, skip deletion, as we may accidentally delete pods
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// for sources that haven't reported yet.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  fmt . Errorf ( "skipping delete because sources aren't ready yet" ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-02 00:37:45 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-01 07:56:55 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									kl . podWorkers . ForgetWorker ( pod . UID ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-12 07:25:17 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Runtime cache may not have been updated to with the pod, but it's okay
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// because the periodic cleanup routine will attempt to delete again later.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									runningPods ,  err  :=  kl . runtimeCache . GetPods ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  fmt . Errorf ( "error listing containers: %v" ,  err ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-12 07:25:17 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-01 07:56:55 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									runningPod  :=  kubecontainer . Pods ( runningPods ) . FindPod ( "" ,  pod . UID ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  runningPod . IsEmpty ( )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										return  fmt . Errorf ( "pod not found" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-01 07:56:55 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									podPair  :=  kubecontainer . PodPair { pod ,  & runningPod } 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-02-01 07:56:55 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									kl . podKillingCh  <-  & podPair 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// TODO: delete the mirror pod here?
 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-27 17:19:41 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// We leave the volume/directory cleanup to the periodic cleanup routine.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// HandlePodCleanups performs a series of cleanup work, including terminating
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// pod workers, killing unwanted pods, and removing orphaned volumes/pod
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// directories.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// TODO(yujuhong): This function is executed by the main sync loop, so it
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// should not contain any blocking calls. Re-examine the function and decide
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// whether or not we should move it into a separte goroutine.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  HandlePodCleanups ( )  error  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									allPods ,  mirrorPods  :=  kl . podManager . GetPodsAndMirrorPods ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// Pod phase progresses monotonically. Once a pod has reached a final state,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// it should never leave regardless of the restart policy. The statuses
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// of such pods should not be changed, and there is no need to sync them.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// TODO: the logic here does not handle two cases:
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									//   1. If the containers were removed immediately after they died, kubelet
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									//      may fail to generate correct statuses, let alone filtering correctly.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									//   2. If kubelet restarted before writing the terminated status for a pod
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									//      to the apiserver, it could still restart the terminated pod (even
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									//      though the pod was not considered terminated by the apiserver).
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// These two conditions could be alleviated by checkpointing kubelet.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									activePods  :=  kl . filterOutTerminatedPods ( allPods ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									desiredPods  :=  make ( map [ types . UID ] empty ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									for  _ ,  pod  :=  range  activePods  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										desiredPods [ pod . UID ]  =  empty { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// Stop the workers for no-longer existing pods.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// TODO: is here the best place to forget pod workers?
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									kl . podWorkers . ForgetNonExistingPodWorkers ( desiredPods ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-26 01:39:41 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									kl . probeManager . CleanupPods ( activePods ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-08-12 07:25:17 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									runningPods ,  err  :=  kl . runtimeCache . GetPods ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										glog . Errorf ( "Error listing containers: %#v" ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									for  _ ,  pod  :=  range  runningPods  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  _ ,  found  :=  desiredPods [ pod . ID ] ;  ! found  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-01 07:56:55 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											kl . podKillingCh  <-  & kubecontainer . PodPair { nil ,  pod } 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-30 01:47:25 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									kl . removeOrphanedPodStatuses ( allPods ,  mirrorPods ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-30 01:47:25 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Note that we just killed the unwanted pods. This may not have reflected
 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-12 01:50:14 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// in the cache. We need to bypass the cache to get the latest set of
 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-30 01:47:25 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// running pods to clean up the volumes.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// TODO: Evaluate the performance impact of bypassing the runtime cache.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-02 06:25:11 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									runningPods ,  err  =  kl . containerRuntime . GetPods ( false ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-30 01:47:25 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										glog . Errorf ( "Error listing containers: %#v" ,  err ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-04 04:14:16 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										return  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-02-04 09:46:28 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Remove any orphaned volumes.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-19 04:12:35 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Note that we pass all pods (including terminated pods) to the function,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// so that we don't remove volumes associated with terminated but not yet
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// deleted pods.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									err  =  kl . cleanupOrphanedVolumes ( allPods ,  runningPods ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-12 08:42:11 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-15 06:26:50 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										glog . Errorf ( "Failed cleaning up orphaned volumes: %v" ,  err ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-12 08:42:11 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										return  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-04-15 06:26:50 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Remove any orphaned pod directories.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-19 04:12:35 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Note that we pass all pods (including terminated pods) to the function,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// so that we don't remove directories associated with terminated but not yet
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// deleted pods.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-02 06:25:41 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									err  =  kl . cleanupOrphanedPodDirs ( allPods ,  runningPods ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-12 08:42:11 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-15 06:26:50 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										glog . Errorf ( "Failed cleaning up orphaned pod directories: %v" ,  err ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-12 08:42:11 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										return  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-31 05:04:19 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-03-10 06:46:47 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Remove any orphaned mirror pods.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-24 03:17:12 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									kl . podManager . DeleteOrphanedMirrorPods ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-10 06:46:47 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-08-20 09:57:58 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  err  :=  kl . cleanupTerminatedPods ( allPods ,  runningPods ) ;  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										glog . Errorf ( "Failed to cleanup terminated pods: %v" ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-08-11 06:08:31 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Clear out any old bandwith rules
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  err  =  kl . cleanupBandwidthLimits ( allPods ) ;  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-08-13 20:59:15 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									kl . backOff . GC ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-07 07:40:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
									return  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// podKiller launches a goroutine to kill a pod received from the channel if
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// another goroutine isn't already in action.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  podKiller ( )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-10 01:45:01 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									killing  :=  sets . NewString ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									resultCh  :=  make ( chan  types . UID ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									defer  close ( resultCh ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									for  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										select  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-01 07:56:55 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										case  podPair ,  ok  :=  <- kl . podKillingCh : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											runningPod  :=  podPair . RunningPod 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											apiPod  :=  podPair . APIPod 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											if  ! ok  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-15 06:26:50 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-01 07:56:55 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											if  killing . Has ( string ( runningPod . ID ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												// The pod is already being killed.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												break 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-01 07:56:55 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											killing . Insert ( string ( runningPod . ID ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											go  func ( apiPod  * api . Pod ,  runningPod  * kubecontainer . Pod ,  ch  chan  types . UID )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												defer  func ( )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-01 07:56:55 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
													ch  <-  runningPod . ID 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												} ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-01 07:56:55 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												glog . V ( 2 ) . Infof ( "Killing unwanted pod %q" ,  runningPod . Name ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												err  :=  kl . killPod ( apiPod ,  runningPod ,  nil ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												if  err  !=  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-01 07:56:55 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
													glog . Errorf ( "Failed killing the pod %q: %v" ,  runningPod . Name ,  err ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-01 07:56:55 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											} ( apiPod ,  runningPod ,  resultCh ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-15 06:26:50 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										case  podID  :=  <- resultCh : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											killing . Delete ( string ( podID ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-15 06:26:50 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-04-04 06:51:50 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								type  podsByCreationTime  [ ] * api . Pod 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-28 05:43:21 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( s  podsByCreationTime )  Len ( )  int  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  len ( s ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( s  podsByCreationTime )  Swap ( i ,  j  int )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									s [ i ] ,  s [ j ]  =  s [ j ] ,  s [ i ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( s  podsByCreationTime )  Less ( i ,  j  int )  bool  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  s [ i ] . CreationTimestamp . Before ( s [ j ] . CreationTimestamp ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-03-21 00:52:32 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// checkHostPortConflicts detects pods with conflicted host ports.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								func  hasHostPortConflicts ( pods  [ ] * api . Pod )  bool  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-10 01:45:01 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									ports  :=  sets . String { } 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-04 06:51:50 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									for  _ ,  pod  :=  range  pods  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-07 07:30:52 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if  errs  :=  validation . AccumulateUniqueHostPorts ( pod . Spec . Containers ,  & ports ,  field . NewPath ( "spec" ,  "containers" ) ) ;  len ( errs )  >  0  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-22 03:25:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											glog . Errorf ( "Pod %q: HostPort is already allocated, ignoring: %v" ,  format . Pod ( pod ) ,  errs ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											return  true 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-08 12:48:47 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									return  false 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-04 02:33:25 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-01-21 07:34:58 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// hasInsufficientfFreeResources detects pods that exceeds node's cpu and memory resource.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  hasInsufficientfFreeResources ( pods  [ ] * api . Pod )  ( bool ,  bool )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-22 02:06:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									info ,  err  :=  kl . GetCachedMachineInfo ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-16 20:50:00 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-01 06:32:02 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										glog . Errorf ( "error getting machine info: %v" ,  err ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										// TODO: Should we admit the pod when machine info is unavailable?
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  false ,  false 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-16 20:50:00 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-10 08:09:53 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									capacity  :=  cadvisor . CapacityFromMachineInfo ( info ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									_ ,  notFittingCPU ,  notFittingMemory  :=  predicates . CheckPodsExceedingFreeResources ( pods ,  capacity ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  len ( notFittingCPU )  >  0 ,  len ( notFittingMemory )  >  0 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-21 00:52:32 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-05-12 16:24:08 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// handleOutOfDisk detects if pods can't fit due to lack of disk space.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  isOutOfDisk ( )  bool  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-12 16:24:08 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									outOfDockerDisk  :=  false 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									outOfRootDisk  :=  false 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// Check disk space once globally and reject or accept all new pods.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									withinBounds ,  err  :=  kl . diskSpaceManager . IsDockerDiskSpaceAvailable ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// Assume enough space in case of errors.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  err  ==  nil  &&  ! withinBounds  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										outOfDockerDisk  =  true 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									withinBounds ,  err  =  kl . diskSpaceManager . IsRootDiskSpaceAvailable ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// Assume enough space in case of errors.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  err  ==  nil  &&  ! withinBounds  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										outOfRootDisk  =  true 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									return  outOfDockerDisk  ||  outOfRootDisk 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-12 16:24:08 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// matchesNodeSelector returns true if pod matches node's labels.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  matchesNodeSelector ( pod  * api . Pod )  bool  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-13 08:28:34 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  kl . standaloneMode  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										return  true 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-13 08:28:34 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-22 02:00:04 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									node ,  err  :=  kl . GetNode ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-21 00:52:32 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										glog . Errorf ( "error getting node: %v" ,  err ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										return  true 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-21 00:52:32 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									return  predicates . PodMatchesNodeLabels ( pod ,  node ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-16 20:50:00 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  rejectPod ( pod  * api . Pod ,  reason ,  message  string )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-14 06:30:01 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									kl . recorder . Eventf ( pod ,  api . EventTypeWarning ,  reason ,  message ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									kl . statusManager . SetPodStatus ( pod ,  api . PodStatus { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										Phase :    api . PodFailed , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										Reason :   reason , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										Message :  "Pod "  +  message } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-15 04:02:36 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// canAdmitPod determines if a pod can be admitted, and gives a reason if it
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// cannot. "pod" is new pod, while "pods" include all admitted pods plus the
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// new pod. The function returns a boolean value indicating whether the pod
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// can be admitted, a brief single-word reason and a message explaining why
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// the pod cannot be admitted.
 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-28 14:13:05 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								//
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// This needs to be kept in sync with the scheduler's and daemonset's fit predicates,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// otherwise there will inevitably be pod delete create loops. This will be fixed
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// once we can extract these predicates into a common library. (#12744)
 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  canAdmitPod ( pods  [ ] * api . Pod ,  pod  * api . Pod )  ( bool ,  string ,  string )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  hasHostPortConflicts ( pods )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  false ,  "HostPortConflict" ,  "cannot start the pod due to host port conflict." 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  ! kl . matchesNodeSelector ( pod )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  false ,  "NodeSelectorMismatching" ,  "cannot be started due to node selector mismatch" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									cpu ,  memory  :=  kl . hasInsufficientfFreeResources ( pods ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  cpu  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  false ,  "InsufficientFreeCPU" ,  "cannot start the pod due to insufficient free CPU." 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									}  else  if  memory  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  false ,  "InsufficientFreeMemory" ,  "cannot be started due to insufficient free memory" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  kl . isOutOfDisk ( )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  false ,  "OutOfDisk" ,  "cannot be started due to lack of disk space." 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-15 04:02:36 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									return  true ,  "" ,  "" 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-08 12:48:47 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-07-02 04:01:39 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// syncLoop is the main loop for processing changes. It watches for changes from
 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-12 07:40:20 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// three channels (file, apiserver, and http) and creates a union of them. For
 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-07 07:40:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								// any new change seen, will run a sync against desired state and running state. If
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// no changes are seen to the configuration, will synchronize the last known desired
 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-12 04:29:50 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// state every sync-frequency seconds. Never returns.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-10 01:24:31 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  syncLoop ( updates  <- chan  kubetypes . PodUpdate ,  handler  SyncHandler )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-09 04:57:19 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									glog . Info ( "Starting kubelet main sync loop." ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-03 01:18:11 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// The resyncTicker wakes up kubelet to checks if there are any pod workers
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// that need to be sync'd. A one-second period is sufficient because the
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// sync interval is defaulted to 10s.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-04 02:03:39 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									syncTicker  :=  time . NewTicker ( time . Second ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									housekeepingTicker  :=  time . NewTicker ( housekeepingPeriod ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-08 05:42:21 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									plegCh  :=  kl . pleg . Watch ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-07 07:40:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
									for  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-25 06:26:25 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if  rs  :=  kl . runtimeState . errors ( ) ;  len ( rs )  !=  0  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											glog . Infof ( "skipping pod synchronization - %v" ,  rs ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-28 09:07:57 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											time . Sleep ( 5  *  time . Second ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											continue 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-08 05:42:21 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if  ! kl . syncLoopIteration ( updates ,  handler ,  syncTicker . C ,  housekeepingTicker . C ,  plegCh )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-16 03:29:34 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											break 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-18 06:31:46 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-11-04 02:03:39 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  syncLoopIteration ( updates  <- chan  kubetypes . PodUpdate ,  handler  SyncHandler , 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-08 05:42:21 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									syncCh  <- chan  time . Time ,  housekeepingCh  <- chan  time . Time ,  plegCh  <- chan  * pleg . PodLifecycleEvent )  bool  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-05 04:03:28 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									kl . syncLoopMonitor . Store ( kl . clock . Now ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-18 06:31:46 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									select  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-31 03:47:24 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									case  u ,  open  :=  <- updates : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  ! open  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-18 06:31:46 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											glog . Errorf ( "Update channel is closed. Exiting the sync loop." ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-31 03:47:24 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											return  false 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-18 13:34:11 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-06 09:20:57 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										kl . addSource ( u . Source ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-08 05:42:21 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										switch  u . Op  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-10 01:24:31 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										case  kubetypes . ADD : 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-21 01:54:37 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											glog . V ( 2 ) . Infof ( "SyncLoop (ADD, %q): %q" ,  u . Source ,  format . Pods ( u . Pods ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											handler . HandlePodAdditions ( u . Pods ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-10 01:24:31 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										case  kubetypes . UPDATE : 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-21 01:54:37 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											glog . V ( 2 ) . Infof ( "SyncLoop (UPDATE, %q): %q" ,  u . Source ,  format . Pods ( u . Pods ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											handler . HandlePodUpdates ( u . Pods ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-10 01:24:31 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										case  kubetypes . REMOVE : 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-21 01:54:37 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											glog . V ( 2 ) . Infof ( "SyncLoop (REMOVE, %q): %q" ,  u . Source ,  format . Pods ( u . Pods ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											handler . HandlePodDeletions ( u . Pods ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-09 11:13:09 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										case  kubetypes . RECONCILE : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											glog . V ( 4 ) . Infof ( "SyncLoop (RECONCILE, %q): %q" ,  u . Source ,  format . Pods ( u . Pods ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											handler . HandlePodReconcile ( u . Pods ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-10 01:24:31 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										case  kubetypes . SET : 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											// TODO: Do we want to support this?
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											glog . Errorf ( "Kubelet does not support snapshot update" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-08 05:42:21 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									case  e  :=  <- plegCh : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										pod ,  ok  :=  kl . podManager . GetPodByUID ( e . ID ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  ! ok  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											// If the pod no longer exists, ignore the event.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											glog . V ( 4 ) . Infof ( "SyncLoop (PLEG): ignore irrelevant event: %#v" ,  e ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											break 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-21 01:54:37 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										glog . V ( 2 ) . Infof ( "SyncLoop (PLEG): %q, event: %#v" ,  format . Pod ( pod ) ,  e ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-08 05:42:21 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										// Force the container runtime cache to update.
 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-05 04:03:28 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if  err  :=  kl . runtimeCache . ForceUpdateIfOlder ( kl . clock . Now ( ) ) ;  err  !=  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-08 05:42:21 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											glog . Errorf ( "SyncLoop: unable to update runtime cache" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											// TODO (yujuhong): should we delay the sync until container
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											// runtime can be updated?
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										handler . HandlePodSyncs ( [ ] * api . Pod { pod } ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-04 02:03:39 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									case  <- syncCh : 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-05 13:59:15 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										podsToSync  :=  kl . getPodsToSync ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-05 07:35:10 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if  len ( podsToSync )  ==  0  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											break 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-21 01:54:37 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										glog . V ( 4 ) . Infof ( "SyncLoop (SYNC): %d pods; %s" ,  len ( podsToSync ) ,  format . Pods ( podsToSync ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-03 01:18:11 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										kl . HandlePodSyncs ( podsToSync ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-20 06:15:59 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									case  update  :=  <- kl . livenessManager . Updates ( ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// We only care about failures (signalling container death) here.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  update . Result  ==  proberesults . Failure  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-21 01:54:37 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											glog . V ( 1 ) . Infof ( "SyncLoop (container unhealthy): %q" ,  format . Pod ( update . Pod ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-20 06:15:59 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											handler . HandlePodSyncs ( [ ] * api . Pod { update . Pod } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-04 02:03:39 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									case  <- housekeepingCh : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  ! kl . allSourcesReady ( )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											// If the sources aren't ready, skip housekeeping, as we may
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											// accidentally delete pods from unready sources.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											glog . V ( 4 ) . Infof ( "SyncLoop (housekeeping, skipped): sources aren't ready yet." ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											glog . V ( 4 ) . Infof ( "SyncLoop (housekeeping)" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											if  err  :=  handler . HandlePodCleanups ( ) ;  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												glog . Errorf ( "Failed cleaning pods: %v" ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-18 06:31:46 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-05 04:03:28 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									kl . syncLoopMonitor . Store ( kl . clock . Now ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-31 03:47:24 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									return  true 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-10-10 01:24:31 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  dispatchWork ( pod  * api . Pod ,  syncType  kubetypes . SyncPodType ,  mirrorPod  * api . Pod ,  start  time . Time )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  kl . podIsTerminated ( pod )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// Run the sync in an async worker.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-02 07:25:07 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									kl . podWorkers . UpdatePod ( pod ,  mirrorPod ,  syncType ,  func ( )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										metrics . PodWorkerLatency . WithLabelValues ( syncType . String ( ) ) . Observe ( metrics . SinceInMicroseconds ( start ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// Note the number of containers for new pods.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-10 01:24:31 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  syncType  ==  kubetypes . SyncPodCreate  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										metrics . ContainersPerPodCount . Observe ( float64 ( len ( pod . Spec . Containers ) ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// TODO: Consider handling all mirror pods updates in a separate component.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  handleMirrorPod ( mirrorPod  * api . Pod ,  start  time . Time )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// Mirror pod ADD/UPDATE/DELETE operations are considered an UPDATE to the
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// corresponding static pod. Send update to the pod worker if the static
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// pod exists.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  pod ,  ok  :=  kl . podManager . GetPodByMirrorPod ( mirrorPod ) ;  ok  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-10 01:24:31 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										kl . dispatchWork ( pod ,  kubetypes . SyncPodUpdate ,  mirrorPod ,  start ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  HandlePodAdditions ( pods  [ ] * api . Pod )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-05 04:03:28 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									start  :=  kl . clock . Now ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									sort . Sort ( podsByCreationTime ( pods ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									for  _ ,  pod  :=  range  pods  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										kl . podManager . AddPod ( pod ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-13 07:28:23 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if  kubepod . IsMirrorPod ( pod )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											kl . handleMirrorPod ( pod ,  start ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											continue 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// Note that allPods includes the new pod since we added at the
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// beginning of the loop.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										allPods  :=  kl . podManager . GetPods ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// We failed pods that we rejected, so activePods include all admitted
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// pods that are alive and the new pod.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										activePods  :=  kl . filterOutTerminatedPods ( allPods ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// Check if we can admit the pod; if not, reject it.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  ok ,  reason ,  message  :=  kl . canAdmitPod ( activePods ,  pod ) ;  ! ok  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											kl . rejectPod ( pod ,  reason ,  message ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											continue 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-07 07:40:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										mirrorPod ,  _  :=  kl . podManager . GetMirrorPodByPod ( pod ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-10 01:24:31 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										kl . dispatchWork ( pod ,  kubetypes . SyncPodCreate ,  mirrorPod ,  start ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-26 01:39:41 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										kl . probeManager . AddPod ( pod ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-07 07:40:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  HandlePodUpdates ( pods  [ ] * api . Pod )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-05 04:03:28 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									start  :=  kl . clock . Now ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									for  _ ,  pod  :=  range  pods  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										kl . podManager . UpdatePod ( pod ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-13 07:28:23 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if  kubepod . IsMirrorPod ( pod )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											kl . handleMirrorPod ( pod ,  start ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											continue 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// TODO: Evaluate if we need to validate and reject updates.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										mirrorPod ,  _  :=  kl . podManager . GetMirrorPodByPod ( pod ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-10 01:24:31 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										kl . dispatchWork ( pod ,  kubetypes . SyncPodUpdate ,  mirrorPod ,  start ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  HandlePodDeletions ( pods  [ ] * api . Pod )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-05 04:03:28 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									start  :=  kl . clock . Now ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									for  _ ,  pod  :=  range  pods  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										kl . podManager . DeletePod ( pod ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-13 07:28:23 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if  kubepod . IsMirrorPod ( pod )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											kl . handleMirrorPod ( pod ,  start ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											continue 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// Deletion is allowed to fail because the periodic cleanup routine
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// will trigger deletion again.
 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-01 07:56:55 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if  err  :=  kl . deletePod ( pod ) ;  err  !=  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-21 01:54:37 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											glog . V ( 2 ) . Infof ( "Failed to delete pod %q, err: %v" ,  format . Pod ( pod ) ,  err ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-26 01:39:41 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										kl . probeManager . RemovePod ( pod ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-12-09 11:13:09 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  HandlePodReconcile ( pods  [ ] * api . Pod )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									for  _ ,  pod  :=  range  pods  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// Update the pod in pod manager, status manager will do periodically reconcile according
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// to the pod manager.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										kl . podManager . UpdatePod ( pod ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  HandlePodSyncs ( pods  [ ] * api . Pod )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-05 04:03:28 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									start  :=  kl . clock . Now ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 08:52:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									for  _ ,  pod  :=  range  pods  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										mirrorPod ,  _  :=  kl . podManager . GetMirrorPodByPod ( pod ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-10 01:24:31 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										kl . dispatchWork ( pod ,  kubetypes . SyncPodSync ,  mirrorPod ,  start ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-18 06:31:46 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  LatestLoopEntryTime ( )  time . Time  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									val  :=  kl . syncLoopMonitor . Load ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  val  ==  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  time . Time { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  val . ( time . Time ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-07 07:40:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-01-29 11:27:56 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// validateContainerLogStatus returns the container ID for the desired container to retrieve logs for, based on the state
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// of the container. The previous flag will only return the logs for the the last terminated container, otherwise, the current
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// running container is preferred over a previous termination. If info about the container is not available then a specific
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// error is returned to the end user.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  validateContainerLogStatus ( podName  string ,  podStatus  * api . PodStatus ,  containerName  string ,  previous  bool )  ( containerID  kubecontainer . ContainerID ,  err  error )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-08 02:34:16 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									var  cID  string 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-03-25 19:09:35 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									cStatus ,  found  :=  api . GetContainerStatus ( podStatus . ContainerStatuses ,  containerName ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  ! found  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-29 11:27:56 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										return  kubecontainer . ContainerID { } ,  fmt . Errorf ( "container %q in pod %q is not available" ,  containerName ,  podName ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-24 08:33:43 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-29 11:27:56 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									lastState  :=  cStatus . LastTerminationState 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									waiting ,  running ,  terminated  :=  cStatus . State . Waiting ,  cStatus . State . Running ,  cStatus . State . Terminated 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									switch  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									case  previous : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  lastState . Terminated  ==  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											return  kubecontainer . ContainerID { } ,  fmt . Errorf ( "previous terminated container %q in pod %q not found" ,  containerName ,  podName ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-08 02:34:16 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-29 11:27:56 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										cID  =  lastState . Terminated . ContainerID 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									case  running  !=  nil : 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-08 02:34:16 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										cID  =  cStatus . ContainerID 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-29 11:27:56 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									case  terminated  !=  nil : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										cID  =  terminated . ContainerID 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									case  lastState . Terminated  !=  nil : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										cID  =  lastState . Terminated . ContainerID 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									case  waiting  !=  nil : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// output some info for the most common pending failures
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										switch  reason  :=  waiting . Reason ;  reason  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										case  kubecontainer . ErrImagePull . Error ( ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											return  kubecontainer . ContainerID { } ,  fmt . Errorf ( "container %q in pod %q is waiting to start: image can't be pulled" ,  containerName ,  podName ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										case  kubecontainer . ErrImagePullBackOff . Error ( ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											return  kubecontainer . ContainerID { } ,  fmt . Errorf ( "container %q in pod %q is waiting to start: trying and failing to pull image" ,  containerName ,  podName ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										default : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											return  kubecontainer . ContainerID { } ,  fmt . Errorf ( "container %q in pod %q is waiting to start: %v" ,  containerName ,  podName ,  reason ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									default : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// unrecognized state
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  kubecontainer . ContainerID { } ,  fmt . Errorf ( "container %q in pod %q is waiting to start - no logs yet" ,  containerName ,  podName ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-25 19:09:35 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-29 11:27:56 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-10-08 01:58:05 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									return  kubecontainer . ParseContainerID ( cID ) ,  nil 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-24 08:33:43 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-08-28 03:41:32 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// GetKubeletContainerLogs returns logs from the container
 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-07 23:18:56 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// TODO: this method is returning logs of random container attempts, when it should be returning the most recent attempt
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// or all of them.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-10 11:46:11 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  GetKubeletContainerLogs ( podFullName ,  containerName  string ,  logOptions  * api . PodLogOptions ,  stdout ,  stderr  io . Writer )  error  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-02 07:12:14 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// TODO(vmarmol): Refactor to not need the pod status and verification.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-16 06:30:28 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Pod workers periodically write status to statusManager. If status is not
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// cached there, something is wrong (or kubelet just restarted and hasn't
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// caught up yet). Just assume the pod is not ready yet.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 04:26:56 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									name ,  namespace ,  err  :=  kubecontainer . ParsePodFullName ( podFullName ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  fmt . Errorf ( "unable to parse pod full name %q: %v" ,  podFullName ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									pod ,  ok  :=  kl . GetPodByName ( namespace ,  name ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  ! ok  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-29 11:27:56 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										return  fmt . Errorf ( "pod %q cannot be found - no logs available" ,  name ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 04:26:56 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-10-24 05:31:40 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									podUID  :=  pod . UID 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  mirrorPod ,  ok  :=  kl . podManager . GetMirrorPodByPod ( pod ) ;  ok  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										podUID  =  mirrorPod . UID 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									podStatus ,  found  :=  kl . statusManager . GetPodStatus ( podUID ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-16 06:30:28 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ! found  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-07 04:15:40 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										// If there is no cached status, use the status from the
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// apiserver. This is useful if kubelet has recently been
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// restarted.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										podStatus  =  pod . Status 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-18 03:00:09 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-19 04:26:56 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-01-29 11:27:56 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									containerID ,  err  :=  kl . validateContainerLogStatus ( pod . Name ,  & podStatus ,  containerName ,  logOptions . Previous ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-24 08:33:43 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-29 11:27:56 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										return  err 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-12 09:03:59 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-10 11:46:11 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									return  kl . containerRuntime . GetContainerLogs ( pod ,  containerID ,  logOptions ,  stdout ,  stderr ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-08-28 03:41:32 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-02-10 00:40:42 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// GetHostname Returns the hostname as the kubelet sees it.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  GetHostname ( )  string  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  kl . hostname 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-03-24 20:35:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// Returns host IP or nil in case of error.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  GetHostIP ( )  ( net . IP ,  error )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-22 02:00:04 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									node ,  err  :=  kl . GetNode ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  nil ,  fmt . Errorf ( "cannot get node: %v" ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  nodeutil . GetNodeHostIP ( node ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-24 20:35:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-03-10 06:46:47 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// GetPods returns all pods bound to the kubelet and their spec, and the mirror
 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-24 03:17:12 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// pods.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-04 06:51:50 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  GetPods ( )  [ ] * api . Pod  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-21 08:22:02 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									return  kl . podManager . GetPods ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-10-23 07:52:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-06-24 07:01:12 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// GetRunningPods returns all pods running on kubelet from looking at the
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// container runtime cache. This function converts kubecontainer.Pod to
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// api.Pod, so only the fields that exist in both kubecontainer.Pod and
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// api.Pod are considered meaningful.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  GetRunningPods ( )  ( [ ] * api . Pod ,  error )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									pods ,  err  :=  kl . runtimeCache . GetPods ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  nil ,  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									apiPods  :=  make ( [ ] * api . Pod ,  0 ,  len ( pods ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									for  _ ,  pod  :=  range  pods  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										apiPods  =  append ( apiPods ,  pod . ToAPIPod ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  apiPods ,  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-03-20 07:51:34 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  GetPodByFullName ( podFullName  string )  ( * api . Pod ,  bool )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-21 08:22:02 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									return  kl . podManager . GetPodByFullName ( podFullName ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-20 07:51:34 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// GetPodByName provides the first pod that matches namespace and name, as well
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// as whether the pod was found.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-13 21:19:07 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  GetPodByName ( namespace ,  name  string )  ( * api . Pod ,  bool )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-21 08:22:02 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									return  kl . podManager . GetPodByName ( namespace ,  name ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-07 23:18:56 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-05-05 18:19:54 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  updateRuntimeUp ( )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-08 03:12:20 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  _ ,  err  :=  kl . containerRuntime . Version ( ) ;  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										glog . Errorf ( "Container runtime sanity check failed: %v" ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-05 18:19:54 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-08 03:12:20 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									kl . oneTimeInitializer . Do ( kl . initializeRuntimeDependentModules ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-05 04:03:28 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									kl . runtimeState . setRuntimeSync ( kl . clock . Now ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-05 18:19:54 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-12-17 07:31:10 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// TODO: remove when kubenet plugin is ready
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// NOTE!!! if you make changes here, also make them to kubenet
 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-12 05:07:24 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  reconcileCBR0 ( podCIDR  string )  error  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-09 02:47:33 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  podCIDR  ==  ""  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-23 08:06:04 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										glog . V ( 5 ) . Info ( "PodCIDR not set. Will not configure cbr0." ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-09 02:47:33 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										return  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-23 08:06:04 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									glog . V ( 5 ) . Infof ( "PodCIDR is set to %q" ,  podCIDR ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-09 02:47:33 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									_ ,  cidr ,  err  :=  net . ParseCIDR ( podCIDR ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// Set cbr0 interface address to first address in IPNet
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									cidr . IP . To4 ( ) [ 3 ]  +=  1 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  err  :=  ensureCbr0 ( cidr ) ;  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-11 06:08:31 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  kl . shaper  ==  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										glog . V ( 5 ) . Info ( "Shaper is nil, creating" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										kl . shaper  =  bandwidth . NewTCShaper ( "cbr0" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  kl . shaper . ReconcileInterface ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-09 02:47:33 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-09-22 02:06:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// updateNodeStatus updates node status to master with retries.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  updateNodeStatus ( )  error  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									for  i  :=  0 ;  i  <  nodeStatusUpdateRetry ;  i ++  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  err  :=  kl . tryUpdateNodeStatus ( ) ;  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											glog . Errorf ( "Error updating node status, will retry: %v" ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											return  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  fmt . Errorf ( "update node status exceeds retry count" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-11-14 06:30:01 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  recordNodeStatusEvent ( eventtype ,  event  string )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-22 02:06:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									glog . V ( 2 ) . Infof ( "Recording %s event message for node %s" ,  event ,  kl . nodeName ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// TODO: This requires a transaction, either both node status is updated
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// and event is recorded or neither should happen, see issue #6055.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-14 06:30:01 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									kl . recorder . Eventf ( kl . nodeRef ,  eventtype ,  event ,  "Node %s status is now: %s" ,  kl . nodeName ,  event ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-22 02:06:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-06-25 02:10:10 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  syncNetworkStatus ( )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-25 06:26:25 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									var  err  error 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-25 02:10:10 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  kl . configureCBR0  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-24 10:11:51 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if  kl . flannelExperimentalOverlay  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-22 09:37:32 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											podCIDR ,  err  :=  kl . flannelHelper . Handshake ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-21 11:41:32 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												glog . Infof ( "Flannel server handshake failed %v" ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-27 12:02:59 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											kl . updatePodCIDR ( podCIDR ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-21 11:41:32 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-08 04:44:40 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if  err  :=  ensureIPTablesMasqRule ( kl . nonMasqueradeCIDR ) ;  err  !=  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-25 06:26:25 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											err  =  fmt . Errorf ( "Error on adding ip table rules: %v" ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											glog . Error ( err ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-12 03:16:15 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											kl . runtimeState . setNetworkState ( err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											return 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-25 03:56:36 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-26 02:00:14 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										podCIDR  :=  kl . runtimeState . podCIDR ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-26 01:49:18 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if  len ( podCIDR )  ==  0  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-25 06:26:25 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											err  =  fmt . Errorf ( "ConfigureCBR0 requested, but PodCIDR not set. Will not configure CBR0 right now" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											glog . Warning ( err ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-12 03:16:15 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										}  else  if  err  =  kl . reconcileCBR0 ( podCIDR ) ;  err  !=  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-25 06:26:25 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											err  =  fmt . Errorf ( "Error configuring cbr0: %v" ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											glog . Error ( err ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-25 02:10:10 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-26 01:49:18 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									kl . runtimeState . setNetworkState ( err ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-25 02:10:10 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-11-12 14:25:59 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// Set addresses for the node.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  setNodeAddress ( node  * api . Node )  error  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-22 02:06:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Set addresses for the node.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  kl . cloud  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										instances ,  ok  :=  kl . cloud . Instances ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  ! ok  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											return  fmt . Errorf ( "failed to get instances from cloud provider" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// TODO(roberthbailey): Can we do this without having credentials to talk
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// to the cloud provider?
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// TODO(justinsb): We can if CurrentNodeName() was actually CurrentNode() and returned an interface
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										nodeAddresses ,  err  :=  instances . NodeAddresses ( kl . nodeName ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											return  fmt . Errorf ( "failed to get node address from cloud provider: %v" ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										node . Status . Addresses  =  nodeAddresses 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-10 10:05:35 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if  kl . nodeIP  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											node . Status . Addresses  =  [ ] api . NodeAddress { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												{ Type :  api . NodeLegacyHostIP ,  Address :  kl . nodeIP . String ( ) } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												{ Type :  api . NodeInternalIP ,  Address :  kl . nodeIP . String ( ) } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										}  else  if  addr  :=  net . ParseIP ( kl . hostname ) ;  addr  !=  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-22 02:06:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											node . Status . Addresses  =  [ ] api . NodeAddress { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												{ Type :  api . NodeLegacyHostIP ,  Address :  addr . String ( ) } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												{ Type :  api . NodeInternalIP ,  Address :  addr . String ( ) } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											addrs ,  err  :=  net . LookupIP ( node . Name ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												return  fmt . Errorf ( "can't get ip address of node %s: %v" ,  node . Name ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											}  else  if  len ( addrs )  ==  0  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												return  fmt . Errorf ( "no ip address for node %v" ,  node . Name ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												// check all ip addresses for this node.Name and try to find the first non-loopback IPv4 address.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												// If no match is found, it uses the IP of the interface with gateway on it.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												for  _ ,  ip  :=  range  addrs  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
													if  ip . IsLoopback ( )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
														continue 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
													if  ip . To4 ( )  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
														node . Status . Addresses  =  [ ] api . NodeAddress { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
															{ Type :  api . NodeLegacyHostIP ,  Address :  ip . String ( ) } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
															{ Type :  api . NodeInternalIP ,  Address :  ip . String ( ) } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
														} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
														break 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												if  len ( node . Status . Addresses )  ==  0  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-06 23:56:41 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
													ip ,  err  :=  utilnet . ChooseHostInterface ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-22 02:06:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
													if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
														return  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
													node . Status . Addresses  =  [ ] api . NodeAddress { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
														{ Type :  api . NodeLegacyHostIP ,  Address :  ip . String ( ) } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
														{ Type :  api . NodeInternalIP ,  Address :  ip . String ( ) } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-12 14:25:59 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									return  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-22 02:06:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-11-12 14:25:59 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  setNodeStatusMachineInfo ( node  * api . Node )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-22 02:06:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// TODO: Post NotReady if we cannot get MachineInfo from cAdvisor. This needs to start
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// cAdvisor locally, e.g. for test-cmd.sh, and in integration test.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									info ,  err  :=  kl . GetCachedMachineInfo ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// TODO(roberthbailey): This is required for test-cmd.sh to pass.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// See if the test should be updated instead.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										node . Status . Capacity  =  api . ResourceList { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											api . ResourceCPU :     * resource . NewMilliQuantity ( 0 ,  resource . DecimalSI ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											api . ResourceMemory :  resource . MustParse ( "0Gi" ) , 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-17 09:15:40 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											api . ResourcePods :    * resource . NewQuantity ( int64 ( kl . maxPods ) ,  resource . DecimalSI ) , 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-22 02:06:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										glog . Errorf ( "Error getting machine info: %v" ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										node . Status . NodeInfo . MachineID  =  info . MachineID 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										node . Status . NodeInfo . SystemUUID  =  info . SystemUUID 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-10 08:09:53 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										node . Status . Capacity  =  cadvisor . CapacityFromMachineInfo ( info ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-22 02:06:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										node . Status . Capacity [ api . ResourcePods ]  =  * resource . NewQuantity ( 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-17 09:15:40 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											int64 ( kl . maxPods ) ,  resource . DecimalSI ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-22 02:06:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if  node . Status . NodeInfo . BootID  !=  ""  && 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											node . Status . NodeInfo . BootID  !=  info . BootID  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											// TODO: This requires a transaction, either both node status is updated
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											// and event is recorded or neither should happen, see issue #6055.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-14 06:30:01 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											kl . recorder . Eventf ( kl . nodeRef ,  api . EventTypeWarning ,  kubecontainer . NodeRebooted , 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-22 02:06:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												"Node %s has been rebooted, boot id: %s" ,  kl . nodeName ,  info . BootID ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										node . Status . NodeInfo . BootID  =  info . BootID 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-12 09:51:39 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// Set Allocatable.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									node . Status . Allocatable  =  make ( api . ResourceList ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									for  k ,  v  :=  range  node . Status . Capacity  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										value  :=  * ( v . Copy ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  kl . reservation . System  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											value . Sub ( kl . reservation . System [ k ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  kl . reservation . Kubernetes  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											value . Sub ( kl . reservation . Kubernetes [ k ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  value . Amount  !=  nil  &&  value . Amount . Sign ( )  <  0  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											// Negative Allocatable resources don't make sense.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											value . Set ( 0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										node . Status . Allocatable [ k ]  =  value 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-12 14:25:59 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-22 02:06:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-11-12 14:25:59 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// Set versioninfo for the node.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  setNodeStatusVersionInfo ( node  * api . Node )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-22 02:06:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									verinfo ,  err  :=  kl . cadvisor . VersionInfo ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										glog . Errorf ( "Error getting version info: %v" ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										node . Status . NodeInfo . KernelVersion  =  verinfo . KernelVersion 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-12 15:53:34 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										node . Status . NodeInfo . OSImage  =  verinfo . ContainerOsVersion 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-15 07:16:07 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										runtimeVersion  :=  "Unknown" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  runtimeVer ,  err  :=  kl . containerRuntime . Version ( ) ;  err  ==  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											runtimeVersion  =  runtimeVer . String ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										node . Status . NodeInfo . ContainerRuntimeVersion  =  fmt . Sprintf ( "%s://%s" ,  kl . containerRuntime . Type ( ) ,  runtimeVersion ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-09-22 02:06:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										node . Status . NodeInfo . KubeletVersion  =  version . Get ( ) . String ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// TODO: kube-proxy might be different version from kubelet in the future
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										node . Status . NodeInfo . KubeProxyVersion  =  version . Get ( ) . String ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-11-12 14:25:59 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// Set daemonEndpoints for the node.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  setNodeStatusDaemonEndpoints ( node  * api . Node )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-22 02:06:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									node . Status . DaemonEndpoints  =  * kl . daemonEndpoints 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-12 14:25:59 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-22 02:06:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-12-02 16:53:56 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// Set images list fot this node
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  setNodeStatusImages ( node  * api . Node )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// Update image list of this node
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									var  imagesOnNode  [ ] api . ContainerImage 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									containerImages ,  err  :=  kl . imageManager . GetImageList ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										glog . Errorf ( "Error getting image list: %v" ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										for  _ ,  image  :=  range  containerImages  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											imagesOnNode  =  append ( imagesOnNode ,  api . ContainerImage { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												RepoTags :  image . RepoTags , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												Size :      image . Size , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									node . Status . Images  =  imagesOnNode 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-11-12 14:25:59 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// Set status for the node.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  setNodeStatusInfo ( node  * api . Node )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									kl . setNodeStatusMachineInfo ( node ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									kl . setNodeStatusVersionInfo ( node ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									kl . setNodeStatusDaemonEndpoints ( node ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-02 16:53:56 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									kl . setNodeStatusImages ( node ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-12 14:25:59 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// Set Readycondition for the node.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  setNodeReadyCondition ( node  * api . Node )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// NOTE(aaronlevy): NodeReady condition needs to be the last in the list of node conditions.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// This is due to an issue with version skewed kubelet and master components.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// ref: https://github.com/kubernetes/kubernetes/issues/16961
 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-05 04:03:28 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									currentTime  :=  unversioned . NewTime ( kl . clock . Now ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-12 14:25:59 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									var  newNodeReadyCondition  api . NodeCondition 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  rs  :=  kl . runtimeState . errors ( ) ;  len ( rs )  ==  0  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										newNodeReadyCondition  =  api . NodeCondition { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											Type :               api . NodeReady , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											Status :             api . ConditionTrue , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											Reason :             "KubeletReady" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											Message :            "kubelet is posting ready status" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											LastHeartbeatTime :  currentTime , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										newNodeReadyCondition  =  api . NodeCondition { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											Type :               api . NodeReady , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											Status :             api . ConditionFalse , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											Reason :             "KubeletNotReady" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											Message :            strings . Join ( rs ,  "," ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											LastHeartbeatTime :  currentTime , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									readyConditionUpdated  :=  false 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									needToRecordEvent  :=  false 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									for  i  :=  range  node . Status . Conditions  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  node . Status . Conditions [ i ] . Type  ==  api . NodeReady  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											if  node . Status . Conditions [ i ] . Status  ==  newNodeReadyCondition . Status  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												newNodeReadyCondition . LastTransitionTime  =  node . Status . Conditions [ i ] . LastTransitionTime 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												newNodeReadyCondition . LastTransitionTime  =  currentTime 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												needToRecordEvent  =  true 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											node . Status . Conditions [ i ]  =  newNodeReadyCondition 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											readyConditionUpdated  =  true 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											break 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  ! readyConditionUpdated  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										newNodeReadyCondition . LastTransitionTime  =  currentTime 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										node . Status . Conditions  =  append ( node . Status . Conditions ,  newNodeReadyCondition ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  needToRecordEvent  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  newNodeReadyCondition . Status  ==  api . ConditionTrue  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											kl . recordNodeStatusEvent ( api . EventTypeNormal ,  kubecontainer . NodeReady ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											kl . recordNodeStatusEvent ( api . EventTypeNormal ,  kubecontainer . NodeNotReady ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// Set OODcondition for the node.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  setNodeOODCondition ( node  * api . Node )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-05 04:03:28 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									currentTime  :=  unversioned . NewTime ( kl . clock . Now ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-23 03:14:56 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									var  nodeOODCondition  * api . NodeCondition 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// Check if NodeOutOfDisk condition already exists and if it does, just pick it up for update.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									for  i  :=  range  node . Status . Conditions  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  node . Status . Conditions [ i ] . Type  ==  api . NodeOutOfDisk  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											nodeOODCondition  =  & node . Status . Conditions [ i ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									newOODCondition  :=  false 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// If the NodeOutOfDisk condition doesn't exist, create one.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  nodeOODCondition  ==  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										nodeOODCondition  =  & api . NodeCondition { 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-05 04:03:28 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											Type :    api . NodeOutOfDisk , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											Status :  api . ConditionUnknown , 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-23 03:14:56 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// nodeOODCondition cannot be appended to node.Status.Conditions here because it gets
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// copied to the slice. So if we append nodeOODCondition to the slice here none of the
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// updates we make to nodeOODCondition below are reflected in the slice.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										newOODCondition  =  true 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// Update the heartbeat time irrespective of all the conditions.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									nodeOODCondition . LastHeartbeatTime  =  currentTime 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// Note: The conditions below take care of the case when a new NodeOutOfDisk condition is
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// created and as well as the case when the condition already exists. When a new condition
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// is created its status is set to api.ConditionUnknown which matches either
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// nodeOODCondition.Status != api.ConditionTrue or
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// nodeOODCondition.Status != api.ConditionFalse in the conditions below depending on whether
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// the kubelet is out of disk or not.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  kl . isOutOfDisk ( )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  nodeOODCondition . Status  !=  api . ConditionTrue  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											nodeOODCondition . Status  =  api . ConditionTrue 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											nodeOODCondition . Reason  =  "KubeletOutOfDisk" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											nodeOODCondition . Message  =  "out of disk space" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											nodeOODCondition . LastTransitionTime  =  currentTime 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-14 06:30:01 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											kl . recordNodeStatusEvent ( api . EventTypeNormal ,  "NodeOutOfDisk" ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-23 03:14:56 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  nodeOODCondition . Status  !=  api . ConditionFalse  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-05 04:03:28 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											// Update the out of disk condition when the condition status is unknown even if we
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											// are within the outOfDiskTransitionFrequency duration. We do this to set the
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											// condition status correctly at kubelet startup.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											if  nodeOODCondition . Status  ==  api . ConditionUnknown  ||  kl . clock . Since ( nodeOODCondition . LastTransitionTime . Time )  >=  kl . outOfDiskTransitionFrequency  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												nodeOODCondition . Status  =  api . ConditionFalse 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												nodeOODCondition . Reason  =  "KubeletHasSufficientDisk" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												nodeOODCondition . Message  =  "kubelet has sufficient disk space available" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												nodeOODCondition . LastTransitionTime  =  currentTime 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												kl . recordNodeStatusEvent ( api . EventTypeNormal ,  "NodeHasSufficientDisk" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												glog . Infof ( "Node condition status for OutOfDisk is false, but last transition time is less than %s" ,  kl . outOfDiskTransitionFrequency ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-23 03:14:56 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  newOODCondition  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										node . Status . Conditions  =  append ( node . Status . Conditions ,  * nodeOODCondition ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-12 14:25:59 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-23 03:14:56 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-11-12 14:25:59 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// Maintains Node.Spec.Unschedulable value from previous run of tryUpdateNodeStatus()
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								var  oldNodeUnschedulable  bool 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-18 05:05:53 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-11-12 14:25:59 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// record if node schedulable change.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  recordNodeSchdulableEvent ( node  * api . Node )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-22 02:06:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  oldNodeUnschedulable  !=  node . Spec . Unschedulable  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  node . Spec . Unschedulable  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-14 06:30:01 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											kl . recordNodeStatusEvent ( api . EventTypeNormal ,  kubecontainer . NodeNotSchedulable ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-22 02:06:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-14 06:30:01 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											kl . recordNodeStatusEvent ( api . EventTypeNormal ,  kubecontainer . NodeSchedulable ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-22 02:06:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										oldNodeUnschedulable  =  node . Spec . Unschedulable 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-12 14:25:59 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// setNodeStatus fills in the Status fields of the given Node, overwriting
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// any fields that are currently set.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// TODO(madhusudancs): Simplify the logic for setting node conditions and
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// refactor the node status condtion code out to a different file.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  setNodeStatus ( node  * api . Node )  error  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  err  :=  kl . setNodeAddress ( node ) ;  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									kl . setNodeStatusInfo ( node ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									kl . setNodeOODCondition ( node ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									kl . setNodeReadyCondition ( node ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									kl . recordNodeSchdulableEvent ( node ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-22 02:06:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									return  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-11-07 09:03:39 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// FIXME: Why not combine this with container runtime health check?
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  isContainerRuntimeVersionCompatible ( )  error  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-22 04:04:10 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									switch  kl . GetRuntime ( ) . Type ( )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									case  "docker" : 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-15 07:16:07 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										version ,  err  :=  kl . GetRuntime ( ) . APIVersion ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-22 04:04:10 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if  err  !=  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-07 09:03:39 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											return  nil 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-22 04:04:10 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// Verify the docker version.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										result ,  err  :=  version . Compare ( dockertools . MinimumDockerAPIVersion ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  err  !=  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-07 09:03:39 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											return  fmt . Errorf ( "failed to compare current docker version %v with minimum support Docker version %q - %v" ,  version ,  dockertools . MinimumDockerAPIVersion ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  result  <  0  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											return  fmt . Errorf ( "container runtime version is older than %s" ,  dockertools . MinimumDockerAPIVersion ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-22 04:04:10 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-07 09:03:39 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									return  nil 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-22 04:04:10 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-09-22 02:06:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// tryUpdateNodeStatus tries to update node status to master. If ReconcileCBR0
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// is set, this function will also confirm that cbr0 is configured correctly.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  tryUpdateNodeStatus ( )  error  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-04 05:21:05 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									node ,  err  :=  kl . kubeClient . Core ( ) . Nodes ( ) . Get ( kl . nodeName ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-22 02:06:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  fmt . Errorf ( "error getting node %q: %v" ,  kl . nodeName ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  node  ==  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  fmt . Errorf ( "no node instance returned for %q" ,  kl . nodeName ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-24 10:11:51 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Flannel is the authoritative source of pod CIDR, if it's running.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// This is a short term compromise till we get flannel working in
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// reservation mode.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  kl . flannelExperimentalOverlay  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										flannelPodCIDR  :=  kl . runtimeState . podCIDR ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  node . Spec . PodCIDR  !=  flannelPodCIDR  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											node . Spec . PodCIDR  =  flannelPodCIDR 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											glog . Infof ( "Updating podcidr to %v" ,  node . Spec . PodCIDR ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-04 05:21:05 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											if  updatedNode ,  err  :=  kl . kubeClient . Core ( ) . Nodes ( ) . Update ( node ) ;  err  !=  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-24 10:11:51 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												glog . Warningf ( "Failed to update podCIDR: %v" ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												// Update the node resourceVersion so the status update doesn't fail.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												node  =  updatedNode 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-21 11:41:32 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									}  else  if  kl . reconcileCIDR  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-27 12:02:59 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										kl . updatePodCIDR ( node . Spec . PodCIDR ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-16 12:53:33 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-22 02:06:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  err  :=  kl . setNodeStatus ( node ) ;  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// Update the current status on the API server
 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-04 05:21:05 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									_ ,  err  =  kl . kubeClient . Core ( ) . Nodes ( ) . UpdateStatus ( node ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-22 02:06:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									return  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-06-12 19:11:53 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// GetPhase returns the phase of a pod given its container info.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// This func is exported to simplify integration with 3rd party kubelet
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// integrations like kubernetes-mesos.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  GetPhase ( spec  * api . PodSpec ,  info  [ ] api . ContainerStatus )  api . PodPhase  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-29 01:56:35 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									running  :=  0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									waiting  :=  0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									stopped  :=  0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									failed  :=  0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									succeeded  :=  0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									unknown  :=  0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									for  _ ,  container  :=  range  spec . Containers  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-05 06:46:36 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										containerStatus ,  ok  :=  api . GetContainerStatus ( info ,  container . Name ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  ! ok  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											unknown ++ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											continue 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										switch  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										case  containerStatus . State . Running  !=  nil : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											running ++ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										case  containerStatus . State . Terminated  !=  nil : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											stopped ++ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											if  containerStatus . State . Terminated . ExitCode  ==  0  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												succeeded ++ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												failed ++ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										case  containerStatus . State . Waiting  !=  nil : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											if  containerStatus . LastTerminationState . Terminated  !=  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-29 01:56:35 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												stopped ++ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-05 06:46:36 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												waiting ++ 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-29 01:56:35 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-05 06:46:36 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										default : 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-29 01:56:35 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											unknown ++ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-05 06:46:36 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-01-29 01:56:35 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									switch  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									case  waiting  >  0 : 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-10 05:55:36 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										glog . V ( 5 ) . Infof ( "pod waiting > 0, pending" ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-29 01:56:35 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										// One or more containers has not been started
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  api . PodPending 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									case  running  >  0  &&  unknown  ==  0 : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// All containers have been started, and at least
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// one container is running
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  api . PodRunning 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									case  running  ==  0  &&  stopped  >  0  &&  unknown  ==  0 : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// All containers are terminated
 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-14 09:38:07 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if  spec . RestartPolicy  ==  api . RestartPolicyAlways  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-29 01:56:35 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											// All containers are in the process of restarting
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											return  api . PodRunning 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  stopped  ==  succeeded  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											// RestartPolicy is not Always, and all
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											// containers are terminated in success
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											return  api . PodSucceeded 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-14 09:38:07 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if  spec . RestartPolicy  ==  api . RestartPolicyNever  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-29 01:56:35 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											// RestartPolicy is Never, and all containers are
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											// terminated with at least one in failure
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											return  api . PodFailed 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// RestartPolicy is OnFailure, and at least one in failure
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// and in the process of restarting
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  api . PodRunning 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									default : 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-10 05:55:36 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										glog . V ( 5 ) . Infof ( "pod default case, pending" ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-29 01:56:35 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										return  api . PodPending 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-01-20 10:15:10 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// Get the internal PodStatus from the cache if the cache exists;
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// otherwise, query the runtime directly.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  getRuntimePodStatus ( pod  * api . Pod )  ( * kubecontainer . PodStatus ,  error )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-05 04:03:28 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									start  :=  kl . clock . Now ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-10 05:01:23 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									defer  func ( )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										metrics . PodStatusLatency . Observe ( metrics . SinceInMicroseconds ( start ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-20 10:15:10 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  kl . podCache  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  kl . podCache . Get ( pod . UID ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  kl . containerRuntime . GetPodStatus ( pod . UID ,  pod . Name ,  pod . Namespace ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-10 05:01:23 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-01-27 09:12:12 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  generatePodStatus ( pod  * api . Pod ,  podStatus  * kubecontainer . PodStatus )  api . PodStatus  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-08 05:31:02 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									glog . V ( 3 ) . Infof ( "Generating status for %q" ,  format . Pod ( pod ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-16 08:01:56 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// TODO: Consider include the container information.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  kl . pastActiveDeadline ( pod )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-09 23:58:16 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										reason  :=  "DeadlineExceeded" 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-14 06:30:01 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										kl . recorder . Eventf ( pod ,  api . EventTypeNormal ,  reason ,  "Pod was active on the node longer than specified deadline" ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-16 08:01:56 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										return  api . PodStatus { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											Phase :    api . PodFailed , 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-09 23:58:16 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											Reason :   reason , 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-27 09:12:12 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											Message :  "Pod was active on the node longer than specified deadline" } 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-16 08:01:56 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-09 13:01:43 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-01-21 09:24:31 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									s  :=  kl . convertStatusToAPIStatus ( pod ,  podStatus ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-10 05:55:36 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-02-10 05:55:36 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Assume info is ready to process
 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-20 10:15:10 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									spec  :=  & pod . Spec 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									s . Phase  =  GetPhase ( spec ,  s . ContainerStatuses ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									kl . probeManager . UpdatePodStatus ( pod . UID ,  s ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									s . Conditions  =  append ( s . Conditions ,  status . GeneratePodReadyCondition ( spec ,  s . ContainerStatuses ,  s . Phase ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-09 02:53:31 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-06-13 01:20:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ! kl . standaloneMode  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-22 02:00:04 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										hostIP ,  err  :=  kl . GetHostIP ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-13 01:20:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											glog . V ( 4 ) . Infof ( "Cannot get host IP: %v" ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-20 10:15:10 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											s . HostIP  =  hostIP . String ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											if  podUsesHostNetwork ( pod )  &&  s . PodIP  ==  ""  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												s . PodIP  =  hostIP . String ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-19 02:30:59 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-13 01:20:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-24 20:35:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-29 01:56:35 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-01-27 09:12:12 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									return  * s 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-16 01:26:56 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-01-18 09:21:08 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// TODO(random-liu): Move this to some better place.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// TODO(random-liu): Add test for convertStatusToAPIStatus()
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  convertStatusToAPIStatus ( pod  * api . Pod ,  podStatus  * kubecontainer . PodStatus )  * api . PodStatus  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									var  apiPodStatus  api . PodStatus 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									uid  :=  pod . UID 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									convertContainerStatus  :=  func ( cs  * kubecontainer . ContainerStatus )  * api . ContainerStatus  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										cid  :=  cs . ID . String ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										status  :=  & api . ContainerStatus { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											Name :          cs . Name , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											RestartCount :  cs . RestartCount , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											Image :         cs . Image , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											ImageID :       cs . ImageID , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											ContainerID :   cid , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										switch  cs . State  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										case  kubecontainer . ContainerStateRunning : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											status . State . Running  =  & api . ContainerStateRunning { StartedAt :  unversioned . NewTime ( cs . StartedAt ) } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										case  kubecontainer . ContainerStateExited : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											status . State . Terminated  =  & api . ContainerStateTerminated { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												ExitCode :     cs . ExitCode , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												Reason :       cs . Reason , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												Message :      cs . Message , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												StartedAt :    unversioned . NewTime ( cs . StartedAt ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												FinishedAt :   unversioned . NewTime ( cs . FinishedAt ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												ContainerID :  cid , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										default : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											status . State . Waiting  =  & api . ContainerStateWaiting { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  status 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									statuses  :=  make ( map [ string ] * api . ContainerStatus ,  len ( pod . Spec . Containers ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// Create a map of expected containers based on the pod spec.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									expectedContainers  :=  make ( map [ string ] api . Container ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									for  _ ,  container  :=  range  pod . Spec . Containers  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										expectedContainers [ container . Name ]  =  container 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									containerDone  :=  sets . NewString ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									apiPodStatus . PodIP  =  podStatus . IP 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									for  _ ,  containerStatus  :=  range  podStatus . ContainerStatuses  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										cName  :=  containerStatus . Name 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  _ ,  ok  :=  expectedContainers [ cName ] ;  ! ok  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											// This would also ignore the infra container.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											continue 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  containerDone . Has ( cName )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											continue 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										status  :=  convertContainerStatus ( containerStatus ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  existing ,  found  :=  statuses [ cName ] ;  found  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											existing . LastTerminationState  =  status . State 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											containerDone . Insert ( cName ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											statuses [ cName ]  =  status 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// Handle the containers for which we cannot find any associated active or dead containers or are in restart backoff
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// Fetch old containers statuses from old pod status.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// TODO(random-liu) Maybe it's better to get status from status manager, because it takes the newest status and there is not
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// status in api.Pod of static pod.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									oldStatuses  :=  make ( map [ string ] api . ContainerStatus ,  len ( pod . Spec . Containers ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									for  _ ,  status  :=  range  pod . Status . ContainerStatuses  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										oldStatuses [ status . Name ]  =  status 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									for  _ ,  container  :=  range  pod . Spec . Containers  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// TODO(random-liu): We should define "Waiting" state better. And cleanup the following code.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  containerStatus ,  found  :=  statuses [ container . Name ] ;  found  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											reason ,  message ,  ok  :=  kl . reasonCache . Get ( uid ,  container . Name ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											if  ok  &&  reason  ==  kubecontainer . ErrCrashLoopBackOff  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												containerStatus . LastTerminationState  =  containerStatus . State 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												containerStatus . State  =  api . ContainerState { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
													Waiting :  & api . ContainerStateWaiting { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
														Reason :   reason . Error ( ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
														Message :  message , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
													} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											continue 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										var  containerStatus  api . ContainerStatus 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										containerStatus . Name  =  container . Name 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										containerStatus . Image  =  container . Image 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  oldStatus ,  found  :=  oldStatuses [ container . Name ] ;  found  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											// Some states may be lost due to GC; apply the last observed
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											// values if possible.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											containerStatus . RestartCount  =  oldStatus . RestartCount 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											containerStatus . LastTerminationState  =  oldStatus . LastTerminationState 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										reason ,  _ ,  ok  :=  kl . reasonCache . Get ( uid ,  container . Name ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  ! ok  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											// default position for a container
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											// At this point there are no active or dead containers, the reasonCache is empty (no entry or the entry has expired)
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											// its reasonable to say the container is being created till a more accurate reason is logged
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											containerStatus . State  =  api . ContainerState { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												Waiting :  & api . ContainerStateWaiting { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
													Reason :   fmt . Sprintf ( "ContainerCreating" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
													Message :  fmt . Sprintf ( "Image: %s is ready, container is creating" ,  container . Image ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										}  else  if  reason  ==  kubecontainer . ErrImagePullBackOff  || 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											reason  ==  kubecontainer . ErrImageInspect  || 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											reason  ==  kubecontainer . ErrImagePull  || 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											reason  ==  kubecontainer . ErrImageNeverPull  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											// mark it as waiting, reason will be filled bellow
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											containerStatus . State  =  api . ContainerState { Waiting :  & api . ContainerStateWaiting { } } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										}  else  if  reason  ==  kubecontainer . ErrRunContainer  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											// mark it as waiting, reason will be filled bellow
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											containerStatus . State  =  api . ContainerState { Waiting :  & api . ContainerStateWaiting { } } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										statuses [ container . Name ]  =  & containerStatus 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									apiPodStatus . ContainerStatuses  =  make ( [ ] api . ContainerStatus ,  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									for  containerName ,  status  :=  range  statuses  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  status . State . Waiting  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											status . State . Running  =  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											// For containers in the waiting state, fill in a specific reason if it is recorded.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											if  reason ,  message ,  ok  :=  kl . reasonCache . Get ( uid ,  containerName ) ;  ok  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												status . State . Waiting . Reason  =  reason . Error ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												status . State . Waiting . Message  =  message 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										apiPodStatus . ContainerStatuses  =  append ( apiPodStatus . ContainerStatuses ,  * status ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// Sort the container statuses since clients of this interface expect the list
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// of containers in a pod has a deterministic order.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									sort . Sort ( kubetypes . SortedContainerStatuses ( apiPodStatus . ContainerStatuses ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  & apiPodStatus 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-07-15 15:04:30 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// Returns logs of current machine.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  ServeLogs ( w  http . ResponseWriter ,  req  * http . Request )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// TODO: whitelist logs we are willing to serve
 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-23 05:40:59 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									kl . logServer . ServeHTTP ( w ,  req ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-15 15:04:30 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
									
										
										
										
											2014-08-08 02:15:11 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-04-07 07:58:34 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// findContainer finds and returns the container with the given pod ID, full name, and container name.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// It returns nil if not found.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  findContainer ( podFullName  string ,  podUID  types . UID ,  containerName  string )  ( * kubecontainer . Container ,  error )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-02 06:25:11 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									pods ,  err  :=  kl . containerRuntime . GetPods ( false ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-07 07:58:34 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  nil ,  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									pod  :=  kubecontainer . Pods ( pods ) . FindPod ( podFullName ,  podUID ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  pod . FindContainerByName ( containerName ) ,  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-08-08 02:15:11 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// Run a command in a container, returns the combined stdout, stderr as an array of bytes
 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-07 07:58:34 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  RunInContainer ( podFullName  string ,  podUID  types . UID ,  containerName  string ,  cmd  [ ] string )  ( [ ] byte ,  error )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									podUID  =  kl . podManager . TranslatePodUID ( podUID ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-21 04:55:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-04-07 07:58:34 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									container ,  err  :=  kl . findContainer ( podFullName ,  podUID ,  containerName ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-08-08 02:15:11 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  nil ,  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-07 07:58:34 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  container  ==  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  nil ,  fmt . Errorf ( "container not found (%q)" ,  containerName ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-08-08 02:15:11 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-08 01:58:05 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									return  kl . runner . RunInContainer ( container . ID ,  cmd ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-08-08 02:15:11 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-11 05:13:57 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-01-09 04:41:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// ExecInContainer executes a command in a container, connecting the supplied
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// stdin/stdout/stderr to the command's IO streams.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-07 07:58:34 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  ExecInContainer ( podFullName  string ,  podUID  types . UID ,  containerName  string ,  cmd  [ ] string ,  stdin  io . Reader ,  stdout ,  stderr  io . WriteCloser ,  tty  bool )  error  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									podUID  =  kl . podManager . TranslatePodUID ( podUID ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-21 04:55:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-04-07 07:58:34 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									container ,  err  :=  kl . findContainer ( podFullName ,  podUID ,  containerName ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-09 04:41:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-07 07:58:34 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  container  ==  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  fmt . Errorf ( "container not found (%q)" ,  containerName ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-09 04:41:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-08 01:58:05 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									return  kl . runner . ExecInContainer ( container . ID ,  cmd ,  stdin ,  stdout ,  stderr ,  tty ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-09 04:41:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-07-28 12:48:55 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  AttachContainer ( podFullName  string ,  podUID  types . UID ,  containerName  string ,  stdin  io . Reader ,  stdout ,  stderr  io . WriteCloser ,  tty  bool )  error  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									podUID  =  kl . podManager . TranslatePodUID ( podUID ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									container ,  err  :=  kl . findContainer ( podFullName ,  podUID ,  containerName ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  container  ==  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  fmt . Errorf ( "container not found (%q)" ,  containerName ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-08 01:58:05 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									return  kl . containerRuntime . AttachContainer ( container . ID ,  stdin ,  stdout ,  stderr ,  tty ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-28 12:48:55 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-01-09 04:41:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// PortForward connects to the pod's port and copies data between the port
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// and the stream.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-07 07:58:34 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  PortForward ( podFullName  string ,  podUID  types . UID ,  port  uint16 ,  stream  io . ReadWriteCloser )  error  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									podUID  =  kl . podManager . TranslatePodUID ( podUID ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-21 04:55:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-05-02 06:25:11 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									pods ,  err  :=  kl . containerRuntime . GetPods ( false ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-09 04:41:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-07 07:58:34 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									pod  :=  kubecontainer . Pods ( pods ) . FindPod ( podFullName ,  podUID ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-06 05:10:45 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  pod . IsEmpty ( )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  fmt . Errorf ( "pod not found (%q)" ,  podFullName ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-07 07:58:34 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									return  kl . runner . PortForward ( & pod ,  port ,  stream ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-09 04:41:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-03-30 21:20:20 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// BirthCry sends an event that the kubelet has started up.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  BirthCry ( )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// Make an event that kubelet restarted.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-14 06:30:01 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									kl . recorder . Eventf ( kl . nodeRef ,  api . EventTypeNormal ,  kubecontainer . StartingKubelet ,  "Starting kubelet." ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-11 05:13:57 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-09 04:41:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  StreamingConnectionIdleTimeout ( )  time . Duration  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  kl . streamingConnectionIdleTimeout 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-06 15:56:30 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-06-18 06:31:46 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  ResyncInterval ( )  time . Duration  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  kl . resyncInterval 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-03-06 15:56:30 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// GetContainerInfo returns stats (from Cadvisor) for a container.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-16 11:00:28 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  GetContainerInfo ( podFullName  string ,  podUID  types . UID ,  containerName  string ,  req  * cadvisorapi . ContainerInfoRequest )  ( * cadvisorapi . ContainerInfo ,  error )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-21 04:55:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-05-01 03:15:23 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									podUID  =  kl . podManager . TranslatePodUID ( podUID ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-21 04:55:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-06-16 03:33:59 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									pods ,  err  :=  kl . runtimeCache . GetPods ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-06 15:56:30 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  nil ,  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-16 03:33:59 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									pod  :=  kubecontainer . Pods ( pods ) . FindPod ( podFullName ,  podUID ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									container  :=  pod . FindContainerByName ( containerName ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-01 03:15:23 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  container  ==  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-11 04:14:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										return  nil ,  kubecontainer . ErrContainerNotFound 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-06 15:56:30 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-10-08 01:58:05 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									ci ,  err  :=  kl . cadvisor . DockerContainer ( container . ID . ID ,  req ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-06 15:56:30 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  nil ,  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  & ci ,  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-01-23 04:14:06 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// GetContainerInfoV2 returns stats (from Cadvisor) for containers.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  GetContainerInfoV2 ( name  string ,  options  cadvisorapiv2 . RequestOptions )  ( map [ string ] cadvisorapiv2 . ContainerInfo ,  error )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  kl . cadvisor . ContainerInfoV2 ( name ,  options ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  DockerImagesFsInfo ( )  ( cadvisorapiv2 . FsInfo ,  error )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  kl . cadvisor . DockerImagesFsInfo ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  RootFsInfo ( )  ( cadvisorapiv2 . FsInfo ,  error )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  kl . cadvisor . RootFsInfo ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-04-24 01:14:08 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// Returns stats (from Cadvisor) for a non-Kubernetes container.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-16 11:00:28 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  GetRawContainerInfo ( containerName  string ,  req  * cadvisorapi . ContainerInfoRequest ,  subcontainers  bool )  ( map [ string ] * cadvisorapi . ContainerInfo ,  error )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-24 01:14:08 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  subcontainers  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  kl . cadvisor . SubcontainerInfo ( containerName ,  req ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										containerInfo ,  err  :=  kl . cadvisor . ContainerInfo ( containerName ,  req ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											return  nil ,  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-16 11:00:28 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										return  map [ string ] * cadvisorapi . ContainerInfo { 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-24 01:14:08 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											containerInfo . Name :  containerInfo , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} ,  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-06 15:56:30 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-09-22 02:06:38 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// GetCachedMachineInfo assumes that the machine info can't change without a reboot
 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-16 11:00:28 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  GetCachedMachineInfo ( )  ( * cadvisorapi . MachineInfo ,  error )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-16 20:50:00 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  kl . machineInfo  ==  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										info ,  err  :=  kl . cadvisor . MachineInfo ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											return  nil ,  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										kl . machineInfo  =  info 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  kl . machineInfo ,  nil 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-06 15:56:30 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-26 20:31:54 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-12-11 04:14:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  ListenAndServe ( address  net . IP ,  port  uint ,  tlsOptions  * server . TLSOptions ,  auth  server . AuthInterface ,  enableDebuggingHandlers  bool )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-15 03:19:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									server . ListenAndServeKubeletServer ( kl ,  kl . resourceAnalyzer ,  address ,  port ,  tlsOptions ,  auth ,  enableDebuggingHandlers ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-26 20:31:54 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  ListenAndServeReadOnly ( address  net . IP ,  port  uint )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-15 03:19:26 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									server . ListenAndServeKubeletReadOnlyServer ( kl ,  kl . resourceAnalyzer ,  address ,  port ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-26 20:31:54 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-09 21:27:34 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// GetRuntime returns the current Runtime implementation in use by the kubelet. This func
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// is exported to simplify integration with third party kubelet extensions (e.g. kubernetes-mesos).
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  GetRuntime ( )  kubecontainer . Runtime  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  kl . containerRuntime 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-27 12:02:59 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  updatePodCIDR ( cidr  string )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  kl . runtimeState . podCIDR ( )  ==  cidr  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									glog . Infof ( "Setting Pod CIDR: %v -> %v" ,  kl . runtimeState . podCIDR ( ) ,  cidr ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									kl . runtimeState . setPodCIDR ( cidr ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  kl . networkPlugin  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										details  :=  make ( map [ string ] interface { } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										details [ network . NET_PLUGIN_EVENT_POD_CIDR_CHANGE_DETAIL_CIDR ]  =  cidr 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										kl . networkPlugin . Event ( network . NET_PLUGIN_EVENT_POD_CIDR_CHANGE ,  details ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-23 04:14:06 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ( kl  * Kubelet )  GetNodeConfig ( )  cm . NodeConfig  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  kl . nodeConfig 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-09 21:27:34 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-11 06:08:31 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								var  minRsrc  =  resource . MustParse ( "1k" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								var  maxRsrc  =  resource . MustParse ( "1P" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  validateBandwidthIsReasonable ( rsrc  * resource . Quantity )  error  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  rsrc . Value ( )  <  minRsrc . Value ( )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  fmt . Errorf ( "resource is unreasonably small (< 1kbit)" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  rsrc . Value ( )  >  maxRsrc . Value ( )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  fmt . Errorf ( "resoruce is unreasonably large (> 1Pbit)" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  extractBandwidthResources ( pod  * api . Pod )  ( ingress ,  egress  * resource . Quantity ,  err  error )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-04 09:20:23 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									str ,  found  :=  pod . Annotations [ "kubernetes.io/ingress-bandwidth" ] 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-11 06:08:31 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  found  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  ingress ,  err  =  resource . ParseQuantity ( str ) ;  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											return  nil ,  nil ,  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  err  :=  validateBandwidthIsReasonable ( ingress ) ;  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											return  nil ,  nil ,  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-04 09:20:23 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									str ,  found  =  pod . Annotations [ "kubernetes.io/egress-bandwidth" ] 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-11 06:08:31 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  found  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  egress ,  err  =  resource . ParseQuantity ( str ) ;  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											return  nil ,  nil ,  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  err  :=  validateBandwidthIsReasonable ( egress ) ;  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											return  nil ,  nil ,  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  ingress ,  egress ,  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								}