2.5 KiB
Accessing internal services with kubectl proxy
-
kubectl proxyruns a proxy in the foreground -
This proxy lets us access the Kubernetes API without authentication
(
kubectl proxyadds our credentials on the fly to the requests) -
This proxy lets us access the Kubernetes API over plain HTTP
-
This is a great tool to learn and experiment with the Kubernetes API
-
The Kubernetes API also gives us a proxy to HTTP and HTTPS services
-
Therefore, we can use
kubectl proxyto access internal services(Without using a
NodePortor similar service)
Secure by default
-
By default, the proxy listens on port 8001
(But this can be changed, or we can tell
kubectl proxyto pick a port) -
By default, the proxy binds to
127.0.0.1(Making it unreachable from other machines, for security reasons)
-
By default, the proxy only accepts connections from:
^localhost$,^127\.0\.0\.1$,^\[::1\]$ -
This is great when running
kubectl proxylocally -
Not-so-great when running it on a remote machine
Running kubectl proxy on a remote machine
-
We are going to bind to
INADDR_ANYinstead of127.0.0.1 -
We are going to accept connections from any address
.exercise[
- Run an open proxy to the Kubernetes API:
kubectl proxy --port=8888 --address=0.0.0.0 --accept-hosts=.*
]
.warning[Anyone can now do whatever they want with our Kubernetes cluster!
(Don't do this on a real cluster!)]
Viewing available API routes
- The default route (i.e.
/) shows a list of available API endpoints
.exercise[
- Point your browser to the IP address of the node running
kubectl proxy, port 8888
]
The result should look like this:
{
"paths": [
"/api",
"/api/v1",
"/apis",
"/apis/",
"/apis/admissionregistration.k8s.io",
…
Connecting to a service through the proxy
-
The API can proxy HTTP and HTTPS requests by accessing a special route:
/api/v1/namespaces/`name_of_namespace`/services/`name_of_service`/proxy -
Since we now have access to the API, we can use this special route
.exercise[
- Access the
hasherservice through the special proxy route:http://`X.X.X.X`:8888/api/v1/namespaces/default/services/hasher/proxy
]
You should see the banner of the hasher service: HASHER running on ...
Stopping the proxy
- Remember: as it is running right now,
kubectl proxygives open access to our cluster
.exercise[
- Stop the
kubectl proxyprocess with Ctrl-C
]