Skip to content

Commit 77dabac

Browse files
committed
Initial commit
0 parents  commit 77dabac

20 files changed

Lines changed: 655 additions & 0 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
.hugo_build.lock

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# DevOps self-study projects
2+
3+
This is a source for the [selfstudy.cloudowski.com](https://selfstudy.cloudowski.com/) website with the projects for learning DevOps technologies and tools.`

archetypes/default.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
+++
2+
title = '{{ replace .File.ContentBaseName "-" " " | title }}'
3+
date = {{ .Date }}
4+
draft = true
5+
+++

content/1/_index.md

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
+++
2+
title = "Task 1"
3+
weight = 10
4+
# tags = ["container", "replicas", "registry"]
5+
+++
6+
7+
## Start - simple web application
8+
9+
### Level 1
10+
11+
1. Create a simple web application in the language of your choice (e.g. Go, Python) that just displays a hostname and the app version
12+
1. Create a container image definition in a Dockerfile
13+
Use advanced techniques if applicable (e.g. multistage, build from “scratch”)
14+
1. Make it as small as possible
15+
1. Ensure the image is available for both amd64 and arm64 architectures
16+
1. Publish the image in a private registry
17+
1. Run the application on the cluster in multiple instances
18+
1. Don’t forget about best practices (probes, resources requests/limits)
19+
20+
### Level 2
21+
22+
1. Automate the build process
23+
1. Ensure that after each push to the git repository with the application’s source a build process starts and publish the image
24+
1. Make sure the image doesn’t have critical vulnerabilities after each build
25+

content/1/tips.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
+++
2+
title = 'Tips'
3+
draft = true
4+
+++

content/2/_index.md

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
+++
2+
title = "Task 2"
3+
weight = 20
4+
# tags = ["observability", "tls", "database"]
5+
+++
6+
7+
## Simple app with a database
8+
9+
### Level 1
10+
11+
1. Deploy a database instance of your choice
12+
1. Add connectivity to the database from the application
13+
1. Expose database version under additional http endpoint (e.g. /db)
14+
15+
### Level 2
16+
17+
1. Enable telemetry for the application
18+
1. Expose uptime
19+
1. Expose number of requests processed (excluding the ones from probes)
20+
1. Expose the application outside the cluster via https
21+
1. Implement database operational practices
22+
1. Ensure it is backed up automatically
23+
1. Ensure backups are stored on a separate volume or some object storage (e.g. S3 bucket or similar)
24+
1. Ensure there are at least two instances of the database (e.g. in the active/active or active/passive mode)
25+
1. Ensure the database exposes metrics compatible with the Prometheus format

content/2/tips.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
+++
2+
title = 'Tips'
3+
draft = true
4+
+++

content/3/_index.md

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
+++
2+
title = "Task 3"
3+
weight = 30
4+
# tags = ["observability", "tls", "database"]
5+
+++
6+
7+
## Make the app (more) secure
8+
9+
### Level 1
10+
11+
1. Deploy HashiCorp Vault
12+
1. Deploy outside or inside the cluster
13+
1. Store the database password in Vault and make it accessible directly to the app (i.e bypassing the creation of a Secret object)
14+
1. Gather the metrics from the app - set up proper metrics & monitoring system
15+
16+
### Level 2
17+
18+
1. Use the dynamic database secrets feature instead of static (KV) engine
19+
1. Create a dashboard with the metrics from the app
20+
1. Include the number of ready/running replicas
21+
1. Include the number of requests
22+
1. Ensure that the cluster is monitored and the necessary notifications are configured.
23+
1. Set up monitoring for the app
24+
1. Send an email notification when there are fewer than 3 ready instances
25+
1. Send an email notification when there is a Pod in Pending or CrashLoopbackOff state for more than 3 minutes
26+
27+
### Level 3
28+
29+
1. Ensure logs from the cluster and apps are stored and can be viewed
30+
1. Ensure that cluster events are archived and can be viewed

content/3/tips.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
+++
2+
title = 'Tips'
3+
draft = true
4+
+++

content/4/_index.md

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
+++
2+
title = "Task 4"
3+
weight = 40
4+
# tags = ["observability", "tls", "database"]
5+
+++
6+
7+
## Bring even more security
8+
9+
### Level 1
10+
11+
1. Ensure that the app doesn’t run as a root user
12+
2. The service should try to automatically fix vulnerabilities in the dependencies by creating a Pull/Merge Request
13+
14+
### Level 2
15+
16+
1. Add a scanning service for the source code of the app
17+
1. Ensure that each Pod **MUST** in selected namespaces run a container on non-root user
18+
1. Ensure that the traffic from and to the app is restricted
19+
1. Forbid traffic from other namespaces
20+
1. Explicitly allow traffic between the app instances and the database
21+
22+
### Level 3
23+
24+
1. Ensure that a trusted TLS certificate is used to provide the https access
25+
1. Minimize the syscalls used by the app with a custom syscomp profile
26+
1. Monitor each time when someone execs into the app container and send a mail notification
27+
1. Ensure that the whole network traffic is encrypted within the cluster

0 commit comments

Comments
 (0)