Overview In this post, We’ll share the process how you can Develop and Deploy Python Application using Docker and Kubernetes and adopt DevOps in existing Python Applications. Prerequisites are mentioned below To follow this guide you need Kubernetes Kubectl — Option are GlusterFS, , , , etc. Shared Persistent Storage Ceph FS AWS EBS AzureDisk Python Application Source Code Dockerfile Container-Registry is an open source platform that automates container operations, and is best for testing kubernetes in a local environment. Kubernetes Minikube You May Also Love to Read Kubernetes Overview, Monitoring and Security is command line interface to manage kubernetes cluster either remotely or locally. To configure kubectl in your machine follow this . Kubectl link Shared Persistent Storage is permanent storage that we attach to the kubernetes container. We will be using cephfs as a persistent data store for kubernetes container applications. Application Source Code is source code that we want to run inside a kubernetes container. contains all the actions that are performed to build python application. Dockerfile The is an online image store for container images. Registry Below mentioned options are few most popular registries. 1. Private Docker Hub 2. AWS ECR 3. Docker Store 4. Google Container Registry Dockerfile The Below mentioned code is sample docker file for Python applications. In which we are using python 2.7 development environment. FROM python:2.7 MAINTAINER XenonStack # Creating Application Source Code Directory RUN mkdir -p /usr/src/app # Setting Home Directory for containers WORKDIR /usr/src/app # Installing python dependencies COPY requirements.txt /usr/src/app/ RUN pip install --no-cache-dir -r requirements.txt # Copying src code to Container COPY . /usr/src/app # Application Environment variables ENV APP_ENV development # Exposing Ports EXPOSE 5035 # Setting Persistent data VOLUME ["/app-data"] # Running Python Application CMD ["python", "wsgi.py"] The Below mentioned command will build your application container image. Building Python Docker Image The Below mentioned command will build your application container image. $ docker build -t <name of your python application>:<version of application> . Publishing Container Image To publish Python container image, we can use different private/public cloud repository like , , , . Docker Hub AWS ECR Google Container Registry Private Docker Registry Adding Container Registry to Docker Daemon If you are using docker registry other than to store images, then we need to add that container registry to our local docker daemon and kubernetes Docker daemons. docker hub You must have following things to follow next steps. $ docker version Client: Version: 17.03.1-ce API version: 1.27 Go version: go1.7.5 Git commit: c6d412e Built: Mon Mar 27 17:14:09 2017 OS/Arch: linux/amd64 (Ubuntu 16.04) Now we need to Create a “daemon.json” in below-mentioned location $ sudo nano /etc/docker/daemon.json And add the following content to it. { "insecure-registries": ["<name of your private registry>"] } Now Run the following commands to reload systemctl and restart docker daemon. $ sudo systemctl daemon-reload $ sudo service docker restart To verify that your container registry is added to local docker daemon, use the below-mentioned steps. $ docker info In output of above, you get your container registry like this Insecure Registries: <your container registry name> 127.0.0.0/8 Pushing container Images to Registry I’m using AWS ECR for publishing container images. You must have an AWS account with Amazon ECR permissions. Create AWS ECR repository using a below-mentioned link. http://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-create.html After creation, you will get registry URL, username, and password from own AWS cloud. Here is a shell script that will add your AWS credentials for Amazon ECR in your local system so that you can push images to AWS ECR. #!/bin/bash pip install --upgrade --user awscli mkdir -p ~/.aws && chmod 755 ~/.aws cat << EOF > ~/.aws/credentials [default] aws_access_key_id = XXXXXX aws_secret_access_key = XXXXXX EOF cat << EOF > ~/.aws/config [default] output = json region = XXXXX EOF chmod 600 ~/.aws/credentials ecr-login=$(aws ecr get-login --region XXXXX) $ecr-login Now we need to retag python application image and push them to docker hub container registry. To Retag application container image $ docker tag <name of your application>:<version of your application> <aws ecr repository link>/<name of your application >:<version of your application> To Push application container Images $ docker push <aws ecr repository link>/<name of your application >:<version of your application> Configure Persistent Volume (optional) Persistent Volume is only required if your application has to save some data other than a database like documents, images, video, etc. then we need to use the persistent volume that kubernetes support like was AWS EBC, CephFS, GlusterFS, Azure Disk, NFS, etc. Today I will be using cephfs(rbd) for persistent data to kubernetes containers. We need to create two files named and persistent-volume.yml persistent-volume-claim.yml Persistent Volume Below I have added content for persistent-volume.yml --- apiVersion: v1 kind: PersistentVolume metadata: name: app-disk1 namespace: <namespace of Kubernetes> spec: capacity: storage: 50Gi accessModes: - ReadWriteMany cephfs: monitors: - "172.16.0.34:6789" user: admin secretRef: name: ceph-secret readOnly: false Persistent Volume Claim Add the below-mentioned code to . persistent-volume-claim.yml --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: appclaim1 namespace: <namespace of Kubernetes> spec: accessModes: - ReadWriteMany resources: requests: storage: 10Gi Adding Claims to Kubernetes Using below mentioned commands to add persistent volume and claim to kubernetes cluster. $ kubectl create -f persistent-volume.yml $ kubectl create -f persistent-volume-claim.yml Creating Deployment Files for Kubernetes Deploying application on kubernetes with ease using deployment and service files either in JSON or YAML format. Deployment File Following Content is for “** **deployment.yml” file of Python container application. <name of application>. apiVersion: extensions/v1beta1 kind: Deployment metadata: name: <name of application> namespace: <namespace of Kubernetes> spec: replicas: 1 template: metadata: labels: k8s-app: <name of application> spec: containers: - name: <name of application> image: <image name >:<version tag> imagePullPolicy: "IfNotPresent" ports: - containerPort: 5035 volumeMounts: - mountPath: /app-data name: <name of application> volumes: - name: <name of application> persistentVolumeClaim: claimName: appclaim1 Service File Following Content is for “** **service.yml” file of Python container application. <name of application>. apiVersion: v1 kind: Service metadata: labels: k8s-app: <name of application> name: <name of application> namespace: <namespace of Kubernetes> spec: type: NodePort ports: - port: 5035 selector: k8s-app: <name of application> Running Python Application on Kubernetes Python Container Application can be deployed either by kubernetes Dashboard or Kubectl (Command line). I`m using the command line that you can use in production kubernetes cluster. $ kubectl create -f <name of application>.deployment.yml $ kubectl create -f <name of application>.service.yml Now we have successfully deployed Python Application on Kubernetes. Verification We can verify application deployment either by using Kubectl or Kubernetes Dashboard. Below mentioned command would show you running pods of your application with status running/terminated/stop/created. Continue Reading The Full Article at — XenonStack.com/Blog