How to add custom http headers when using kubectl tool How to add custom http headers when using kubectl tool kubernetes kubernetes

How to add custom http headers when using kubectl tool


This is a dirty hard coded hack to show you how to get the outcome your looking for it's not a fully vetted solution. This method will compile a new version of kubectl that will add your needed headers. Maybe it will at least give you a idea to run with.

The reason I wanted to do this is because I put my k8s api endpoint on the internet and safeguarded it with Cloudflare Access. To allow Cloudflare access to let me get past the steel wall I needed to pass in two headers one for my client id and the other for client secret. This ended up working like a charm and is one case someone may want to add custom headers.

Steps:

  • I assume you have Go installed and setup, if not go do that now.
  • git clone https://github.com/kubernetes/kubernetes.git (could take awhile it's pretty big)
  • cd kubernetes/staging/src/k8s.io/client-go/transport/
  • Open file round_trippers.go in your favorite code editor
  • Search for func (rt userAgentRoundTripper) RoundTrip(req http.Request) (*http.Response, error)
  • Add your needed headers by adding lines like this req.Header.Set("Bob-Is", "cool")
  • cd back to root folder kubernetes/
  • cd cmd/kubectl/
  • go build custom-kubectl
  • now test it with ./custom-kubectl get ns --v=9
  • in that output look for the header you added to the rest calls to K8s api, you should see -H "Bob-Is: cool" in the output
  • To make this not a hack maybe see if there's a way to add a kubectl plugin you create do to this for you or ask the kind folks in the k8s community how you can make this hacky method a bit cleaner or if there's a reason adding customer headers isn't a good idea. Worst case parameterize your custom kubectl build to pull in a new parameter you add --custom-request-headers and make it a bit more clean.