MCPcopy Index your code
hub / github.com/aws/aws-node-termination-handler / CordonAndDrain

Method CordonAndDrain

pkg/node/node.go:123–177  ·  view source on GitHub ↗

CordonAndDrain will cordon the node and evict pods based on the config

(nodeName string, reason string, recorder recorderInterface)

Source from the content-addressed store, hash-verified

121
122// CordonAndDrain will cordon the node and evict pods based on the config
123func (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
180func (n Node) Cordon(nodeName string, reason string) error {

Callers 4

cordonAndDrainNodeMethod · 0.80
TestDryRunFunction · 0.80
TestDrainSuccessFunction · 0.80

Calls 6

CordonMethod · 0.95
fetchKubernetesNodeMethod · 0.95
fetchAllPodsMethod · 0.95
AnnotatedEventfMethod · 0.80

Tested by 3

TestDryRunFunction · 0.64
TestDrainSuccessFunction · 0.64