microk8s, Harbor, and self-signed certificates

My home-lab environment has a 3 node microk8s cluster and I wanted to deploy Harbor to cache container images locally, run security scans against them, and because overkill is my home-lab’s modus operandi. Even though Harbor is deployed on an internal VLAN I still protect communication with it using HTTPS. When I tried to pull an image from Harbor in a Kubernetes deployment I saw the following error: Warning Failed 20m (x4 over 21m) kubelet Error: ErrImagePull Warning Failed 20m (x4 over 21m) kubelet Failed to pull image "harbor.

Read more

Continuous Deployment of Ghost Themes

When I restarted my blog (this is at least blog v3) using Ghost I wanted to get up and running as quickly as possible so I purchased the Horace theme and followed the installation instructions - which basically came down to: Extract the theme’s .zip file to a directory. Make any modifications you need. Create a new .zip file. Upload the .zip file in Ghost Admin. This process was fine once, maybe twice, but as I made more tweaks it was mind-numbing.

Read more

When did I know I was a senior engineer?

Dave Ceddia recently asked this in his email newsletter and while I recently made the switch from being an engineer to being a product manager it’s still worth reflecting on. For me the inflection point was when I shifted from focusing on my own deliverables to the team’s deliverables and while this may seem obvious it’s not as easy as it sounds. As a “junior engineer” you’re typically being measured on your ability to complete your deliverables on time and at a reasonable level of quality - over time the expectation being that your estimates of time and level of quality improves (although I challenge the accuracy of almost any estimation of time).

Read more

Updating Hosts with Ansible

One of the simplest Ansible playbooks I use in my home-lab is the one to update the packages on all of my Debian 10 (Buster) hosts: - name: Update all packages to latest hosts: all become: yes tasks: - apt: name: '*' update_cache: yes state: latest - stat: path: /var/run/reboot-required register: reboot_required - reboot: when: reboot_required.stat.exists It uses become to become a privileged user, updates all packages with the apt task (making sure it updates the package cache), checks for /var/run/reboot-required which is a signal that a reboot is required after an update (typically when the kernel is upgraded), and then reboots the host if required.

Read more

Bootstrapping with Ansible

I’m using Ansible to manage my home-lab environment because it’s easy to learn, has many built-in and contributed tasks, and is agent-less. Despite being agent-less, some bootstrapping is needed to seamlessly manage hosts with Ansible, and in this post I’ll show how to use Ansible to bootstrap hosts to be managed with Ansible. TLDR: The inventory and playbook examples are in this gist. I manage two types of hosts with Ansible and they require subtly different bootstrapping processes:

Read more

Developing Go Plugins on non-Linux Operating Systems

In one of my many (incomplete) side-projects I need to dynamically load modules into a Go application. Vladimir Vivien has a great post explaining how to do this using Go plugins but Go’s plugin functionality currently only works on Linux. If we try from another operating system, such as MacOS we’re stopped in our tracks: $ go build --buildmode=plugin -o eng/eng.so eng/greeter.go -buildmode=plugin not supported on darwin/amd64 Go plugins being limited to Linux isn’t a blocker for my side-project which will require Linux anyway but I’d still like to develop the project on my main development machine which runs MacOS.

Read more