// nodeRunningOutdatedKubelet returns true if the kubeletVersion reported // in the nodeInfo of the given node is "outdated", meaning < 1.2.0. // Older versions were inflexible and modifying pod.Status directly through // the apiserver would result in unexpected outcomes. func nodeRunningOutdatedKubelet(node *v1.Node) bool { v, err := utilversion.ParseSemantic(node.Status.NodeInfo.KubeletVersion) if err != nil { glog.Errorf("couldn't parse version %q of node %v", node.Status.NodeInfo.KubeletVersion, err) return true } if v.LessThan(podStatusReconciliationVersion) { glog.Infof("Node %v running kubelet at (%v) which is less than the minimum version that allows nodecontroller to mark pods NotReady (%v).", node.Name, v, podStatusReconciliationVersion) return true } return false }
// Helper for getting the docker version. func getDockerVersion(cadvisor cadvisor.Interface) *utilversion.Version { versions, err := cadvisor.VersionInfo() if err != nil { glog.Errorf("Error requesting cAdvisor VersionInfo: %v", err) return utilversion.MustParseSemantic("0.0.0") } dockerVersion, err := utilversion.ParseSemantic(versions.DockerVersion) if err != nil { glog.Errorf("Error parsing docker version %q: %v", versions.DockerVersion, err) return utilversion.MustParseSemantic("0.0.0") } return dockerVersion }
// maybeDeleteTerminatingPod non-gracefully deletes pods that are terminating // that should not be gracefully terminated. func (nc *NodeController) maybeDeleteTerminatingPod(obj interface{}) { pod, ok := obj.(*v1.Pod) if !ok { tombstone, ok := obj.(cache.DeletedFinalStateUnknown) if !ok { glog.Errorf("Couldn't get object from tombstone %#v", obj) return } pod, ok = tombstone.Obj.(*v1.Pod) if !ok { glog.Errorf("Tombstone contained object that is not a Pod %#v", obj) return } } // consider only terminating pods if pod.DeletionTimestamp == nil { return } nodeObj, found, err := nc.nodeStore.Store.GetByKey(pod.Spec.NodeName) if err != nil { // this can only happen if the Store.KeyFunc has a problem creating // a key for the pod. If it happens once, it will happen again so // don't bother requeuing the pod. utilruntime.HandleError(err) return } // if there is no such node, do nothing and let the podGC clean it up. if !found { return } // delete terminating pods that have been scheduled on // nodes that do not support graceful termination // TODO(mikedanese): this can be removed when we no longer // guarantee backwards compatibility of master API to kubelets with // versions less than 1.1.0 node := nodeObj.(*v1.Node) v, err := utilversion.ParseSemantic(node.Status.NodeInfo.KubeletVersion) if err != nil { glog.V(0).Infof("couldn't parse verions %q of node: %v", node.Status.NodeInfo.KubeletVersion, err) utilruntime.HandleError(nc.forcefullyDeletePod(pod)) return } if v.LessThan(gracefulDeletionVersion) { utilruntime.HandleError(nc.forcefullyDeletePod(pod)) return } }
// TODO: Remove in 1.6. Returns if kubectl is older than v1.5.0 func isOldKubectl(userAgent string) bool { // example userAgent string: kubectl-1.3/v1.3.8 (linux/amd64) kubernetes/e328d5b if !strings.Contains(userAgent, "kubectl") { return false } userAgent = strings.Split(userAgent, " ")[0] subs := strings.Split(userAgent, "/") if len(subs) != 2 { return false } kubectlVersion, versionErr := utilversion.ParseSemantic(subs[1]) if versionErr != nil { return false } return kubectlVersion.LessThan(utilversion.MustParseSemantic("v1.5.0")) }
func (m *containerManager) doWork() { v, err := m.client.Version() if err != nil { glog.Errorf("Unable to get docker version: %v", err) return } version, err := utilversion.ParseSemantic(v.Version) if err != nil { glog.Errorf("Unable to parse docker version %q: %v", v.Version, err) return } // EnsureDockerInConatiner does two things. // 1. Ensure processes run in the cgroups if m.cgroupsManager is not nil. // 2. Ensure processes have the OOM score applied. if err := kubecm.EnsureDockerInContainer(version, dockerOOMScoreAdj, m.cgroupsManager); err != nil { glog.Errorf("Unable to ensure the docker processes run in the desired containers") } }
func newRuntimeVersion(version string) (*utilversion.Version, error) { return utilversion.ParseSemantic(version) }