RSSAmplifier

Blog

Ian Lewis | English Blog

Ian Lewis is an engineer based in Tokyo, Japan. His current interests are in Container Native Security, Supply Chain Security, Containers, and Kubernetes.

ianlewis.orgRSS feed ↗164 posts

Latest posts

2026 New Year Reflections

As many others have done, I’m going to write a blog post reflecting on the last year and looking forward to the new year. While I’ve been really concerned with where the world is headed, 2025 was a better year for me personally in terms of my mental health and overall balance.This year I hope to build on that and be a lot more intentional about how I plan for the future.

Bash is the best tool for the job

Bash is the black sheep of programming languages and yet every backend or DevOps engineer needs to deal with it throughout their career. It is hard to avoid. It’s always available on Linux servers and it’s often the best tool for the job.

Do we need AI IDEs?

AI integrated development environments (IDEs) are all the rage. Cursor was one of the first AI-focused IDEs and emerged as a fork of VSCode. Kiro , another VSCode fork, was just released by AWS. Windsurf, yet another VSCode fork, recently had their top talent poached and sold the rest . Clearly, a lot of folks at AI companies thought striking it out on their own was a good idea.

Why I Left Twitter

It’s safe to say that Twitter has changed a lot from when I first started using it. When I first started using Twitter in 2008 it felt like an amazing tool for connecting with new people. Twitter made it easy to discover and connect with other tech folks and I found a new job through connections I made on Twitter fairly quickly after I started using it.

A New Blue Check Mark, Just Like the Old One

Bluesky continued their trend of replicating X/Twitter’s features in a slightly different way and just released their new account verification feature . This seems like a pretty big milestone in the social network’s growth and a lot of the prolific members are talking about it. Folks are reacting to being some of the first people to receive one.

Zero Copy Readers in Go

The io.Reader interface is a small interface that defines a single Read method. Callers to a Reader implementation pass a byte slice which is then filled with bytes from the underlying source. This source could be a file, a network socket, etc.

Building APIs with Static Files

APIs are really useful for pulling in data from different sources for analysis in tools like Datasette or spreadsheets. However, APIs are often hard to build and often require writing specialized servers which then need to be deployed and maintained. What if this could be as easy as deploying a static website?

Rust First Impressions: Error Handling

Python Servers in the Year of the Snake: 2025

2025 New Year’s Resolutions

Berryman Political Cartoon Collection, Public Domain

Leaving Google

Today is my last day as a Google employee. After nearly 10 years working on the Google Cloud Developer Relations team, I’ve decided to step away and pursue other challenges.

Understanding GitHub Artifact Attestations

GitHub recently introduced Artifact Attestations , a beta feature that enhances the security of Open Source software supply chains. By linking artifacts to their source code repositories and GitHub Actions, it ensures that artifacts are not built with malicious or unknown code or on potentially compromised devices.

Code Signing is not Enough

Code signing is often used as a method for ensuring that software artifacts like binaries, drivers, and software packages haven’t been modified by a third party before they are used. Many folks may be familiar with packages that were gpg signed and distributed with an Armored ASCII ( .asc ) file. Code signing is a great step towards securing the software supply chain above simply providing…

Four Tips for Writing Better Go APIs

Go is a really powerful programming language that allows you to write concurrent code that is still easy to understand. But designing APIs can be hard, even for seasoned Go programmers. When designing APIs for libraries and applications in Go it’s important to keep in mind the strengths of the language to make your APIs easier to use and avoid pitfalls like goroutine leaks. With that in mind, here…

Container Runtimes Part 4: Kubernetes Container Runtimes & CRI

This is the fourth and last part in a four part series on container runtimes. It’s been a while since part 1 , but in that post I gave an overview of container runtimes and discussed the differences between low-level and high-level runtimes. In part 2 I went into detail on low-level container runtimes and built a simple low-level runtime. In part 3 I went up the stack and wrote about high-level…

Container Runtimes Part 3: High-Level Runtimes

This is the third part in a four-part series on container runtimes. It’s been a while since part 1 , but in that post I gave an overview of container runtimes and discussed the differences between low-level and high-level runtimes. In part 2 I went into detail on low-level container runtimes and built a simple low-level runtime.

Container Runtimes Part 2: Anatomy of a Low-Level Container Runtime

This is the second in a four-part series on container runtimes. In part 1 , I gave an overview of container runtimes and discussed the differences between low-level and high-level runtimes. In this post I will go into detail on low-level container runtimes.

Container Runtimes Part 1: An Introduction to Container Runtimes

One of the terms you hear a lot when dealing with containers is “container runtime”. “Container runtime” can have different meanings to different people so it’s no wonder that it’s such a confusing and vaguely understood term, even within the container community.

The Almighty Pause Container

When checking out the nodes of your Kubernetes cluster, you may have noticed some containers called “pause” running when you do a docker ps on the node.

Blue/Green Deployments on Kubernetes

For those that want to dive right in, I have put up a tutorial and some sample manifests on GitHub. Check it out at https://github.com/IanLewis/kubernetes-bluegreen-deployment-tutorial

What are Kubernetes Pods Anyway?

Recently I saw a tweet from the awesome Amy Codes (I really hope that’s her real name) about Kubernetes Pods:

Building Go Applications with Google Container Builder

Creating Smaller Docker Images Part #4: Static Binaries

This is the fourth post in a series on making smaller Docker images: static binaries. In the first post I talked about how to create smaller images by writing better Dockerfiles. In the second post I talked about how to squash layers using docker-squash to make smaller images. In the third post I wrote about how to use Alpine Linux as a smaller base image.

Creating Smaller Docker Images Part #3: Alpine Linux

Kubernetes Health Checks in Django

A Quick Look at the Kubernetes Python Client

For those of you that don’t know there is a new Python API client in the kubernetes-incubator project: client-python . There has been some high quality Python clients like pykube , but client-python can serve as the official Python client.

How kubeadm Initializes Your Kubernetes Master

kubeadm is a new tool that is part of the Kubernetes distribution as of 1.4.0 which helps you to install and set up a Kubernetes cluster. One of the most frequent criticisms of Kubernetes is that it’s hard to install. kubeadm really makes this easier so I suggest you give it a try.

Performing Maintenance on Pods

Kubernetes includes a feature called services which serve as a kind of load balancer for pods. When pods misbehave or otherwise stop working, sometimes you’ll want to remove the pod from the service without killing the pod.

Using Kubernetes Health Checks

I’ve seen a lot of questions about Kubernetes health checks recently and how they should be used. I’ll do my best to explain them and the difference between the types of health checks and how each will affect your application.

Google Cloud Platform HTTP Load Balancers Explained via the CLI

The Google Cloud Platform Load Balancers are based off of technology that Google developed for our applications. There are two types of load balancers, the Network (L3) Load Balancer and the HTTP (L7) Load Balancer. The HTTP Load Balancer is global so the same IP can be used everywhere in the world, but still supports very high scalability with no warmup.

Creating Smaller Docker Images: Part #2

This is the second post in a series on making smaller Docker images. In my previous blog post I talked about how to create smaller Docker images but there were limits to how small we could make the images. I outlined a way in which you can make the layers you add to your Docker image smaller, but there may be times where it just isn’t possible. Perhaps you need to run some steps in a particular…

Creating Smaller Docker Images

Looking Back At My First Year at Google

I joined Google one year ago today. It’s been a really busy year and I can’t believe it’s over so fast. I still feel like I just joined and there’s so much that I’m still getting used to. Google has been at the same time the easiest and the hardest, the most fun and the least fun company I’ve worked at so far. I’ll try to explain a bit what I mean. But first I want to take a look back at my first…

HTTP/2 and Go

UPDATE (2015/10/15): HTTP/2 is now enabled by default for http servers in tip and will be released as part of Go 1.6. That means that you will be able to create HTTP/2 servers without even calling ConfigureServer() .

Cross-Region HTTP Services on Container Engine

<!– Conversion notes (using libgdc version 59):

Testing Django Views Without Using the Test Client

The normal way to test Django views is via the test client . The test client fakes being a WSGI server and actually makes an HTTP request through all of Django’s request routing machinery. There are a number of reasons why this isn’t an ideal approach.

Using Kubernetes Namespaces to Manage Environments

One of the advantages that Kubernetes provides is the ability to manage various environments easier and better than you have been doing. For most nontrivial applications, you have test, staging, and production environments. You can spin up a separate cluster of resources, such as VMs, with the same configuration in staging and production, but that can be costly and managing the differences between…

Deploying Go Servers with Kubernetes on Container Engine

Cross posted on medium

Why I Joined Google

As some of you may or may not know, I joined Google as a Developer Advocate on the Google Cloud Platform Team in January. I just completed my first 3 months and, like many others , it’s been a whirlwind experience. The sheer amount you need to learn and get used to is overwhelming. Google has been doing a lot since it started almost 20 years ago and it shows. There is a huge amount of built-up…

Orchestration with Fabric #1

When figuring out how I wanted to deploy my website I had a few things that I knew I wanted. I wanted to be able to create my server(s), provision them, and deploy the app all from one tool. This will be the first in a series of posts about how I used Fabric to achieve that.

Javascript Templating Languages

I have been looking at JavaScript templating libraries recently for a personal project and I’d like to write about my thoughts here.

Pickling Objects with Cached Properties

Python descriptors allow you to create properties on python objects that are the result of executing some code. One of the simplest ways of doing that is using the @property decorator. Here, accessing the myprop will call the method and return the resulting "data" .

Some General Trends in Programming Languages

New Year’s Python Meme 2014

Since everyone else was doing it, I thought I’d write one up too.

App Engine Pull Queues and kombu

App Engine provides a pull queue API for accessing, leasing, and processing tasks outside of App Engine. You might do this to perform long running tasks that aren’t suited to App Engine’s infrastructure. Or you might want to use a library or system that isn’t available on App Engine. However, the way you would interact with pull queue is via a REST API. There isn’t much in the way of APIs for…

PyCon APAC 2013

PyCon APAC 2013 is over! I want to thank everyone who helped make the conference a great success. Staff, speakers, attendees alike all contributed to making PyCon APAC 2013 the best PyCon in Japan ever.

Using jQuery deferreds with Backbone.js

Backbone.js is a neat little JavaScript model framework. It gives you nice way of making Models and allows you to fetch and save them to the server easily using a REST API. One of the nice things about Backbone is that for a while it has returned the result of calling the AJAX function back to the application, which if you are using jQuery is a jQuery deferred . This allows you to do cool things…

Learning a Language as Muscle Memory

Google App Engine 1.7.7 pre-release

Update: App Engine 1.7.7 final has been released and is available here: https://developers.google.com/appengine/downloads .

Twitter Archive