WSL for remote docker and k8s cluster
The WSL works as workstation to run local docker or kubectl to access remote docker server or k8s cluster, instead of login to remote node, it is more easy to integrate docker and k8s to native dev env.
WSL is WSL1 since there is not concern for WSL2 which is full Linux VM running on top of Hyper-V in the backend.
Local docker
https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-socket-option
here is current dockerd sock working way, changed config to expose to outside via tcp IP and port, we use un-encrypted port 2375,
vagrant@k8s-master$ ps -aux | grep dockerd root 575 1.3 2.7 1128308 111300 ? Ssl 11:56 2:46 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock vagrant@k8s-master$ sudo mkdir -p /etc/systemd/system/docker.service.d vagrant@k8s-master$ sudo nano /etc/systemd/system/docker.service.d/options.conf vagrant@k8s-master$ cat /etc/systemd/system/docker.service.d/options.conf [Service] ExecStart= ExecStart=/usr/bin/dockerd -H unix:// -H tcp://0.0.0.0:2375
changed dockerd to tcp instead of unix before and confirmed it is still working fine in side remote vm,
vagrant@k8s-master$ sudo systemctl daemon-reload
vagrant@k8s-master$ sudo systemctl restart docker
vagrant@k8s-master$ ps -aux |grep dockerd
root 369634 0.7 2.4 848600 97668 ? Ssl 18:34 0:00 /usr/bin/dockerd -H unix:// -H tcp://0.0.0.0:2375
vagrant@k8s-master$ docker info
Client:
Context: default
Debug Mode: false
Server:
Containers: 39
Running: 18
Paused: 0
Stopped: 21
Images: 12
Server Version: 20.10.7
Storage Driver: overlay2
Backing Filesystem: extfs
Supports d_type: true
Native Overlay Diff: true
userxattr: false
Logging Driver: json-file
Cgroup Driver: cgroupfs
Cgroup Version: 1
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: io.containerd.runtime.v1.linux runc io.containerd.runc.v2
Default Runtime: runc
Init Binary: docker-init
containerd version:
runc version:
init version:
Security Options:
apparmor
seccomp
Profile: default
Kernel Version: 5.4.0-42-generic
Operating System: Ubuntu 20.04.3 LTS
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 3.844GiB
Name: k8s-master
ID: 5P2F:IOHX:NQFG:2KQ4:LION:KXPW:ANBR:5EE5:LAWN:2BGE:ILGK:7MRY
Docker Root Dir: /var/lib/docker
Debug Mode: false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
WARNING: API is accessible on http://0.0.0.0:2375 without encryption.
Access to the remote API is equivalent to root access on the host. Refer
to the 'Docker daemon attack surface' section in the documentation for
more information: https://docs.docker.com/go/attack-surface/
WARNING: No swap limit support
next need to map laptop or wsl host port to virtualbox vm which is Docker server port 2375 as below,
export DOCKER setting on wsl,
wsl$ unset DOCKER_TLS_VERIFY wsl$ export DOCKER_HOST="tcp://127.0.0.1:2375"
verify wsl docker client should be working well with remote vm Docker server,
wsl$ docker info
Client:
Context: default
Debug Mode: false
Plugins:
app: Docker App (Docker Inc., v0.9.1-beta3)
buildx: Build with BuildKit (Docker Inc., v0.6.1-docker)
scan: Docker Scan (Docker Inc., v0.8.0)
Server:
Containers: 39
Running: 18
Paused: 0
Stopped: 21
Images: 12
Server Version: 20.10.7
Storage Driver: overlay2
Backing Filesystem: extfs
Supports d_type: true
Native Overlay Diff: true
userxattr: false
Logging Driver: json-file
Cgroup Driver: cgroupfs
Cgroup Version: 1
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
Default Runtime: runc
Init Binary: docker-init
containerd version:
runc version:
init version:
Security Options:
apparmor
seccomp
Profile: default
Kernel Version: 5.4.0-42-generic
Operating System: Ubuntu 20.04.3 LTS
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 3.844GiB
Name: k8s-master
ID: 5P2F:IOHX:NQFG:2KQ4:LION:KXPW:ANBR:5EE5:LAWN:2BGE:ILGK:7MRY
Docker Root Dir: /var/lib/docker
Debug Mode: false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
WARNING: API is accessible on http://0.0.0.0:2375 without encryption.
Access to the remote API is equivalent to root access on the host. Refer
to the 'Docker daemon attack surface' section in the documentation for
more information: https://docs.docker.com/go/attack-surface/
WARNING: No swap limit support
Local kubectl
download and install kubectl on WSL, refer official link,
https://v1-21.docs.kubernetes.io/docs/tasks/tools/
wsl$ curl -LO "https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl"
wsl$ chmod +x ./kubectl
wsl$ sudo mv ./kubectl /usr/local/bin/kubectl
wsl$ kubectl version --client
Client Version: version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.2", GitCommit:"8b5a19147530eaac9476b0ab82980b4088bbc1b2", GitTreeState:"clean", BuildDate:"2021-09-15T21:38:50Z", GoVersion:"go1.16.8", Compiler:"gc", Platform:"linux/amd64"}
wsl$ cd
wsl$ scp -r vagrant@192.168.22.23:/home/vagrant/.kube .
wsl$ kubectl get no
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane,master 10d v1.21.4
k8s-node1 NotReady 10d v1.21.4
k8s-node2 NotReady 10d v1.21.4
as you see all the magic is .kube/config file which including all remote cluster ip, port and credentials,
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: <skip>
server: https://192.168.22.23:6443
name: kubernetes
contexts:
- context:
cluster: kubernetes
user: kubernetes-admin
name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-admin
user:
client-certificate-data: <skip>
client-key-data: <skip>
short alias and completion
add below to ~/.bashrc
# short for kubectl source <(kubectl completion bash) alias k=kubectl complete -F __start_kubectl k
test local kubectl on wsl
wsl$ k run test --image=nginx pod/test created wsl$ k get po -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES test 1/1 Running 0 26s 192.168.235.217 k8s-master
it is normal you cannot directly access to pod in remotely k8s cluster
wsl $ curl 192.168.235.217 ^C
you need to access pod inside k8s cluster
wsl$ ssh vagrant@192.168.22.23 vagrant@k8s-master$ curl 192.168.235.217
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
