Ian Lewis is an engineer based in Tokyo, Japan. His current interests are in Container Native Security, Supply Chain Security, Containers, and Kubernetes.
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 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.
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.
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.
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.
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.
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?
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.
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 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…
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…
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…
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.
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.
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.
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.
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
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.
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.
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.
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.
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.
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.
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…
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…
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() .
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.
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…
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…
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.
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" .
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 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.
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…