Skip to content
gqlxj1987's Blog
Go back

Configmap Reload

Edit page

repo链接

It watches mounted volume dirs and notifies the target process that the config map has been changed. It currently only supports sending an HTTP request, but in future it is expected to support sending OS (e.g. SIGHUP) once Kubernetes supports pod PID namespaces.

主要是利用fsnotify的方式

比较好的基于重试的写法

begun := time.Now()
req, err := http.NewRequest(*webhookMethod, h.String(), nil)
if err != nil {
  setFailureMetrics(h.String(), "client_request_create")
  log.Println("error:", err)
  continue
}
userInfo := h.User
if userInfo != nil {
  if password, passwordSet := userInfo.Password(); passwordSet {
    req.SetBasicAuth(userInfo.Username(), password)
  }
}

successfulReloadWebhook := false

for retries := *webhookRetries; retries != 0; retries-- {
  log.Printf("performing webhook request (%d/%d)", retries, *webhookRetries)
  resp, err := http.DefaultClient.Do(req)
  if err != nil {
    setFailureMetrics(h.String(), "client_request_do")
    log.Println("error:", err)
    time.Sleep(time.Second * 10)
    continue
  }
  resp.Body.Close()
  requestsByStatusCode.WithLabelValues(h.String(), strconv.Itoa(resp.StatusCode)).Inc()
  if resp.StatusCode != *webhookStatusCode {
    setFailureMetrics(h.String(), "client_response")
    log.Println("error:", "Received response code", resp.StatusCode, ", expected", *webhookStatusCode)
    time.Sleep(time.Second * 10)
    continue
  }

  setSuccessMetrics(h.String(), begun)
  log.Println("successfully triggered reload")
  successfulReloadWebhook = true
  break
}

if !successfulReloadWebhook {
  setFailureMetrics(h.String(), "retries_exhausted")
  log.Println("error:", "Webhook reload retries exhausted")
}

Edit page
Share this post on:

Previous Post
aws lambda power tuning
Next Post
Redis intro