Skip to main content

Basic Scheduler for k8s

Project description

k8s-Scheduler

A Simple python based scheduler to schedule kubernetes jobs on crontab schedules.

This module will help schedule two kinds of jobs ,

Periodic

These are jobs which are supposed to run on a crontab schedule. This package would launch kubernetes pods as per the crontab schedule and monitor its runs.

Continuous runs

These are jobs which are supposed to be running continuously. Like a stream data input. This package would launch and monitor such continuous runs. If any of the run fails for any reason , this package would reschedule it.

Installation

To install the scheduler run below command,

pip install k8s-scheduler 

Pre requisites

As the name suggests it's a job scheduler for kubernetes , so you would need a k8s instance apart from below mandatory and optional requirements.

Mongodb - This acts as a data store for scheduler and results backend.

EFL / ELK Stack - For logging and retrieving logs for a pod which is complete / running

Example usage

Use the package to create a schedule entry in the backend , and use the run_scheduler method to start the scheduler in backrgound mode.

from k8s_scheduler import Scheduler
from k8s_scheduler.LogHandler import LogHandler

scheduler = Scheduler(host="mongo_db_host",
                      username="user_name",
                      password="password",
                      db_name="test_schedule")

# Create schedules in the mongodb collection
job_id_1 = scheduler.create_schedule(schedule=test_job_1)
job_id_2 = scheduler.create_schedule(schedule=test_job_2)
job_id_3 = scheduler.create_schedule(schedule=test_job_3)

# Start Scheduler application 
scheduler.start_scheduler()

Schedule object type

Below is the template for the scheduler object.

schedule_rec = {
        "schedule_name": "test-schedule-3-always", # Name of the schedule
        "schedule_enabled": 1,  # 1 for enabled 0 for disabled 
        "schedule_description": "test always schedule with nginx and with service",
        "schedule_type": "always", # always is for streaming continuous jobs , periodic is for crontab based schedules 
        "parallel_execution": 0, # If two instances of the same job can run together
        "schedule_crontab": { # Crontab schedule
                            "minute": "*/2",
                            "hour": "*",
                            "day_of_month": "*",
                            "month": "*",
                            "day_of_week": "*"
                            },
        "kubernetes_deployment_options": {
                                        "name": "nginx-always-service",  # name of the deployment
                                        "container_name": "nginx-always", # Container name
                                        "container_image": "nginx:latest", # Image 
                                        "restart_policy": "", # k8s Restart policy 
                                        "ttl_seconds_after_finished": 10, # Seconds until the job needs to be purged 
                                        "env_vars": [], # Env vars for the deployment 
                                        "deploy_service": 1,  # If a service needs to be deployed ? 1=yes 0=No
                                        "service_name": "nginx-service", # Name of the service 
                                        "port": 8080, # Port exposed 
                                        "target_port": 80 # Port exposed 
                                        }
        }

Scheduler options

Below are the defaults when starting the scheduler, any of these params can be modified when creating a scheduler instance

scheduler = Scheduler(db_name="k8s_scheduler",  # Name of the Mongodb Database
                      scheduler_collection_name="test_coll", # Collection name for the scheduler
                      result_db_collection='result_coll', # Collection name for the result store
                      scheduler_poll_interval=10, # Polling interval for scheduler in seconds 
                      k8s_worker_namespace="test-namespace", # k8s namespace in which pods are to be deployed 
                      k8s_config_file_path='/var/snap/microk8s/current/credentials/client.config', # k8s config file if running outside cluster
                      **kwargs # connection args for mongodb 
                      )

Log Retrieval and schedules history.

We can retrieve logs of the jobs by connecting to ELK/EFK stack as below

log_handler = LogHandler(elastic_search_server='10.1.179.109',  # Elastic server
                         elastic_search_port='9200', # port 
                         worker_namespace='test-namespace', # namespace of the workers 
                         index='logstash*') # logstash index 

log_handler.get_logs(schedule_name="nginx-always", # Name of the schedule  
                     output_json=True) # If True Returns log as json object , if False prints log to console 

Testing the application

To test the application we can use microk8s to spin up a k8s cluster and install required backends.

Install microk8s / k8s flavour

sudo snap install microk8s --classic
microk8s enable helm3 ingress dashboard dns storage registry fluentd
sudo snap alias microk8s.kubectl kubectl
sudo snap alias microk8s.helm3 helm

Install backends

helm install test-mongodb bitnami/mongodb -n test-mongodb --create-namespace --set architecture=replicaset

Once the stack is up use make file to create and clean the dns entries so that you can connect to database from outside the cluster.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

k8s-scheduler-0.0.11.tar.gz (20.0 kB view details)

Uploaded Source

Built Distribution

k8s_scheduler-0.0.11-py3-none-any.whl (17.9 kB view details)

Uploaded Python 3

File details

Details for the file k8s-scheduler-0.0.11.tar.gz.

File metadata

  • Download URL: k8s-scheduler-0.0.11.tar.gz
  • Upload date:
  • Size: 20.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.8.0 pkginfo/1.8.2 readme-renderer/34.0 requests/2.27.1 requests-toolbelt/0.9.1 urllib3/1.26.9 tqdm/4.63.1 importlib-metadata/4.11.3 keyring/23.5.0 rfc3986/2.0.0 colorama/0.4.4 CPython/3.9.12

File hashes

Hashes for k8s-scheduler-0.0.11.tar.gz
Algorithm Hash digest
SHA256 25ba1948ad6e593890338ef3e27a483a03411cde6c68cc3dac3aeaa35ab7359c
MD5 f0439f53f2ea5d43f82da35243b99aab
BLAKE2b-256 8818a2dd23e85b4afdc7bed8591453da0b1f9553c459971349ddd0f1b898cd9e

See more details on using hashes here.

File details

Details for the file k8s_scheduler-0.0.11-py3-none-any.whl.

File metadata

  • Download URL: k8s_scheduler-0.0.11-py3-none-any.whl
  • Upload date:
  • Size: 17.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.8.0 pkginfo/1.8.2 readme-renderer/34.0 requests/2.27.1 requests-toolbelt/0.9.1 urllib3/1.26.9 tqdm/4.63.1 importlib-metadata/4.11.3 keyring/23.5.0 rfc3986/2.0.0 colorama/0.4.4 CPython/3.9.12

File hashes

Hashes for k8s_scheduler-0.0.11-py3-none-any.whl
Algorithm Hash digest
SHA256 99c9066fcb2749c8c7f890a85fb8e385db87f344c061a55d4872a8f609ac0da7
MD5 65af27526b5a7b6614d4ef9cd7843490
BLAKE2b-256 70de3ee564f5409a66b51f727e6b135e12e3513d6eb90293e79b9aea9fa7ea85

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page