10. A Complete Application#

In class you have created the three fundamental components of an application:

  1. A pod definition to define your executable code, CPU and memory requests.

  2. A service definition to make your pod reachable on the network.

  3. A persistent volume claim to hold your precious data.

To complete this milestone you have to verify that all of the components work together. The deployment directory should look like this:

$ tree deployment
deployment
├── pod.yaml
├── service.yaml
├── config.yaml
├── secret.yaml
└── pvc.yaml

Release#

Before you submit this milestone make a GitHub release named milestone-10.x. Making a new release will trigger a build of your Dockerfile, which should be no different than the milestone-6.x release. You can use the newer release tag in your pod or you can use the older release tag.

Test Procedure#

This is a release of what should be a complete and working, though not scalable, application. Keep that in mind when you’re testing it. An end user should be able to apply the resources, create a superuser and go! To test you’ll use minikube which is a stripped down Kubernetes that is used for debugging locally.

Only Test a Release

It’s essential to only test the code snapshot in a release, not the main branch. Your reviewee should have posted a URL like this:

https://github.com/your-name/your-cis-92-repo/releases/tag/milestone-10.1

Notice that it ends with releases/tag/mileston-10.1. If it doesn’t look like that they posted a link to the main branch. Stop and let them know.

The test procedure is:

  1. Open the milestone in GitHub Codespaces. Make sure it’s the milestone release, not main

  2. Open deployment/config.yaml and verify that the following settings are present:

    Variable

    Value

    PORT

    8000

    STUDENT_NAME

    Can be anything

    SITE_NAME

    Can be anything

    DATA_DIR

    /data

    DEBUG

    1

    Error

    If any are missing or set incorrectly send a report with the specific variable names and the correct value.

  3. Open deployment/secret.yaml and verify the following settings are present:

    Variable

    Value

    SECRET_KEY

    Can be anything

    Error

    If any are missing or set incorrectly send a report with the specific variable names and the correct value.

  4. Start minikube

    $ minikube start
    
  5. Apply all resources in the deployment directory.

    $ kubectl apply -f deployment/
    

    Note

    It takes applications a little while to get ready. Check that it’s working by running:

    $ kubectl get all 
    
  6. Verify that the PersistentVolumeClaim has been bound:

    $ kubectl get pvc 
    

    Error

    Verify that the volume claim is in the Bound state. Stop if it is not.

  7. Initialize database.

    $ kubectl exec --stdin --tty pod/mysite-pod -- python manage.py migrate 
    $ kubectl exec --stdin --tty pod/mysite-pod -- python manage.py createsuperuser
    

    Error

    Verify that the database has not previously been initialized and create a new superuser account.

  8. Login using the new account using a forwarded port.

    $ kubectl port-forward svc/mysite-svc 8000:80 
    

    Error

    Make sure all of the pages of the app work and that the student and site names match the configuration.

  9. Delete and restart the pod. Doing this should not affect the database.

    $ kubectl delete pod/mysite-pod 
    $ kubectl apply -f deployment/
    $ kubectl port-forward svc/mysite-svc 8000:80 
    

    Error

    Verify that your credentials still work. If they don’t alert the reviewee

  10. Take a screenshot of the administrative interface with the user you created.

Requirements#

  1. A Pod definition for Django that includes:

    1. Reasonable resource requests:

      1. At least 250m but not more than 1000m CPUs

      2. At least 128Mi of memory but not more than 1Gi of memory

  2. A Service definition for Django with type LoadBalancer

  3. A PersistentVolumeClaim for your application mounted on /data

Submit#

  1. Tag this milestone milestone-10.x.

  2. A URL to your release. It should look like this:

    https://github.com/your-name/your-cis-92-repo/releases/tag/milestone-10.1