CordonAndDrain will cordon the node and evict pods based on the config
(nodeName string, reason string, recorder recorderInterface)
| 121 | |
| 122 | // CordonAndDrain will cordon the node and evict pods based on the config |
| 123 | func (n Node) CordonAndDrain(nodeName string, reason string, recorder recorderInterface) error { |
| 124 | if n.nthConfig.DryRun { |
| 125 | log.Info().Str("node_name", nodeName).Str("reason", reason).Msg("Node would have been cordoned and drained, but dry-run flag was set.") |
| 126 | return nil |
| 127 | } |
| 128 | err := n.MaybeMarkForExclusionFromLoadBalancers(nodeName) |
| 129 | if err != nil { |
| 130 | return err |
| 131 | } |
| 132 | err = n.Cordon(nodeName, reason) |
| 133 | if err != nil { |
| 134 | return err |
| 135 | } |
| 136 | // Be very careful here: in tests, nodeName and node.Name can be different, as |
| 137 | // fetchKubernetesNode does some translation using the kubernetes.io/hostname label |
| 138 | node, err := n.fetchKubernetesNode(nodeName) |
| 139 | if err != nil { |
| 140 | return err |
| 141 | } |
| 142 | var pods *corev1.PodList |
| 143 | // Delete all pods on the node |
| 144 | log.Info().Str("node_name", nodeName).Msg("Draining the node") |
| 145 | // Emit events for all pods that will be evicted |
| 146 | if recorder != nil { |
| 147 | pods, err = n.fetchAllPods(node.Name) |
| 148 | if err == nil { |
| 149 | for _, pod := range pods.Items { |
| 150 | podRef := &corev1.ObjectReference{ |
| 151 | Kind: "Pod", |
| 152 | Name: pod.Name, |
| 153 | Namespace: pod.Namespace, |
| 154 | } |
| 155 | annotations := make(map[string]string) |
| 156 | annotations["node"] = nodeName |
| 157 | for k, v := range pod.GetLabels() { |
| 158 | annotations[k] = v |
| 159 | } |
| 160 | recorder.AnnotatedEventf(podRef, annotations, corev1.EventTypeNormal, PodEvictReason, PodEvictMsgFmt, nodeName) |
| 161 | } |
| 162 | } |
| 163 | } |
| 164 | if n.nthConfig.UseAPIServerCacheToListPods { |
| 165 | if pods != nil { |
| 166 | pods = n.FilterOutDaemonSetPods(pods) |
| 167 | err = n.drainHelper.DeleteOrEvictPods(pods.Items) |
| 168 | } |
| 169 | } else { |
| 170 | // RunNodeDrain does an etcd quorum-read to list all pods on this node |
| 171 | err = drain.RunNodeDrain(n.drainHelper, node.Name) |
| 172 | } |
| 173 | if err != nil { |
| 174 | return err |
| 175 | } |
| 176 | return nil |
| 177 | } |
| 178 | |
| 179 | // Cordon will add a NoSchedule on the node |
| 180 | func (n Node) Cordon(nodeName string, reason string) error { |