| 
									
										
										
										
											2018-01-27 05:42:57 -05:00
										 |  |  | # reload
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ## Name
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-06 11:27:40 +01:00
										 |  |  | *reload* - allows automatic reload of a changed Corefile. | 
					
						
							| 
									
										
										
										
											2018-01-27 05:42:57 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | ## Description
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-11 15:09:38 -04:00
										 |  |  | This plugin allows automatic reload of a changed _Corefile_. | 
					
						
							|  |  |  | To enable automatic reloading of _zone file_ changes, use the `auto` plugin. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-27 05:42:57 -05:00
										 |  |  | This plugin periodically checks if the Corefile has changed by reading | 
					
						
							|  |  |  | it and calculating its MD5 checksum. If the file has changed, it reloads | 
					
						
							|  |  |  | CoreDNS with the new Corefile. This eliminates the need to send a SIGHUP | 
					
						
							|  |  |  | or SIGUSR1 after changing the Corefile. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The reloads are graceful - you should not see any loss of service when the | 
					
						
							|  |  |  | reload happens. Even if the new Corefile has an error, CoreDNS will continue | 
					
						
							| 
									
										
										
										
											2018-04-21 17:43:02 +01:00
										 |  |  | to run the old config and an error message will be printed to the log. But see | 
					
						
							|  |  |  | the Bugs section for failure modes. | 
					
						
							| 
									
										
										
										
											2018-01-27 05:42:57 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-02 17:17:26 -08:00
										 |  |  | In some environments (for example, Kubernetes), there may be many CoreDNS | 
					
						
							| 
									
										
										
										
											2018-01-27 05:42:57 -05:00
										 |  |  | instances that started very near the same time and all share a common | 
					
						
							|  |  |  | Corefile. To prevent these all from reloading at the same time, some | 
					
						
							|  |  |  | jitter is added to the reload check interval. This is jitter from the | 
					
						
							|  |  |  | perspective of multiple CoreDNS instances; each instance still checks on a | 
					
						
							|  |  |  | regular interval, but all of these instances will have their reloads spread | 
					
						
							|  |  |  | out across the jitter duration. This isn't strictly necessary given that the | 
					
						
							|  |  |  | reloads are graceful, and can be disabled by setting the jitter to `0s`. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Jitter is re-calculated whenever the Corefile is reloaded. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-28 18:16:05 -08:00
										 |  |  | This plugin can only be used once per Server Block. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-27 05:42:57 -05:00
										 |  |  | ## Syntax
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ~~~ txt | 
					
						
							|  |  |  | reload [INTERVAL] [JITTER] | 
					
						
							|  |  |  | ~~~ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-27 11:10:47 +01:00
										 |  |  | The plugin will check for changes every **INTERVAL**, subject to +/- the **JITTER** duration. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-06 16:27:55 -05:00
										 |  |  | *  **INTERVAL** and **JITTER** are Golang [durations](https://golang.org/pkg/time/#ParseDuration). | 
					
						
							| 
									
										
										
										
											2019-09-27 11:10:47 +01:00
										 |  |  |    The default **INTERVAL** is 30s, default **JITTER** is 15s, the minimal value for **INTERVAL** | 
					
						
							|  |  |  |    is 2s, and for **JITTER** it is 1s. If **JITTER** is more than half of **INTERVAL**, it will be | 
					
						
							|  |  |  |    set to half of **INTERVAL** | 
					
						
							| 
									
										
										
										
											2018-01-27 05:42:57 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | ## Examples
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Check with the default intervals: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-02 17:17:26 -08:00
										 |  |  | ~~~ corefile | 
					
						
							| 
									
										
										
										
											2018-01-27 05:42:57 -05:00
										 |  |  | . { | 
					
						
							|  |  |  |     reload | 
					
						
							|  |  |  |     erratic | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | ~~~ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Check every 10 seconds (jitter is automatically set to 10 / 2 = 5 in this case): | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-02 17:17:26 -08:00
										 |  |  | ~~~ corefile | 
					
						
							| 
									
										
										
										
											2018-01-27 05:42:57 -05:00
										 |  |  | . { | 
					
						
							|  |  |  |     reload 10s | 
					
						
							|  |  |  |     erratic | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | ~~~ | 
					
						
							| 
									
										
										
										
											2018-04-21 17:43:02 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | ## Bugs
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The reload happens without data loss (i.e. DNS queries keep flowing), but there is a corner case | 
					
						
							|  |  |  | where the reload fails, and you loose functionality. Consider the following Corefile: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ~~~ txt | 
					
						
							|  |  |  | . { | 
					
						
							|  |  |  | 	health :8080 | 
					
						
							|  |  |  | 	whoami | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | ~~~ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | CoreDNS starts and serves health from :8080. Now you change `:8080` to `:443` not knowing a process | 
					
						
							|  |  |  | is already listening on that port. The process reloads and performs the following steps: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 1. close the listener on 8080 | 
					
						
							|  |  |  | 2. reload and parse the config again | 
					
						
							|  |  |  | 3. fail to start a new listener on 443 | 
					
						
							|  |  |  | 4. fail loading the new Corefile, abort and keep using the old process | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-14 17:55:55 +02:00
										 |  |  | After the aborted attempt to reload we are left with the old processes running, but the listener is | 
					
						
							| 
									
										
										
										
											2019-08-21 16:08:55 -04:00
										 |  |  | closed in step 1; so the health endpoint is broken. The same can happen in the prometheus metrics plugin. | 
					
						
							| 
									
										
										
										
											2018-04-21 17:43:02 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | In general be careful with assigning new port and expecting reload to work fully. | 
					
						
							| 
									
										
										
										
											2019-03-02 09:03:25 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-30 15:44:16 -07:00
										 |  |  | In CoreDNS v1.6.0 and earlier any `import` statements are not discovered by this plugin. | 
					
						
							|  |  |  | This means if any of these imported files changes the *reload* plugin is ignorant of that fact. | 
					
						
							|  |  |  | CoreDNS v1.7.0 and later does parse the Corefile and supports detecting changes in imported files. | 
					
						
							| 
									
										
										
										
											2019-03-02 09:03:25 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-26 09:38:46 +03:00
										 |  |  | ## Metrics
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-08 10:20:48 +01:00
										 |  |  |  If monitoring is enabled (via the *prometheus* plugin) then the following metric is exported: | 
					
						
							| 
									
										
										
										
											2019-06-26 09:38:46 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | * `coredns_reload_failed_count_total{}` - counts the number of failed reload attempts. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-02 09:03:25 +00:00
										 |  |  | ## Also See
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | See coredns-import(7) and corefile(5). |