This documentation provides an in-depth guide on setting up Docker for the development environment using the Kubernetes client in Python. It focuses on the configuration needed to run your development workflow smoothly within Docker containers.

Dockerfile Configuration

You will need to create a Dockerfile that sets up an environment where the Kubernetes client can be installed and used effectively. Below is a sample Dockerfile configuration:

 FROM nbgallery/jupyter-alpine:latest  
 
 RUN pip install git+https://github.com/kubernetes-client/python.git 
 
 ENTRYPOINT ["/sbin/tini", "--"] 
 CMD ["jupyter", "notebook", "--ip=0.0.0.0"]

Explanation:

  • Base Image: The Dockerfile starts with nbgallery/jupyter-alpine:latest, which provides a lightweight Jupyter environment.
  • Install Kubernetes Client: The command RUN pip install git+https://github.com/kubernetes-client/python.git installs the Kubernetes client directly from the GitHub repository.
  • Entrypoint: The process is initiated using tini, helping to manage the application processes effectively.
  • Command: By default, it runs a Jupyter notebook that listens on all IP addresses.

Example Kubernetes Resource Definitions

To run applications in Docker, Kubernetes resources such as Pods and Services are defined. Here’s an example that includes both Pod and Service configurations.

Pod and Service Configuration

Create a file named jupyter.yml with the following contents:

apiVersion: v1
kind: Service
metadata:
  name: jupyter
  labels:
    app: jupyter
spec:
  ports:
  - port: 80
    name: http
    targetPort: 8888
  selector:
    app: jupyter
  type: LoadBalancer
---
apiVersion: v1
kind: Pod
metadata:
  name: jupyter
  labels:
    app: jupyter
spec:
  initContainers:
    - name: git-clone
      image: alpine/git
      args:
          - clone
          - --single-branch
          - --
          - https://github.com/kubernetes-client/python.git
          - /data
      volumeMounts:
      - mountPath: /data
        name: notebook-volume
  containers:
    - name: jupyter
      image: skippbox/jupyter:0.0.3
      ports:
      - containerPort: 8888
        protocol: TCP
        name: http
      volumeMounts:
        - mountPath: /root
          name: notebook-volume
  volumes:
  - name: notebook-volume
    emptyDir: {}

Components Explained:

  1. Service: This configuration establishes a LoadBalancer service exposing the application on port 80, directing traffic to the Pod on port 8888.

  2. Pod:

    • The Pod definition contains initContainers, which perform a Git clone of the Kubernetes client repository into a temporary directory before the main container starts.
    • The main container runs Jupyter and mounts a volume to store Jupyter notebooks.

Shell Script for Initialization

To set up your environment, you can use a shell script like the following:

#!/bin/bash

function clean_exit(){
    local error_code="$?"
    local spawned=$(jobs -p)
    if [ -n "$spawned" ]; then
        sudo kill $(jobs -p)
    fi
    return $error_code
}

trap "clean_exit" EXIT

# Disable SE-Linux
setenforce 0

# Fix DNS issues by mounting root
sudo mount --make-rshared /

# Install prerequisites
sudo apt-get update
sudo apt-get install -y conntrack socat

# Install Docker if not present
path_to_executable=$(which docker)
if [ -x "$path_to_executable" ] ; then
    echo "Found Docker installation"
else
    curl -sSL https://get.docker.io | sudo bash
fi
docker --version

Explanation of the Script:

  • Function: clean_exit to clean up any background jobs on exit.
  • SELinux: Temporarily disables SELinux for easier container networking.
  • Docker Installation: Checks for Docker’s presence, installs it if not found.

Summary

This document offers a comprehensive outline for configuring Docker within a development environment using the Kubernetes client for Python. It includes step-by-step instructions on crafting a Dockerfile, setting up Kubernetes resource definitions, and initializing the environment via shell scripts. For further information, refer to the respective Kubernetes and Docker documentation.

Source:

  • Dockerfile and resource definitions are interpreted from the provided data snippets.