My work workplace is an enterprise with all kinds of administrative controls. Access to the outside network is restricted and routed via a proxy. Now, one day I thought of doing some POC with microk8s
. But the challenge is to get it running on our local box(typically windows). So I bootstarpped a VM using Vagrant
. Now all left was to get microk8s
running on the VM box.
First steps were easy, microk8s is bundled via snap
. So I installed it using apt
. Here as well apt
needed proxy setting so I first exported the required variables :
export http_proxy='http://user:password@proxy.net:8080/'
export https_proxy='http://user:password@proxy.net:8080/'
sudo -E apt install snap
Now, snap
is on my box, now I tried installing microk8s
but it failed to reach the snapcraft.io
repository.
sudo snap install microk8s --classic
snap
runs a daemon snapd
to manage its applications. So we need to configure the daemon to bun with proper environment variables, rather then passing them via command line (as in apt
). Thus we need to add proxy
settings to /etc/environment
.
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"
http_proxy='http://user:password@proxy.net:8080/'
https_proxy='http://user:password@proxy.net:8080/'
HTTP_PROXY='http://user:password@proxy.net:8080/'
HTTPS_PROXY='http://user:password@proxy.net:8080/'
no_proxy=127.0.01,:::1,localhost
Now reload the snapd
service and we are good to install microk8s
sudo systemctl restart snapd
sudo snap install microk8s
Now that I have microk8s
running on my box, I checked its status using microk8s.status
. It said service failed: unable to resolve gcr.io
. Now there must be something missing as I have uanble to reach google container registry. After spending sometime on it, I realised microk8s
is running docker
for running kubernetes
. At first it felt, I need to add proxy varibles to docker daemon. That’s true, but still unable to resolve gcr.io
looks to be something else.
Later I found out the unable to resolve gcr.io
is a dns
error. Basically, my VM depends on host dns details, but these details are not known to the docker daemon. It took dns
setting from VM, for which the dns server was localhost
. These settings can be added to a docker.json
file. Now, lets first find the docker daemon config file :
ps -ef | grep dockerd
root 25567 1 1 Dec06 ? 00:15:01 /snap/microk8s/340/usr/bin/dockerd --add-runtime nvidia=/snap/microk8s/340/usr/bin/nvidia-container-runtime -H unix:///var/snap/microk8s/340/docker.sock --exec-root /var/snap/microk8s/common/var/run/docker --graph /var/snap/microk8s/common/var/lib/docker --pidfile /var/snap/microk8s/common/docker-pid --config-file=/var/snap/microk8s/340/args/docker-daemon.json
We need to update /var/snap/microk8s/340/args/docker-daemon.json
for dns
and dns-search
attributes :
{
"insecure-registries" : ["localhost:32000"],
"dns":["11.0.0.1", "11.0.1.1"],
"dns-search":["fx.xlsgrp.net"]
}
Post the update restart docker usig sudo systemctl reload snap.microk8s.daemon-docker.service
. Once started we can validate the change by executing microk8s.docker run --env HTTPS_PROXY=http://user:password@proxy.net:8080/ --env HTTP_PROXY=http://user:password@proxy.net:8080/ -it ubuntu
. The command should work as expected. The proxy variables can be supplied in a dockerfile as follows :
ENV HTTPS_PROXY http://user:password@proxy.net:8080/
ENV HTTP_PROXY http://user:password@proxy.net:8080/
Now, all we are left is to provide these variables to the docker runtime from k8s engine. As per the docs these variables must be set in kubelet
configuration. So now we edit /etc/systemd/system/snap.microk8s.daemon-kubelet.service
and add these varibles :
[Service]
ExecStart=/usr/bin/snap run microk8s.daemon-kubelet
SyslogIdentifier=microk8s.daemon-kubelet
Restart=on-failure
WorkingDirectory=/var/snap/microk8s/340
TimeoutStopSec=30
Type=simple
Environment="HTTPS_PROXY=http://user:password@proxy.net:8080/" "HTTP_PROXY=http://user:password@proxy.net:8080/"
All we are now left is to save the file, reload the configuration and restart microk8s.kubelet service
sudo systemctl daemon-reload
sudo systemctl reload snap.microk8s.daemon-kubelet.service
It took quite a while to get this setup working !