├── lesson-40
├── README.md
├── terraform
│ ├── README.md
│ ├── versions.tf
│ └── variables.tf
└── k8s
│ ├── example-1
│ └── az-spread.yaml
│ ├── kind
│ ├── README.md
│ ├── kind-config.yaml
│ └── topology.yaml
│ ├── README.md
│ ├── example-4
│ └── topology.yaml
│ └── common
│ └── nginx.yaml
├── lesson-24
├── terraform
│ ├── README.md
│ └── variables.tf
├── README.md
└── k8s
│ ├── 0-namespace.yaml
│ ├── 1-sa.yaml
│ ├── README.md
│ ├── 3-deploy-awscli-default.yaml
│ └── 2-deploy-awscli.yaml
├── lesson-25
├── terraform
│ ├── README.md
│ └── variables.tf
├── README.md
└── k8s
│ ├── example-4
│ ├── namespace.yaml
│ ├── README.md
│ ├── ingress.yaml
│ ├── deploy-svc-app.yaml
│ ├── prod-issuer.yaml
│ └── staging-issuer.yaml
│ ├── values-cert-manager.yaml
│ ├── example-1
│ ├── README.md
│ ├── deploy-svc-app-1.yaml
│ ├── deploy-svc-app-2.yaml
│ └── ingress.yaml
│ ├── example-2
│ ├── certificate.yaml
│ ├── README.md
│ ├── ingress.yaml
│ └── deploy-svc-app-3.yaml
│ ├── example-3
│ ├── README.md
│ ├── wildcard-certificate.yaml
│ ├── deploy-svc-app.yaml
│ ├── deploy-svc-app-4.yaml
│ └── deploy-svc-app-5.yaml
│ ├── README.md
│ ├── prod-clusterissuer.yaml
│ └── staging-clusterissuer.yaml
├── lesson-29
├── terraform
│ ├── README.md
│ └── variables.tf
├── README.md
└── k8s
│ └── chartmuseum-values.yaml
├── lesson-31
├── terraform
│ ├── README.md
│ └── variables.tf
├── k8s
│ ├── fluentd
│ │ ├── namespace.yaml
│ │ └── rbac.yaml
│ └── apps
│ │ ├── deploy-1.yaml
│ │ ├── deploy-2.yaml
│ │ └── deploy-3.yaml
└── README.md
├── lesson-32
├── terraform
│ ├── README.md
│ └── variables.tf
├── README.md
└── k8s
│ ├── example-5
│ └── README.md
│ ├── example-2
│ ├── ns.yaml
│ ├── README.md
│ ├── deploy-svc-app-1.yaml
│ ├── deploy-svc-app-2.yaml
│ └── ingress.yaml
│ ├── albc-values.yaml
│ ├── example-1
│ └── README.md
│ └── README.md
├── lesson-33
├── terraform
│ ├── README.md
│ ├── variables.tf
│ └── helm-alb.tf
├── README.md
└── k8s
│ ├── README.md
│ └── external-dns-values.yaml
├── lesson-35
├── terraform
│ ├── README.md
│ ├── templates
│ │ └── values.yaml
│ ├── versions.tf
│ └── variables.tf
├── k8s
│ ├── charts
│ │ └── app
│ │ │ ├── README.md
│ │ │ ├── values.yaml
│ │ │ ├── Chart.yaml
│ │ │ ├── templates
│ │ │ ├── svc-2.yaml
│ │ │ ├── svc-1.yaml
│ │ │ ├── deploy-1.yaml
│ │ │ ├── deploy-2.yaml
│ │ │ └── ingress.yaml
│ │ │ └── .helmignore
│ ├── infrastructure
│ │ ├── README.md
│ │ ├── charts
│ │ │ ├── bootstrap-app
│ │ │ │ └── README.md
│ │ │ └── cert-manager-configs
│ │ │ │ ├── values.yaml
│ │ │ │ ├── .helmignore
│ │ │ │ └── templates
│ │ │ │ └── cluster-issuer-prod.yaml
│ │ └── applications
│ │ │ ├── .helmignore
│ │ │ ├── templates
│ │ │ ├── 00-project-dev.yaml
│ │ │ └── 00-project-infra.yaml
│ │ │ └── values.yaml
│ └── development
│ │ ├── values.yaml
│ │ ├── .helmignore
│ │ └── templates
│ │ └── app.yaml
└── README.md
├── lesson-36
├── terraform
│ ├── README.md
│ ├── versions.tf
│ └── variables.tf
├── k8s
│ ├── example-4
│ │ ├── ns.yaml
│ │ ├── sa.yaml
│ │ ├── ss-parameter-store.yaml
│ │ └── mysql-secrets-manager.yaml
│ ├── example-3
│ │ ├── ns-1.yaml
│ │ └── ns-2.yaml
│ ├── common
│ │ ├── sa.yaml
│ │ ├── css-parameter-store.yaml
│ │ └── css-secrets-manager.yaml
│ ├── README.md
│ ├── example-1
│ │ ├── external-secret.yaml
│ │ └── deploy.yaml
│ └── example-2
│ │ ├── mysql-secrets-manager.yaml
│ │ └── mysql-parameter-store.yaml
└── README.md
├── lesson-37
├── terraform
│ ├── README.md
│ ├── versions.tf
│ ├── variables.tf
│ └── irsa-ebs-csi-driver.tf
└── README.md
├── lesson-38
├── terraform
│ ├── README.md
│ ├── versions.tf
│ └── variables.tf
├── README.md
└── k8s
│ ├── README.md
│ └── example-1
│ └── with-node-affinity.yaml
├── lesson-39
├── terraform
│ ├── README.md
│ ├── versions.tf
│ └── variables.tf
├── README.md
└── k8s
│ ├── example-3
│ ├── README.md
│ └── with-no-execute-taint.yaml
│ ├── example-2
│ ├── README.md
│ └── with-prefer-no-schedule-taint.yaml
│ └── example-1
│ └── with-no-schedule-taint.yaml
├── lesson-41
├── terraform
│ ├── README.md
│ ├── versions.tf
│ ├── kms.tf
│ └── variables.tf
├── README.md
└── k8s
│ ├── example-1
│ ├── pvc.yaml
│ └── deploy.yaml
│ ├── example-2
│ ├── pvc.yaml
│ ├── storageclass.yaml
│ └── deploy.yaml
│ ├── example-3
│ ├── pvc.yaml
│ ├── storageclass.yaml
│ └── deploy.yaml
│ └── example-4
│ ├── pvc.yaml
│ ├── storageclass.yaml
│ └── deploy.yaml
├── lesson-42
├── terraform
│ ├── README.md
│ ├── templates
│ │ └── efs-csi-values.yaml
│ ├── versions.tf
│ ├── kms.tf
│ └── variables.tf
├── README.md
└── k8s
│ ├── example-1
│ ├── pvc.yaml
│ ├── pv.yaml
│ └── deploy.yaml
│ └── example-3
│ ├── pvc.yaml
│ ├── storageclass.yaml
│ └── deploy.yaml
├── lesson-43
├── terraform
│ ├── README.md
│ ├── templates
│ │ └── tigera-operator-values.yaml
│ ├── versions.tf
│ └── variables.tf
├── k8s
│ ├── example-1
│ │ ├── network-policies
│ │ │ ├── default-deny.yaml
│ │ │ └── allow-ingress-nginx.yaml
│ │ ├── nginx.yaml
│ │ └── deploy.yaml
│ ├── example-2
│ │ ├── network-policies
│ │ │ ├── default-deny.yaml
│ │ │ └── allow-ingress.yaml
│ │ └── deploy.yaml
│ └── example-3
│ │ ├── network-policies
│ │ ├── allow-metadata-access.yaml
│ │ └── deny-metadata-access.yaml
│ │ ├── deploy-app.yaml
│ │ └── deploy-awscli.yaml
└── README.md
├── lesson-49
├── terraform
│ ├── README.md
│ ├── ecr.tf
│ ├── versions.tf
│ └── variables.tf
├── repo-examples
│ ├── app-1
│ │ ├── Dockerfile
│ │ └── server.py
│ └── app-2
│ │ ├── Dockerfile
│ │ └── server.py
├── k8s
│ ├── sa-kaniko.yaml
│ └── gitlab-runner-secret.yaml
└── README.md
├── lesson-44-45-46-47-48
├── terraform
│ ├── README.md
│ ├── modules
│ │ └── s3
│ │ │ ├── README.md
│ │ │ ├── versions.tf
│ │ │ ├── variables.tf
│ │ │ ├── outputs.tf
│ │ │ └── main.tf
│ ├── templates
│ │ └── values.yaml
│ ├── versions.tf
│ ├── irsa-ebs-csi-driver.tf
│ └── variables.tf
├── README.md
├── k8s
│ ├── charts
│ │ └── app
│ │ │ ├── README.md
│ │ │ ├── values.yaml
│ │ │ ├── Chart.yaml
│ │ │ ├── templates
│ │ │ ├── svc-2.yaml
│ │ │ ├── svc-1.yaml
│ │ │ ├── deploy-1.yaml
│ │ │ ├── deploy-2.yaml
│ │ │ └── ingress.yaml
│ │ │ └── .helmignore
│ ├── infrastructure
│ │ ├── README.md
│ │ ├── charts
│ │ │ ├── bootstrap-app
│ │ │ │ ├── README.md
│ │ │ │ └── templates
│ │ │ │ │ └── external-secrets.yaml
│ │ │ ├── cert-manager-configs
│ │ │ │ ├── values.yaml
│ │ │ │ ├── .helmignore
│ │ │ │ └── templates
│ │ │ │ │ └── cluster-issuer-prod.yaml
│ │ │ └── external-secrets-configs
│ │ │ │ ├── values.yaml
│ │ │ │ ├── templates
│ │ │ │ ├── sa.yaml
│ │ │ │ ├── css-parameter-store.yaml
│ │ │ │ └── css-secrets-manager.yaml
│ │ │ │ └── .helmignore
│ │ └── applications
│ │ │ ├── .helmignore
│ │ │ └── templates
│ │ │ ├── 00-project-dev.yaml
│ │ │ └── 00-project-infra.yaml
│ ├── gitlab
│ │ ├── ns.yaml
│ │ ├── storageclass.yaml
│ │ ├── pages-wildcard-cert.yaml
│ │ ├── agent
│ │ │ └── external-secrets.yaml
│ │ ├── secrets.yaml
│ │ └── runners
│ │ │ ├── internal
│ │ │ └── external-secrets.yaml
│ │ │ └── external
│ │ │ └── external-secrets.yaml
│ └── development
│ │ ├── values.yaml
│ │ ├── .helmignore
│ │ └── templates
│ │ └── app.yaml
└── repo-examples
│ ├── agents
│ ├── README.md
│ └── .gitlab
│ │ └── agents
│ │ └── agent
│ │ └── config.yaml
│ ├── demo-cache
│ ├── README.md
│ └── .gitlab-ci.yml
│ ├── demo
│ ├── README.md
│ ├── .gitattributes
│ ├── Gemfile
│ ├── demo.mp4
│ ├── .gitlab-ci.yml
│ └── index.html
│ └── k8s-manifests
│ ├── README.md
│ ├── .gitlab-ci.yml
│ └── kuber.yaml
├── lesson-26
├── example-5
│ ├── configs
│ │ ├── conf.ini
│ │ ├── level.config
│ │ └── properties
│ ├── nginx.conf
│ ├── env-file.properties
│ └── README.md
├── example-4
│ ├── cm.yaml
│ └── deploy.yaml
├── example-3
│ ├── cm.yaml
│ └── pod.yaml
├── example-2
│ ├── kuber-deploy-arg.yaml
│ └── kuber-deploy.yaml
└── example-1
│ └── deploy.yaml
├── lesson-07
├── namespace.yaml
├── kuber-pod.yaml
├── kuber-pod-with-gpu.yaml
└── kuber-pod-with-labels.yaml
├── lesson-30
├── charts
│ └── demo
│ │ ├── values-dev.yaml
│ │ ├── templates
│ │ ├── serviceaccount.yaml
│ │ ├── service.yaml
│ │ ├── tests
│ │ │ └── test-connection.yaml
│ │ └── hpa.yaml
│ │ └── .helmignore
├── dev
│ └── kuber
│ │ ├── svc.yaml
│ │ └── deploy.yaml
├── README.md
└── argocd
│ ├── README.md
│ ├── projects
│ ├── infra.yaml
│ └── dev.yaml
│ └── applications
│ └── ingress-nginx.yaml
├── lesson-15
├── docker-entrypoint-shell
│ ├── Dockerfile
│ └── server.py
├── docker-entrypoint-exec
│ ├── Dockerfile
│ └── server.py
├── docker
│ ├── Dockerfile
│ └── server-default.py
└── kuber-deploy.yaml
├── lesson-34
├── example-4
│ ├── README.md
│ ├── sa-secret.yaml
│ └── app.yaml
├── README.md
├── example-1
│ ├── nginx.yaml
│ └── app.yaml
├── example-2
│ ├── sa.yaml
│ └── app.yaml
└── example-3
│ ├── sa.yaml
│ └── app.yaml
├── lesson-11
├── externalname-service.yaml
├── clusterip-service.yaml
├── headless-clusterip-service.yaml
├── lb-service.yaml
├── nodeport-service.yaml
└── kuber-deployment.yaml
├── lesson-01
└── README.md
├── lesson-02
└── README.md
├── lesson-03
└── README.md
├── lesson-04
└── README.md
├── lesson-05
└── README.md
├── lesson-27
├── README.md
├── example-1
│ ├── secret-stringData.yaml
│ ├── secret-data.yaml
│ ├── deploy-1.yaml
│ ├── deploy-2.yaml
│ └── README.md
├── example-3
│ ├── ssh-auth.yaml
│ ├── tls.yaml
│ ├── basic-auth.yaml
│ ├── README.md
│ └── deploy-private.yaml
└── example-2
│ ├── secret-data.yaml
│ ├── deploy-1.yaml
│ └── deploy-2.yaml
├── lesson-23
├── sc-ebs-csi-example.yaml
├── 1-pvc-kuber.yaml
├── 0-pvc-kuber.yaml
├── 1-sc-kuber.yaml
├── 0-deploy-kuber.yaml
├── 1-deploy-kuber.yaml
└── 0-pv-kuber.yaml
├── lesson-06
└── kuber-pod.yaml
├── lesson-08
├── kuber-pod.yaml
├── rs-kuber.yaml
├── rc-kuber.yaml
├── rs-kuber-matchExpressions.yaml
└── kuber-pods-manual.yaml
├── lesson-10
├── clusterip-service.yaml
├── endpoints-service.yaml
├── kuber-deployment.yaml
└── pod-service-port-names.yaml
├── lesson-09
├── kuber-service.yaml
├── kuber-deployment-recreate.yaml
└── kuber-deployment.yaml
├── lesson-20
├── README.md
├── 1-cronjob-allow.yaml
├── 2-cronjob-forbid.yaml
├── 3-cronjob-replace.yaml
├── 5-cronjob-skip-next-schedule.yaml
├── 6-cronjob-startingDeadlineSeconds.yaml
├── 8-cronjob-without-startingDeadlineSeconds.yaml
├── 7-cronjob-startingDeadlineSeconds.yaml
├── 0-cronjob.yaml
└── 4-cronjob-suspend.yaml
├── lesson-19
├── 0-job.yaml
├── 7-job-with-ttl.yaml
├── 3-job-completions.yaml
├── 4-job-parallelism.yaml
├── 2-job-never.yaml
├── 1-job-onfailure.yaml
├── 5-job-parallelism-completions.yaml
└── 6-job-with-timeout.yaml
├── lesson-21-22
├── 2-hostPath-volume.yaml
├── 3-awsElasticBlockStore.yaml
├── 1-deploy-two-containers.yaml
└── 0-deploy-kuber.yaml
├── lesson-18
└── daemonset.yaml
├── lesson-12
├── deploy-svc-app-latest.yaml
├── deploy-svc-app-v1.yaml
├── deploy-svc-app-v2.yaml
└── deploy-svc-app-v3.yaml
├── lesson-16
├── deploy-svc-app-1.yaml
├── deploy-svc-app-2.yaml
├── prod_ClusterIssuer.yaml
├── staging_ClusterIssuer.yaml
└── ingress.yaml
└── lesson-13
├── kuber-deploy.yaml
├── kuber-deploy-readinessProbe-http.yaml
├── kuber-deploy-livenessProbe-http.yaml
└── kuber-deploy-livenessProbe-exec.yaml
/lesson-40/README.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/lesson-24/terraform/README.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/lesson-25/terraform/README.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/lesson-29/terraform/README.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/lesson-31/terraform/README.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/lesson-32/terraform/README.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/lesson-33/terraform/README.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/lesson-35/terraform/README.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/lesson-36/terraform/README.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/lesson-37/terraform/README.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/lesson-38/terraform/README.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/lesson-39/terraform/README.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/lesson-40/terraform/README.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/lesson-41/terraform/README.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/lesson-42/terraform/README.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/lesson-43/terraform/README.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/lesson-49/terraform/README.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/lesson-35/k8s/charts/app/README.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/lesson-35/k8s/infrastructure/README.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/lesson-44-45-46-47-48/terraform/README.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/lesson-26/example-5/configs/conf.ini:
--------------------------------------------------------------------------------
1 | My config!
--------------------------------------------------------------------------------
/lesson-26/example-5/configs/level.config:
--------------------------------------------------------------------------------
1 | warn
--------------------------------------------------------------------------------
/lesson-38/README.md:
--------------------------------------------------------------------------------
1 | # Affinity and anti-affinity
--------------------------------------------------------------------------------
/lesson-39/README.md:
--------------------------------------------------------------------------------
1 | # Taints and Tolerations
2 |
--------------------------------------------------------------------------------
/lesson-44-45-46-47-48/README.md:
--------------------------------------------------------------------------------
1 | # GitLab
2 |
--------------------------------------------------------------------------------
/lesson-44-45-46-47-48/k8s/charts/app/README.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/lesson-44-45-46-47-48/terraform/modules/s3/README.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/lesson-35/k8s/infrastructure/charts/bootstrap-app/README.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/lesson-44-45-46-47-48/k8s/infrastructure/README.md:
--------------------------------------------------------------------------------
1 |
2 | Demos
--------------------------------------------------------------------------------
/lesson-44-45-46-47-48/repo-examples/agents/README.md:
--------------------------------------------------------------------------------
1 | # Agents
--------------------------------------------------------------------------------
/lesson-25/README.md:
--------------------------------------------------------------------------------
1 | # Cert-manager. Configuring DNS01 Challenge Provider
--------------------------------------------------------------------------------
/lesson-44-45-46-47-48/k8s/infrastructure/charts/bootstrap-app/README.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/lesson-44-45-46-47-48/repo-examples/demo-cache/README.md:
--------------------------------------------------------------------------------
1 | # demo-cache
2 |
--------------------------------------------------------------------------------
/lesson-44-45-46-47-48/repo-examples/demo/README.md:
--------------------------------------------------------------------------------
1 | # Demo Test Repo
2 |
--------------------------------------------------------------------------------
/lesson-44-45-46-47-48/repo-examples/k8s-manifests/README.md:
--------------------------------------------------------------------------------
1 | # k8s-manifests
2 |
--------------------------------------------------------------------------------
/lesson-07/namespace.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: Namespace
3 | metadata:
4 | name: dev
--------------------------------------------------------------------------------
/lesson-24/README.md:
--------------------------------------------------------------------------------
1 | # How to associate AWS IAM roles to Kubernetes service accounts in AWS EKS
--------------------------------------------------------------------------------
/lesson-33/README.md:
--------------------------------------------------------------------------------
1 | # ExternalDNS
2 |
3 | https://github.com/kubernetes-sigs/external-dns
--------------------------------------------------------------------------------
/lesson-26/example-5/configs/properties:
--------------------------------------------------------------------------------
1 | Hello from World!
2 | This is demo config!
3 | As an example.
--------------------------------------------------------------------------------
/lesson-36/k8s/example-4/ns.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: Namespace
3 | metadata:
4 | name: example
--------------------------------------------------------------------------------
/lesson-44-45-46-47-48/repo-examples/demo/.gitattributes:
--------------------------------------------------------------------------------
1 | *.mp4 filter=lfs diff=lfs merge=lfs -text
2 |
--------------------------------------------------------------------------------
/lesson-31/k8s/fluentd/namespace.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: Namespace
3 | metadata:
4 | name: fluentd
--------------------------------------------------------------------------------
/lesson-44-45-46-47-48/repo-examples/demo/Gemfile:
--------------------------------------------------------------------------------
1 | source "https://rubygems.org"
2 |
3 | gem "jekyll"
4 |
--------------------------------------------------------------------------------
/lesson-44-45-46-47-48/k8s/gitlab/ns.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: Namespace
3 | metadata:
4 | name: gitlab
5 |
--------------------------------------------------------------------------------
/lesson-30/charts/demo/values-dev.yaml:
--------------------------------------------------------------------------------
1 | replicaCount: 3
2 |
3 | image:
4 | repository: nginx
5 | tag: "1.22.0"
6 |
--------------------------------------------------------------------------------
/lesson-32/README.md:
--------------------------------------------------------------------------------
1 | # AWS Load Balancer Controller
2 |
3 | https://github.com/kubernetes-sigs/aws-load-balancer-controller/
--------------------------------------------------------------------------------
/lesson-15/docker-entrypoint-shell/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM python:3.8.5
2 | COPY server.py /server.py
3 | ENTRYPOINT python3 -u server.py
--------------------------------------------------------------------------------
/lesson-38/k8s/README.md:
--------------------------------------------------------------------------------
1 | ```kubectl get no -L capacityType,topology.kubernetes.io/zone,node.kubernetes.io/instance-type```
2 |
--------------------------------------------------------------------------------
/lesson-15/docker-entrypoint-exec/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM python:3.8.5
2 | COPY server.py /server.py
3 | ENTRYPOINT ["python3","-u", "server.py"]
--------------------------------------------------------------------------------
/lesson-24/k8s/0-namespace.yaml:
--------------------------------------------------------------------------------
1 | kind: Namespace
2 | apiVersion: v1
3 | metadata:
4 | name: demo-irsa
5 | labels:
6 | name: demo-irsa
--------------------------------------------------------------------------------
/lesson-25/k8s/example-4/namespace.yaml:
--------------------------------------------------------------------------------
1 | kind: Namespace
2 | apiVersion: v1
3 | metadata:
4 | name: demo
5 | labels:
6 | name: demo
--------------------------------------------------------------------------------
/lesson-49/repo-examples/app-1/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM python:3.8.5
2 | COPY server.py /server.py
3 | ENTRYPOINT ["python3","-u", "server.py"]
4 |
--------------------------------------------------------------------------------
/lesson-49/repo-examples/app-2/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM python:3.8.5
2 | COPY server.py /server.py
3 | ENTRYPOINT ["python3","-u", "server.py"]
4 |
--------------------------------------------------------------------------------
/lesson-36/k8s/example-3/ns-1.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: Namespace
3 | metadata:
4 | name: example-1
5 | labels:
6 | demo: my-secret
--------------------------------------------------------------------------------
/lesson-36/k8s/example-3/ns-2.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: Namespace
3 | metadata:
4 | name: example-2
5 | labels:
6 | demo: my-secret
--------------------------------------------------------------------------------
/lesson-36/README.md:
--------------------------------------------------------------------------------
1 | # External Secrets Operator
2 |
3 | https://external-secrets.io/
4 |
5 | https://github.com/external-secrets/external-secrets/
--------------------------------------------------------------------------------
/lesson-32/k8s/example-5/README.md:
--------------------------------------------------------------------------------
1 | Certificate Discovery: https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.4/guide/ingress/cert_discovery/
--------------------------------------------------------------------------------
/lesson-39/k8s/example-3/README.md:
--------------------------------------------------------------------------------
1 | export K8S_NODE=ip-10-23-80-243.eu-west-1.compute.internal
2 |
3 | kubectl taint nodes $K8S_NODE gpu=true:NoExecute
4 |
--------------------------------------------------------------------------------
/lesson-34/example-4/README.md:
--------------------------------------------------------------------------------
1 | ```
2 | kubectl create token mysa # kubectl create token --help
3 | ```
4 | ```
5 | kubectl create token mysa --duration=10m
6 | ```
--------------------------------------------------------------------------------
/lesson-35/k8s/charts/app/values.yaml:
--------------------------------------------------------------------------------
1 | hosts:
2 | app1: app-1.example.com
3 | app2: app-2.example.com
4 |
5 | clusterIssuer:
6 | name: cluster-issuer-name
7 |
--------------------------------------------------------------------------------
/lesson-49/terraform/ecr.tf:
--------------------------------------------------------------------------------
1 | resource "aws_ecr_repository" "template" {
2 | name = "demo-app"
3 | image_tag_mutability = "IMMUTABLE"
4 | }
5 |
--------------------------------------------------------------------------------
/lesson-32/k8s/example-2/ns.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: Namespace
3 | metadata:
4 | name: example-2
5 | # labels:
6 | # elbv2.k8s.aws/pod-readiness-gate-inject: enabled
--------------------------------------------------------------------------------
/lesson-44-45-46-47-48/k8s/charts/app/values.yaml:
--------------------------------------------------------------------------------
1 | hosts:
2 | app1: app-1.example.com
3 | app2: app-2.example.com
4 |
5 | clusterIssuer:
6 | name: cluster-issuer-name
7 |
--------------------------------------------------------------------------------
/lesson-35/k8s/charts/app/Chart.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v2
2 | appVersion: 0.1.0
3 | description: A Helm chart for Kubernetes
4 | name: demo-app
5 | type: application
6 | version: 0.1.0
7 |
--------------------------------------------------------------------------------
/lesson-11/externalname-service.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: Service
3 | metadata:
4 | name: external-service
5 | spec:
6 | type: ExternalName
7 | externalName: example.com
8 |
--------------------------------------------------------------------------------
/lesson-15/docker/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM python:3.8.5
2 | COPY server.py /server.py
3 | COPY server-default.py /server-default.py
4 | ENTRYPOINT ["python3","-u", "server.py"]
5 | CMD ["1","5","text"]
--------------------------------------------------------------------------------
/lesson-44-45-46-47-48/k8s/charts/app/Chart.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v2
2 | appVersion: 0.1.0
3 | description: A Helm chart for Kubernetes
4 | name: demo-app
5 | type: application
6 | version: 0.1.0
7 |
--------------------------------------------------------------------------------
/lesson-41/README.md:
--------------------------------------------------------------------------------
1 | # Amazon EBS CSI driver.
2 |
3 | Docs: https://docs.aws.amazon.com/eks/latest/userguide/ebs-csi.html
4 |
5 | GitHub: https://github.com/kubernetes-sigs/aws-ebs-csi-driver
6 |
--------------------------------------------------------------------------------
/lesson-42/README.md:
--------------------------------------------------------------------------------
1 | # Amazon EFS CSI driver.
2 |
3 | Docs: https://docs.aws.amazon.com/eks/latest/userguide/efs-csi.html
4 |
5 | GitHub: https://github.com/kubernetes-sigs/aws-efs-csi-driver
6 |
--------------------------------------------------------------------------------
/lesson-44-45-46-47-48/repo-examples/demo/demo.mp4:
--------------------------------------------------------------------------------
1 | version https://git-lfs.github.com/spec/v1
2 | oid sha256:d6617a009c0c6c9aebf7398d43cad6d1985ddc1b9ab0479e2ea977362b8af5b0
3 | size 17839845
4 |
--------------------------------------------------------------------------------
/lesson-01/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/lesson-02/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/lesson-03/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/lesson-04/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/lesson-05/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/lesson-27/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/lesson-29/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/lesson-32/k8s/example-2/README.md:
--------------------------------------------------------------------------------
1 | ```while true; do sleep 1; curl -H "Host: app-1.kubxr.com" http://domain-name.amazonaws.com; echo " - "$(date); done```
2 |
3 | ```kubectl get pod -o wide -n example-2```
--------------------------------------------------------------------------------
/lesson-42/terraform/templates/efs-csi-values.yaml:
--------------------------------------------------------------------------------
1 | controller:
2 | serviceAccount:
3 | create: true
4 | name: ${sa_name}
5 | annotations:
6 | eks.amazonaws.com/role-arn: ${role_arn}
7 |
--------------------------------------------------------------------------------
/lesson-27/example-1/secret-stringData.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: Secret
3 | metadata:
4 | name: secret-stringdata
5 | type: Opaque
6 | stringData:
7 | username: adminuser
8 | password: Rt2GG#(ERgf09
9 |
--------------------------------------------------------------------------------
/lesson-35/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/lesson-34/example-4/sa-secret.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: Secret
3 | type: kubernetes.io/service-account-token
4 | metadata:
5 | name: mysa-token
6 | annotations:
7 | kubernetes.io/service-account.name: "mysa"
8 |
--------------------------------------------------------------------------------
/lesson-26/example-5/nginx.conf:
--------------------------------------------------------------------------------
1 | server {
2 | listen 80;
3 | access_log /var/log/nginx/reverse-access.log;
4 | error_log /var/log/nginx/reverse-error.log;
5 | location / {
6 | proxy_pass http://example.com;
7 | }
8 | }
--------------------------------------------------------------------------------
/lesson-35/k8s/infrastructure/charts/cert-manager-configs/values.yaml:
--------------------------------------------------------------------------------
1 | acme:
2 | email: example@example.com
3 | dnsZones:
4 | - example.com
5 | route53:
6 | region: us-east-1
7 | hostedZoneID: Z123456789EXAMPLE
8 |
--------------------------------------------------------------------------------
/lesson-36/terraform/versions.tf:
--------------------------------------------------------------------------------
1 | terraform {
2 | required_version = ">= 1.0.2"
3 |
4 | required_providers {
5 | aws = {
6 | source = "hashicorp/aws"
7 | version = ">= 3.72"
8 | }
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/lesson-39/terraform/versions.tf:
--------------------------------------------------------------------------------
1 | terraform {
2 | required_version = ">= 1.0.2"
3 |
4 | required_providers {
5 | aws = {
6 | source = "hashicorp/aws"
7 | version = ">= 3.72"
8 | }
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/lesson-40/terraform/versions.tf:
--------------------------------------------------------------------------------
1 | terraform {
2 | required_version = ">= 1.0.2"
3 |
4 | required_providers {
5 | aws = {
6 | source = "hashicorp/aws"
7 | version = ">= 3.72"
8 | }
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/lesson-23/sc-ebs-csi-example.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: storage.k8s.io/v1
2 | kind: StorageClass
3 | metadata:
4 | name: ebs-csi-gp3
5 | provisioner: ebs.csi.aws.com
6 | allowVolumeExpansion: true
7 | parameters:
8 | type: gp3
9 | fsType: ext4
--------------------------------------------------------------------------------
/lesson-25/k8s/example-4/README.md:
--------------------------------------------------------------------------------
1 | Check allowed domains in cert:
2 |
3 | ```bash
4 | kubectl -n demo get secret app-tls-bakavets -o json | jq -r '.data."tls.crt"' | base64 -d | openssl x509 -dates -noout -text | grep DNS:
5 | ```
6 |
--------------------------------------------------------------------------------
/lesson-44-45-46-47-48/k8s/infrastructure/charts/cert-manager-configs/values.yaml:
--------------------------------------------------------------------------------
1 | acme:
2 | email: example@example.com
3 | dnsZones:
4 | - example.com
5 | route53:
6 | region: us-east-1
7 | hostedZoneID: Z123456789EXAMPLE
8 |
--------------------------------------------------------------------------------
/lesson-06/kuber-pod.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: Pod
3 | metadata:
4 | name: app-kuber-2
5 | spec:
6 | containers:
7 | - name: app-kuber-container
8 | image: bokovets/kuber:0.1
9 | ports:
10 | - containerPort: 8000
11 |
--------------------------------------------------------------------------------
/lesson-41/k8s/example-1/pvc.yaml:
--------------------------------------------------------------------------------
1 | kind: PersistentVolumeClaim
2 | apiVersion: v1
3 | metadata:
4 | name: aws-pvc-kuber
5 | spec:
6 | accessModes:
7 | - ReadWriteOnce
8 | resources:
9 | requests:
10 | storage: 5Gi
11 |
--------------------------------------------------------------------------------
/lesson-30/dev/kuber/svc.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: Service
3 | metadata:
4 | name: kuber-service
5 | spec:
6 | selector:
7 | app: http-server
8 | ports:
9 | - protocol: TCP
10 | port: 80
11 | targetPort: 8000
12 |
--------------------------------------------------------------------------------
/lesson-26/example-4/cm.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: ConfigMap
3 | metadata:
4 | name: demo-cm
5 | data:
6 | INTERVAL: "3"
7 | COUNT: "6"
8 | TEXT_ARG: |
9 | Hello from World!
10 | This is demo config!
11 | As an example.
12 |
--------------------------------------------------------------------------------
/lesson-36/k8s/example-4/sa.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: ServiceAccount
3 | metadata:
4 | name: es-sa
5 | namespace: example
6 | annotations:
7 | eks.amazonaws.com/role-arn: arn:aws:iam::849634744839:role/demo-eks-cluster-external-secrets-role
8 |
--------------------------------------------------------------------------------
/lesson-44-45-46-47-48/repo-examples/agents/.gitlab/agents/agent/config.yaml:
--------------------------------------------------------------------------------
1 | # https://docs.gitlab.com/ee/user/clusters/agent/ci_cd_workflow.html#authorize-the-agent-to-access-your-projects
2 | ci_access:
3 | projects:
4 | - id: root/k8s-manifests
5 |
--------------------------------------------------------------------------------
/lesson-44-45-46-47-48/terraform/modules/s3/versions.tf:
--------------------------------------------------------------------------------
1 | terraform {
2 | required_version = ">= 1.0.2"
3 |
4 | required_providers {
5 | aws = {
6 | source = "hashicorp/aws"
7 | version = ">= 5.2.0"
8 | }
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/lesson-49/k8s/sa-kaniko.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: ServiceAccount
3 | metadata:
4 | name: ci-kaniko
5 | namespace: gitlab-space-external
6 | annotations:
7 | eks.amazonaws.com/role-arn: arn:aws:iam::849634744839:role/demo-eks-cluster-kaniko
8 |
--------------------------------------------------------------------------------
/lesson-44-45-46-47-48/k8s/infrastructure/charts/external-secrets-configs/values.yaml:
--------------------------------------------------------------------------------
1 | serviceAccountRef:
2 | name: external-secrets
3 | namespace: external-secrets
4 | eksRoleArn: arn:aws:iam::123456789123:role/role-name
5 |
6 | aws:
7 | region: eu-west-1
--------------------------------------------------------------------------------
/lesson-49/k8s/gitlab-runner-secret.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: Secret
3 | metadata:
4 | name: gitlab-runner-secret
5 | namespace: gitlab-space-external
6 | type: Opaque
7 | stringData:
8 | runner-registration-token: ""
9 | runner-token: "glrt-*******"
--------------------------------------------------------------------------------
/lesson-44-45-46-47-48/repo-examples/demo/.gitlab-ci.yml:
--------------------------------------------------------------------------------
1 | image: ruby:2.7
2 |
3 | pages:
4 | script:
5 | - gem install bundler
6 | - bundle install
7 | - bundle exec jekyll build -d public
8 | artifacts:
9 | paths:
10 | - public
11 |
--------------------------------------------------------------------------------
/lesson-42/k8s/example-1/pvc.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: PersistentVolumeClaim
3 | metadata:
4 | name: efs-claim
5 | spec:
6 | accessModes:
7 | - ReadWriteMany
8 | storageClassName: ""
9 | resources:
10 | requests:
11 | storage: 5Gi
12 |
--------------------------------------------------------------------------------
/lesson-08/kuber-pod.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: Pod
3 | metadata:
4 | name: kuber-app-manual
5 | labels:
6 | app: kuber-test
7 | spec:
8 | containers:
9 | - name: kuber-app-image
10 | image: bokovets/kuber
11 | ports:
12 | - containerPort: 8000
--------------------------------------------------------------------------------
/lesson-10/clusterip-service.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: Service
3 | metadata:
4 | name: kuber-service
5 | spec:
6 | selector:
7 | app: http-server
8 | ports:
9 | - protocol: TCP
10 | port: 80
11 | targetPort: 8000
12 | type: ClusterIP
13 |
--------------------------------------------------------------------------------
/lesson-11/clusterip-service.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: Service
3 | metadata:
4 | name: kuber-service
5 | spec:
6 | selector:
7 | app: http-server
8 | ports:
9 | - protocol: TCP
10 | port: 80
11 | targetPort: 8000
12 | type: ClusterIP
13 |
--------------------------------------------------------------------------------
/lesson-36/k8s/common/sa.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: ServiceAccount
3 | metadata:
4 | name: external-secrets-sa
5 | namespace: external-secrets
6 | annotations:
7 | eks.amazonaws.com/role-arn: arn:aws:iam::849634744839:role/demo-eks-cluster-external-secrets-role
8 |
--------------------------------------------------------------------------------
/lesson-41/k8s/example-2/pvc.yaml:
--------------------------------------------------------------------------------
1 | kind: PersistentVolumeClaim
2 | apiVersion: v1
3 | metadata:
4 | name: aws-pvc-kuber
5 | spec:
6 | accessModes:
7 | - ReadWriteOnce
8 | storageClassName: ebs-sc
9 | resources:
10 | requests:
11 | storage: 10Gi
12 |
--------------------------------------------------------------------------------
/lesson-43/terraform/templates/tigera-operator-values.yaml:
--------------------------------------------------------------------------------
1 | installation:
2 | enabled: true
3 | kubernetesProvider: EKS
4 | flexVolumePath: None
5 | kubeletVolumePluginPath: None
6 | cni:
7 | type: AmazonVPC
8 |
9 | apiServer:
10 | enabled: true
11 |
--------------------------------------------------------------------------------
/lesson-07/kuber-pod.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: Pod
3 | metadata:
4 | name: app-kuber-2
5 | labels:
6 | app: http-server
7 | spec:
8 | containers:
9 | - name: app-kuber-container
10 | image: bokovets/kuber:0.1
11 | ports:
12 | - containerPort: 8000
--------------------------------------------------------------------------------
/lesson-09/kuber-service.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: Service
3 | metadata:
4 | name: kuber-service
5 | spec:
6 | selector:
7 | app: http-server
8 | ports:
9 | - protocol: TCP
10 | port: 80
11 | targetPort: 8000
12 | type: NodePort
13 |
14 |
--------------------------------------------------------------------------------
/lesson-25/k8s/values-cert-manager.yaml:
--------------------------------------------------------------------------------
1 | installCRDs: true
2 | serviceAccount:
3 | name: cert-manager-route53
4 | annotations:
5 | eks.amazonaws.com/role-arn: arn:aws:iam::849634744839:role/demo-eks-cluster-cert-manager-role
6 | extraArgs:
7 | - --issuer-ambient-credentials
--------------------------------------------------------------------------------
/lesson-32/k8s/albc-values.yaml:
--------------------------------------------------------------------------------
1 | clusterName: demo-eks-cluster
2 | serviceAccount:
3 | create: true
4 | name: aws-load-balancer-controller
5 | annotations:
6 | eks.amazonaws.com/role-arn: "arn:aws:iam::849634744839:role/demo-eks-cluster-load-balancer-controller-role"
7 |
--------------------------------------------------------------------------------
/lesson-42/k8s/example-3/pvc.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: PersistentVolumeClaim
3 | metadata:
4 | name: efs-claim-ap
5 | spec:
6 | accessModes:
7 | - ReadWriteMany
8 | storageClassName: efs-sc-ap
9 | resources:
10 | requests:
11 | storage: 5Gi
12 |
--------------------------------------------------------------------------------
/lesson-24/k8s/1-sa.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: ServiceAccount
3 | metadata:
4 | name: demo
5 | namespace: demo-irsa
6 | labels:
7 | name: demo
8 | annotations:
9 | eks.amazonaws.com/role-arn: arn:aws:iam::849634744839:role/demo-eks-cluster-role
10 |
11 |
12 |
--------------------------------------------------------------------------------
/lesson-43/k8s/example-1/network-policies/default-deny.yaml:
--------------------------------------------------------------------------------
1 | ---
2 | apiVersion: networking.k8s.io/v1
3 | kind: NetworkPolicy
4 | metadata:
5 | name: default-deny
6 | namespace: example-1
7 | spec:
8 | podSelector: {}
9 | policyTypes:
10 | - Ingress
11 | - Egress
12 |
--------------------------------------------------------------------------------
/lesson-43/k8s/example-2/network-policies/default-deny.yaml:
--------------------------------------------------------------------------------
1 | ---
2 | apiVersion: networking.k8s.io/v1
3 | kind: NetworkPolicy
4 | metadata:
5 | name: default-deny
6 | namespace: example-2
7 | spec:
8 | podSelector: {}
9 | policyTypes:
10 | - Ingress
11 | - Egress
12 |
--------------------------------------------------------------------------------
/lesson-25/k8s/example-1/README.md:
--------------------------------------------------------------------------------
1 | Securing Ingress Resources: https://cert-manager.io/docs/usage/ingress/
2 |
3 | Check allowed domains in cert:
4 |
5 | ```bash
6 | kubectl get secret app-tls -o json | jq -r '.data."tls.crt"' | base64 -d | openssl x509 -dates -noout -text | grep DNS:
7 | ```
8 |
--------------------------------------------------------------------------------
/lesson-25/k8s/example-2/certificate.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: cert-manager.io/v1
2 | kind: Certificate
3 | metadata:
4 | name: app-3-cert
5 | spec:
6 | secretName: app-tls-3
7 | dnsNames:
8 | - app-3.kubxr.com
9 | issuerRef:
10 | name: letsencrypt-prod
11 | kind: ClusterIssuer
--------------------------------------------------------------------------------
/lesson-35/k8s/charts/app/templates/svc-2.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: Service
3 | metadata:
4 | name: kuber-service-2
5 | spec:
6 | selector:
7 | app: http-server-2
8 | ports:
9 | - protocol: TCP
10 | port: 80
11 | targetPort: 8000
12 | type: ClusterIP
13 |
--------------------------------------------------------------------------------
/lesson-41/k8s/example-3/pvc.yaml:
--------------------------------------------------------------------------------
1 | kind: PersistentVolumeClaim
2 | apiVersion: v1
3 | metadata:
4 | name: aws-pvc-kuber
5 | spec:
6 | accessModes:
7 | - ReadWriteOnce
8 | storageClassName: ebs-gp3-with-encryption
9 | resources:
10 | requests:
11 | storage: 10Gi
12 |
--------------------------------------------------------------------------------
/lesson-41/k8s/example-4/pvc.yaml:
--------------------------------------------------------------------------------
1 | kind: PersistentVolumeClaim
2 | apiVersion: v1
3 | metadata:
4 | name: aws-pvc-kuber
5 | spec:
6 | accessModes:
7 | - ReadWriteOnce
8 | storageClassName: ebs-gp3-with-custom-kms
9 | resources:
10 | requests:
11 | storage: 7Gi
12 |
--------------------------------------------------------------------------------
/lesson-20/README.md:
--------------------------------------------------------------------------------
1 | 
2 | 
3 |
--------------------------------------------------------------------------------
/lesson-25/k8s/example-2/README.md:
--------------------------------------------------------------------------------
1 | Certificate Resources: https://cert-manager.io/docs/usage/certificate/
2 |
3 | Check allowed domains in cert:
4 |
5 | ```bash
6 | kubectl get secret app-tls-3 -o json | jq -r '.data."tls.crt"' | base64 -d | openssl x509 -dates -noout -text | grep DNS:
7 | ```
8 |
--------------------------------------------------------------------------------
/lesson-25/k8s/example-3/README.md:
--------------------------------------------------------------------------------
1 | Certificate Resources: https://cert-manager.io/docs/usage/certificate/
2 |
3 | Check allowed domains in cert:
4 |
5 | ```bash
6 | kubectl get secret tls-wildcard -o json | jq -r '.data."tls.crt"' | base64 -d | openssl x509 -dates -noout -text | grep DNS:
7 | ```
8 |
--------------------------------------------------------------------------------
/lesson-35/k8s/charts/app/templates/svc-1.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: Service
3 | metadata:
4 | name: kuber-service-1
5 | spec:
6 | selector:
7 | app: http-server-1
8 | ports:
9 | - protocol: TCP
10 | port: 80
11 | targetPort: 8000
12 | type: ClusterIP
13 |
14 |
--------------------------------------------------------------------------------
/lesson-44-45-46-47-48/terraform/modules/s3/variables.tf:
--------------------------------------------------------------------------------
1 | variable "deployment_prefix" {
2 | description = "Prefix of the deployment"
3 | type = string
4 | }
5 |
6 | variable "deployment_suffix" {
7 | description = "Suffix of the deployment"
8 | type = string
9 | }
10 |
--------------------------------------------------------------------------------
/lesson-19/0-job.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: batch/v1
2 | kind: Job
3 | metadata:
4 | name: pi
5 | spec:
6 | template:
7 | spec:
8 | containers:
9 | - name: pi
10 | image: perl
11 | command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
12 | restartPolicy: Never
--------------------------------------------------------------------------------
/lesson-44-45-46-47-48/k8s/charts/app/templates/svc-2.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: Service
3 | metadata:
4 | name: kuber-service-2
5 | spec:
6 | selector:
7 | app: http-server-2
8 | ports:
9 | - protocol: TCP
10 | port: 80
11 | targetPort: 8000
12 | type: ClusterIP
13 |
--------------------------------------------------------------------------------
/lesson-24/k8s/README.md:
--------------------------------------------------------------------------------
1 | Returns details about the IAM user or role whose credentials are used to call the operation.
2 |
3 | ```bash
4 | aws sts get-caller-identity
5 | ```
6 |
7 | Describes the specified volume:
8 |
9 | ```bash
10 | aws ec2 describe-volumes --volume-ids vol-081234fdsgf3242
11 | ```
--------------------------------------------------------------------------------
/lesson-44-45-46-47-48/k8s/charts/app/templates/svc-1.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: Service
3 | metadata:
4 | name: kuber-service-1
5 | spec:
6 | selector:
7 | app: http-server-1
8 | ports:
9 | - protocol: TCP
10 | port: 80
11 | targetPort: 8000
12 | type: ClusterIP
13 |
14 |
--------------------------------------------------------------------------------
/lesson-44-45-46-47-48/repo-examples/demo/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Home
5 |
6 |
7 |
8 | Hello World!
9 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/lesson-44-45-46-47-48/terraform/modules/s3/outputs.tf:
--------------------------------------------------------------------------------
1 | output "s3_bucket_arn" {
2 | value = aws_s3_bucket.bucket.arn
3 | description = "AWS S3 Bucket ARN."
4 | }
5 |
6 | output "s3_bucket_id" {
7 | value = aws_s3_bucket.bucket.id
8 | description = "AWS S3 Bucket name."
9 | }
10 |
--------------------------------------------------------------------------------
/lesson-11/headless-clusterip-service.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: Service
3 | metadata:
4 | name: kuber-headless-service
5 | spec:
6 | clusterIP: None
7 | selector:
8 | app: http-server
9 | ports:
10 | - protocol: TCP
11 | port: 80
12 | targetPort: 8000
13 | type: ClusterIP
14 |
--------------------------------------------------------------------------------
/lesson-11/lb-service.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: Service
3 | metadata:
4 | name: kuber-service-lb
5 | spec:
6 | externalTrafficPolicy: Local
7 | selector:
8 | app: http-server
9 | ports:
10 | - protocol: TCP
11 | port: 80
12 | targetPort: 8000
13 | type: LoadBalancer
14 |
15 |
--------------------------------------------------------------------------------
/lesson-41/k8s/example-2/storageclass.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: storage.k8s.io/v1
2 | kind: StorageClass
3 | metadata:
4 | name: ebs-sc
5 | provisioner: ebs.csi.aws.com
6 | volumeBindingMode: WaitForFirstConsumer
7 | allowVolumeExpansion: true
8 | parameters:
9 | csi.storage.k8s.io/fstype: ext4
10 | type: gp3
11 |
--------------------------------------------------------------------------------
/lesson-25/k8s/example-3/wildcard-certificate.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: cert-manager.io/v1
2 | kind: Certificate
3 | metadata:
4 | name: wildcard-cert
5 | spec:
6 | secretName: tls-wildcard
7 | dnsNames:
8 | - kubxr.com
9 | - '*.kubxr.com'
10 | issuerRef:
11 | name: letsencrypt-prod
12 | kind: ClusterIssuer
--------------------------------------------------------------------------------
/lesson-30/README.md:
--------------------------------------------------------------------------------
1 | # ArgoCD
2 |
3 | [ArgoCD GitHub](https://github.com/argoproj/argo-cd)
4 |
5 | [Getting Started](https://argo-cd.readthedocs.io/en/stable/getting_started/)
6 |
7 | [Multiple configuration objects](https://argo-cd.readthedocs.io/en/stable/operator-manual/declarative-setup/#multiple-configuration-objects)
8 |
--------------------------------------------------------------------------------
/lesson-37/terraform/versions.tf:
--------------------------------------------------------------------------------
1 | terraform {
2 | required_version = ">= 1.0.2"
3 |
4 | required_providers {
5 | aws = {
6 | source = "hashicorp/aws"
7 | version = ">= 3.72"
8 | }
9 | helm = {
10 | source = "hashicorp/helm"
11 | version = ">= 2.4"
12 | }
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/lesson-38/terraform/versions.tf:
--------------------------------------------------------------------------------
1 | terraform {
2 | required_version = ">= 1.0.2"
3 |
4 | required_providers {
5 | aws = {
6 | source = "hashicorp/aws"
7 | version = ">= 3.72"
8 | }
9 | helm = {
10 | source = "hashicorp/helm"
11 | version = ">= 2.4"
12 | }
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/lesson-41/terraform/versions.tf:
--------------------------------------------------------------------------------
1 | terraform {
2 | required_version = ">= 1.0.2"
3 |
4 | required_providers {
5 | aws = {
6 | source = "hashicorp/aws"
7 | version = ">= 3.72"
8 | }
9 | helm = {
10 | source = "hashicorp/helm"
11 | version = ">= 2.4"
12 | }
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/lesson-42/terraform/versions.tf:
--------------------------------------------------------------------------------
1 | terraform {
2 | required_version = ">= 1.0.2"
3 |
4 | required_providers {
5 | aws = {
6 | source = "hashicorp/aws"
7 | version = ">= 3.72"
8 | }
9 | helm = {
10 | source = "hashicorp/helm"
11 | version = ">= 2.4"
12 | }
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/lesson-07/kuber-pod-with-gpu.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: Pod
3 | metadata:
4 | name: app-kuber-with-gpu
5 | labels:
6 | app: http-server
7 | spec:
8 | nodeSelector:
9 | gpu: "true"
10 | containers:
11 | - name: app-kuber-container
12 | image: bokovets/kuber:0.1
13 | ports:
14 | - containerPort: 8000
--------------------------------------------------------------------------------
/lesson-49/terraform/versions.tf:
--------------------------------------------------------------------------------
1 | terraform {
2 | required_version = ">= 1.0.2"
3 |
4 | required_providers {
5 | aws = {
6 | source = "hashicorp/aws"
7 | version = ">= 3.72"
8 | }
9 | kubernetes = {
10 | source = "hashicorp/kubernetes"
11 | version = ">= 2.10"
12 | }
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/lesson-07/kuber-pod-with-labels.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: Pod
3 | metadata:
4 | name: app-kuber-with-labels
5 | labels:
6 | environment: dev
7 | app: http-server
8 | spec:
9 | containers:
10 | - name: app-kuber-container
11 | image: bokovets/kuber:0.1
12 | ports:
13 | - containerPort: 8000
14 |
15 |
--------------------------------------------------------------------------------
/lesson-27/example-3/ssh-auth.yaml:
--------------------------------------------------------------------------------
1 | # Ref: https://kubernetes.io/docs/concepts/configuration/secret/#ssh-authentication-secrets
2 | apiVersion: v1
3 | kind: Secret
4 | metadata:
5 | name: secret-ssh-auth
6 | type: kubernetes.io/ssh-auth
7 | stringData:
8 | # the data is abbreviated in this example
9 | ssh-privatekey: |
10 | test
11 |
--------------------------------------------------------------------------------
/lesson-44-45-46-47-48/k8s/infrastructure/charts/external-secrets-configs/templates/sa.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: ServiceAccount
3 | metadata:
4 | name: {{ .Values.serviceAccountRef.name }}
5 | namespace: {{ .Values.serviceAccountRef.namespace }}
6 | annotations:
7 | eks.amazonaws.com/role-arn: {{ .Values.serviceAccountRef.eksRoleArn }}
8 |
--------------------------------------------------------------------------------
/lesson-19/7-job-with-ttl.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: batch/v1
2 | kind: Job
3 | metadata:
4 | name: pi-with-ttl
5 | spec:
6 | ttlSecondsAfterFinished: 30
7 | template:
8 | spec:
9 | containers:
10 | - name: pi
11 | image: perl
12 | command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
13 | restartPolicy: Never
--------------------------------------------------------------------------------
/lesson-41/k8s/example-3/storageclass.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: storage.k8s.io/v1
2 | kind: StorageClass
3 | metadata:
4 | name: ebs-gp3-with-encryption
5 | provisioner: ebs.csi.aws.com
6 | volumeBindingMode: WaitForFirstConsumer
7 | allowVolumeExpansion: true
8 | parameters:
9 | csi.storage.k8s.io/fstype: ext4
10 | type: gp3
11 | encrypted: "true"
12 |
--------------------------------------------------------------------------------
/lesson-43/README.md:
--------------------------------------------------------------------------------
1 | # Kubernetes Network Policies.
2 |
3 | ## Docs:
4 |
5 | * https://kubernetes.io/docs/concepts/services-networking/network-policies/
6 | * https://docs.aws.amazon.com/eks/latest/userguide/calico.html
7 | * https://aws.github.io/aws-eks-best-practices/security/docs/iam/#restrict-access-to-the-instance-profile-assigned-to-the-worker-node
8 |
--------------------------------------------------------------------------------
/lesson-19/3-job-completions.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: batch/v1
2 | kind: Job
3 | metadata:
4 | name: pi-completions
5 | spec:
6 | completions: 3
7 | backoffLimit: 4
8 | template:
9 | spec:
10 | containers:
11 | - name: pi
12 | image: perl
13 | command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
14 | restartPolicy: Never
--------------------------------------------------------------------------------
/lesson-26/example-3/cm.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: ConfigMap
3 | metadata:
4 | name: demo-cm
5 | data:
6 | # property-like keys; each key maps to a simple value
7 | interval: "5"
8 | count: "3"
9 | # file-like keys
10 | properties: |
11 | Hello from World!
12 | This is demo config!
13 | As an example.
14 | config.ini: "This is demo config!"
--------------------------------------------------------------------------------
/lesson-37/README.md:
--------------------------------------------------------------------------------
1 | # Loki: like Prometheus, but for logs.
2 |
3 | Website: https://grafana.com/loki
4 |
5 | GitHub: https://github.com/grafana/loki
6 |
7 | Components: https://grafana.com/docs/loki/latest/fundamentals/architecture/components/
8 |
9 | Deployment modes: https://grafana.com/docs/loki/latest/fundamentals/architecture/deployment-modes/
10 |
11 |
--------------------------------------------------------------------------------
/lesson-10/endpoints-service.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: Service
3 | metadata:
4 | name: endpoints-service
5 | spec:
6 | ports:
7 | - port: 80
8 | ---
9 | apiVersion: v1
10 | kind: Endpoints
11 | metadata:
12 | name: endpoints-service
13 | subsets:
14 | - addresses:
15 | - ip: 10.75.21.169
16 | - ip: 10.75.22.141
17 | ports:
18 | - port: 8000
--------------------------------------------------------------------------------
/lesson-19/4-job-parallelism.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: batch/v1
2 | kind: Job
3 | metadata:
4 | name: pi-parallelism
5 | spec:
6 | parallelism: 2
7 | backoffLimit: 4
8 | template:
9 | spec:
10 | containers:
11 | - name: pi
12 | image: perl
13 | command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
14 | restartPolicy: OnFailure
--------------------------------------------------------------------------------
/lesson-27/example-1/secret-data.yaml:
--------------------------------------------------------------------------------
1 | # echo -n 'adminuser' | base64
2 | # echo -n 'Rt2GG#(ERgf09' | base64
3 | apiVersion: v1
4 | kind: Secret
5 | metadata:
6 | name: secret-data
7 | type: Opaque
8 | data:
9 | username: YWRtaW51c2Vy
10 | password: UnQyR0cjKEVSZ2YwOQ==
11 | # echo -n 'YWRtaW51c2Vy' | base64 --decode
12 | # echo -n 'UnQyR0cjKEVSZ2YwOQ==' | base64 --decode
--------------------------------------------------------------------------------
/lesson-27/example-2/secret-data.yaml:
--------------------------------------------------------------------------------
1 | # echo -n 'adminuser' | base64
2 | # echo -n 'Rt2GG#(ERgf09' | base64
3 | apiVersion: v1
4 | kind: Secret
5 | metadata:
6 | name: secret-data
7 | type: Opaque
8 | data:
9 | username: YWRtaW51c2Vy
10 | password: UnQyR0cjKEVSZ2YwOQ==
11 | # echo -n 'YWRtaW51c2Vy' | base64 --decode
12 | # echo -n 'UnQyR0cjKEVSZ2YwOQ==' | base64 --decode
--------------------------------------------------------------------------------
/lesson-36/k8s/example-4/ss-parameter-store.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: external-secrets.io/v1beta1
2 | kind: SecretStore
3 | metadata:
4 | name: aws-ps-ns
5 | namespace: example
6 | spec:
7 | provider:
8 | aws:
9 | service: ParameterStore
10 | region: eu-west-1
11 | auth:
12 | jwt:
13 | serviceAccountRef:
14 | name: es-sa
15 |
--------------------------------------------------------------------------------
/lesson-44-45-46-47-48/k8s/gitlab/storageclass.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: storage.k8s.io/v1
2 | kind: StorageClass
3 | metadata:
4 | name: gp3-encrypted
5 | provisioner: ebs.csi.aws.com
6 | volumeBindingMode: WaitForFirstConsumer
7 | allowVolumeExpansion: true
8 | reclaimPolicy: Retain
9 | parameters:
10 | csi.storage.k8s.io/fstype: ext4
11 | type: gp3
12 | encrypted: "true"
13 |
--------------------------------------------------------------------------------
/lesson-23/1-pvc-kuber.yaml:
--------------------------------------------------------------------------------
1 | # https://kubernetes.io/docs/reference/kubernetes-api/config-and-storage-resources/persistent-volume-claim-v1/
2 | kind: PersistentVolumeClaim
3 | apiVersion: v1
4 | metadata:
5 | name: aws-pvc-kuber-1
6 | spec:
7 | storageClassName: "custom-gp2"
8 | accessModes:
9 | - ReadWriteOnce
10 | resources:
11 | requests:
12 | storage: 4Gi
--------------------------------------------------------------------------------
/lesson-44-45-46-47-48/terraform/modules/s3/main.tf:
--------------------------------------------------------------------------------
1 | resource "aws_s3_bucket" "bucket" {
2 | bucket = "${var.deployment_prefix}-${var.deployment_suffix}"
3 | tags = {
4 | "Name" = "${var.deployment_prefix}-${var.deployment_suffix}"
5 | "Type" = "Storage Service"
6 | "Description" = "Store data for deployment related to ${var.deployment_suffix}"
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/lesson-19/2-job-never.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: batch/v1
2 | kind: Job
3 | metadata:
4 | name: job-with-restartpolicy-never
5 | spec:
6 | backoffLimit: 3
7 | template:
8 | spec:
9 | containers:
10 | - name: job-with-failure
11 | image: busybox
12 | command: ["/bin/sh", "-c"]
13 | args: ["echo 'Running Job'; sleep 5; exit 1"]
14 | restartPolicy: Never
--------------------------------------------------------------------------------
/lesson-27/example-3/tls.yaml:
--------------------------------------------------------------------------------
1 | # Ref: https://kubernetes.io/docs/concepts/configuration/secret/#tls-secrets
2 | apiVersion: v1
3 | kind: Secret
4 | metadata:
5 | name: secret-tls
6 | type: kubernetes.io/tls
7 | stringData:
8 | # the data is abbreviated in this example
9 | tls.crt: |
10 | MIIC2DCCAcCgAwIBAgIBATANBgkqh
11 | tls.key: |
12 | MIIEpgIBAAKCAQEA7yn3bRHQ5FHMQ
13 |
--------------------------------------------------------------------------------
/lesson-08/rs-kuber.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: ReplicaSet
3 | metadata:
4 | name: kuber-rs-1
5 | labels:
6 | app: kuber-rs
7 | spec:
8 | replicas: 3
9 | selector:
10 | matchLabels:
11 | env: dev
12 | template:
13 | metadata:
14 | labels:
15 | env: dev
16 | spec:
17 | containers:
18 | - name: kuber-app
19 | image: bokovets/kuber
--------------------------------------------------------------------------------
/lesson-11/nodeport-service.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: Service
3 | metadata:
4 | name: kuber-service-nodeport
5 | spec:
6 | externalTrafficPolicy: Local
7 | # sessionAffinity: ClientIP
8 | selector:
9 | app: http-server
10 | ports:
11 | - protocol: TCP
12 | port: 80
13 | targetPort: 8000
14 | nodePort: 30080 # port-range: 30000-32767
15 | type: NodePort
16 |
17 |
--------------------------------------------------------------------------------
/lesson-19/1-job-onfailure.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: batch/v1
2 | kind: Job
3 | metadata:
4 | name: job-with-restartpolicy-onfailure
5 | spec:
6 | backoffLimit: 3
7 | template:
8 | spec:
9 | containers:
10 | - name: job-with-failure
11 | image: busybox
12 | command: ["/bin/sh", "-c"]
13 | args: ["echo 'Running Job'; sleep 5; exit 1"]
14 | restartPolicy: OnFailure
--------------------------------------------------------------------------------
/lesson-36/k8s/README.md:
--------------------------------------------------------------------------------
1 | Install External Secrets using Helm:
2 |
3 | ```helm repo add external-secrets https://charts.external-secrets.io```
4 |
5 | ```helm repo update external-secrets```
6 |
7 | ```helm search repo external-secrets/external-secrets```
8 |
9 | ```helm upgrade --install external-secrets external-secrets/external-secrets --version 0.6.0 -n external-secrets --create-namespace```
10 |
--------------------------------------------------------------------------------
/lesson-43/k8s/example-3/network-policies/allow-metadata-access.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: networking.k8s.io/v1
2 | kind: NetworkPolicy
3 | metadata:
4 | name: allow-metadata-access
5 | namespace: example-3
6 | spec:
7 | podSelector:
8 | matchLabels:
9 | app: myapp
10 | policyTypes:
11 | - Egress
12 | egress:
13 | - to:
14 | - ipBlock:
15 | cidr: 169.254.169.254/32
16 |
--------------------------------------------------------------------------------
/lesson-44-45-46-47-48/k8s/gitlab/pages-wildcard-cert.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: cert-manager.io/v1
2 | kind: Certificate
3 | metadata:
4 | name: gitlab-pages-wildcard-cert
5 | namespace: gitlab
6 | spec:
7 | secretName: gitlab-pages-tls-wildcard
8 | dnsNames:
9 | - gitlab-pg.kubxr.com
10 | - '*.gitlab-pg.kubxr.com'
11 | issuerRef:
12 | name: letsencrypt-prod
13 | kind: ClusterIssuer
14 |
--------------------------------------------------------------------------------
/lesson-19/5-job-parallelism-completions.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: batch/v1
2 | kind: Job
3 | metadata:
4 | name: pi-parallelism-completions
5 | spec:
6 | parallelism: 3
7 | completions: 7
8 | backoffLimit: 4
9 | template:
10 | spec:
11 | containers:
12 | - name: pi
13 | image: perl
14 | command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
15 | restartPolicy: Never
--------------------------------------------------------------------------------
/lesson-27/example-3/basic-auth.yaml:
--------------------------------------------------------------------------------
1 | # Ref: https://kubernetes.io/docs/concepts/configuration/secret/#basic-authentication-secret
2 | apiVersion: v1
3 | kind: Secret
4 | metadata:
5 | name: secret-basic-auth
6 | type: kubernetes.io/basic-auth
7 | stringData:
8 | username: admin # required field for kubernetes.io/basic-auth
9 | password: t0p-Secret # required field for kubernetes.io/basic-auth
10 |
--------------------------------------------------------------------------------
/lesson-35/k8s/development/values.yaml:
--------------------------------------------------------------------------------
1 | spec:
2 | destination:
3 | server: https://kubernetes.default.svc
4 |
5 | source:
6 | repoURL: git@gitlab.com:example/example.git
7 | targetRevision: main
8 | path: k8s/charts/test-app/
9 |
10 | appHosts:
11 | app1: app-1.example.com
12 | app2: app-2.example.com
13 |
14 | clusterIssuer:
15 | name: letsencrypt-prod
16 |
17 | namespace: demo-app
18 |
--------------------------------------------------------------------------------
/lesson-42/k8s/example-3/storageclass.yaml:
--------------------------------------------------------------------------------
1 | kind: StorageClass
2 | apiVersion: storage.k8s.io/v1
3 | metadata:
4 | name: efs-sc-ap
5 | provisioner: efs.csi.aws.com
6 | parameters:
7 | provisioningMode: efs-ap
8 | fileSystemId: fs-091a417a0a5e4fd14
9 | directoryPerms: "700"
10 | gidRangeStart: "1000" # optional
11 | gidRangeEnd: "2000" # optional
12 | basePath: "/dynamic_provisioning" # optional
13 |
--------------------------------------------------------------------------------
/lesson-43/k8s/example-3/network-policies/deny-metadata-access.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: networking.k8s.io/v1
2 | kind: NetworkPolicy
3 | metadata:
4 | name: deny-metadata-access
5 | namespace: example-3
6 | spec:
7 | podSelector: {}
8 | policyTypes:
9 | - Egress
10 | egress:
11 | - to:
12 | - ipBlock:
13 | cidr: 0.0.0.0/0
14 | except:
15 | - 169.254.169.254/32
16 |
--------------------------------------------------------------------------------
/lesson-30/charts/demo/templates/serviceaccount.yaml:
--------------------------------------------------------------------------------
1 | {{- if .Values.serviceAccount.create -}}
2 | apiVersion: v1
3 | kind: ServiceAccount
4 | metadata:
5 | name: {{ include "demo.serviceAccountName" . }}
6 | labels:
7 | {{- include "demo.labels" . | nindent 4 }}
8 | {{- with .Values.serviceAccount.annotations }}
9 | annotations:
10 | {{- toYaml . | nindent 4 }}
11 | {{- end }}
12 | {{- end }}
13 |
--------------------------------------------------------------------------------
/lesson-42/k8s/example-1/pv.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: PersistentVolume
3 | metadata:
4 | name: efs-pv
5 | spec:
6 | capacity:
7 | storage: 5Gi
8 | volumeMode: Filesystem
9 | accessModes:
10 | - ReadWriteMany
11 | - ReadWriteOnce
12 | storageClassName: ""
13 | persistentVolumeReclaimPolicy: Retain
14 | csi:
15 | driver: efs.csi.aws.com
16 | volumeHandle: fs-091a417a0a5e4fd14
17 |
--------------------------------------------------------------------------------
/lesson-19/6-job-with-timeout.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: batch/v1
2 | kind: Job
3 | metadata:
4 | name: job-with-failure
5 | spec:
6 | backoffLimit: 4
7 | activeDeadlineSeconds: 50
8 | template:
9 | spec:
10 | containers:
11 | - name: job-with-failure
12 | image: busybox
13 | command: ["/bin/sh", "-c"]
14 | args: ["echo 'Running Job'; sleep 5; exit 1"]
15 | restartPolicy: Never
--------------------------------------------------------------------------------
/lesson-36/k8s/common/css-parameter-store.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: external-secrets.io/v1beta1
2 | kind: ClusterSecretStore
3 | metadata:
4 | name: aws-parameter-store
5 | spec:
6 | provider:
7 | aws:
8 | service: ParameterStore
9 | region: eu-west-1
10 | auth:
11 | jwt:
12 | serviceAccountRef:
13 | name: external-secrets-sa
14 | namespace: external-secrets
15 |
--------------------------------------------------------------------------------
/lesson-36/k8s/common/css-secrets-manager.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: external-secrets.io/v1beta1
2 | kind: ClusterSecretStore
3 | metadata:
4 | name: aws-secrets-manager
5 | spec:
6 | provider:
7 | aws:
8 | service: SecretsManager
9 | region: eu-west-1
10 | auth:
11 | jwt:
12 | serviceAccountRef:
13 | name: external-secrets-sa
14 | namespace: external-secrets
15 |
--------------------------------------------------------------------------------
/lesson-44-45-46-47-48/k8s/development/values.yaml:
--------------------------------------------------------------------------------
1 | spec:
2 | destination:
3 | server: https://kubernetes.default.svc
4 |
5 | source:
6 | repoURL: git@gitlab.com:example/example.git
7 | targetRevision: main
8 | path: k8s/charts/test-app/
9 |
10 | appHosts:
11 | app1: app-1.example.com
12 | app2: app-2.example.com
13 |
14 | clusterIssuer:
15 | name: letsencrypt-prod
16 |
17 | namespace: demo-app
18 |
--------------------------------------------------------------------------------
/lesson-43/terraform/versions.tf:
--------------------------------------------------------------------------------
1 | terraform {
2 | required_version = ">= 1.0.2"
3 |
4 | required_providers {
5 | aws = {
6 | source = "hashicorp/aws"
7 | version = ">= 4.47"
8 | }
9 | helm = {
10 | source = "hashicorp/helm"
11 | version = ">= 2.4"
12 | }
13 | kubernetes = {
14 | source = "hashicorp/kubernetes"
15 | version = ">= 2.10"
16 | }
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/lesson-08/rc-kuber.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: ReplicationController
3 | metadata:
4 | name: kuber-rc
5 | spec:
6 | replicas: 3
7 | selector:
8 | app: http-server
9 | template:
10 | metadata:
11 | name: kuber-app
12 | labels:
13 | app: http-server
14 | spec:
15 | containers:
16 | - name: http-server-image
17 | image: bokovets/kuber
18 | ports:
19 | - containerPort: 8000
--------------------------------------------------------------------------------
/lesson-23/0-pvc-kuber.yaml:
--------------------------------------------------------------------------------
1 | # https://kubernetes.io/docs/reference/kubernetes-api/config-and-storage-resources/persistent-volume-claim-v1/
2 | kind: PersistentVolumeClaim
3 | apiVersion: v1
4 | metadata:
5 | name: aws-pvc-kuber
6 | spec:
7 | storageClassName: "" # Empty string must be explicitly set otherwise default StorageClass will be set
8 | accessModes:
9 | - ReadWriteOnce
10 | resources:
11 | requests:
12 | storage: 3Gi
--------------------------------------------------------------------------------
/lesson-41/k8s/example-4/storageclass.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: storage.k8s.io/v1
2 | kind: StorageClass
3 | metadata:
4 | name: ebs-gp3-with-custom-kms
5 | provisioner: ebs.csi.aws.com
6 | volumeBindingMode: WaitForFirstConsumer
7 | allowVolumeExpansion: true
8 | parameters:
9 | csi.storage.k8s.io/fstype: ext4
10 | type: gp3
11 | encrypted: "true"
12 | kmsKeyId: "arn:aws:kms:eu-west-1:849634744839:key/dcf49252-39b4-4469-bff0-ca3e1e8643de"
13 |
--------------------------------------------------------------------------------
/lesson-21-22/2-hostPath-volume.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: Pod
3 | metadata:
4 | name: test-pd
5 | spec:
6 | containers:
7 | - image: bakavets/kuber
8 | name: test-container
9 | volumeMounts:
10 | - mountPath: /test-pd
11 | name: test-volume
12 | volumes:
13 | - name: test-volume
14 | hostPath:
15 | # directory location on host
16 | path: /data
17 | # this field is optional
18 | type: Directory
--------------------------------------------------------------------------------
/lesson-21-22/3-awsElasticBlockStore.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: Pod
3 | metadata:
4 | name: http-server
5 | spec:
6 | containers:
7 | - image: bakavets/kuber
8 | name: http-server
9 | volumeMounts:
10 | - mountPath: /cache
11 | name: aws-volume
12 | volumes:
13 | - name: aws-volume
14 | # This AWS EBS volume must already exist.
15 | awsElasticBlockStore:
16 | volumeID: "vol-0111111111111"
17 | fsType: ext4
--------------------------------------------------------------------------------
/lesson-27/example-3/README.md:
--------------------------------------------------------------------------------
1 | ### Create a Secret for accessing a container image registry:
2 |
3 | ```bash
4 | kubectl create secret docker-registry secret-docker-registry \
5 | --docker-email=bakavets.com@gmail.com \
6 | --docker-username=bakavets \
7 | --docker-password=password \
8 | --docker-server=https://index.docker.io/v1/
9 | ```
10 | Ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
11 |
12 |
--------------------------------------------------------------------------------
/lesson-24/k8s/3-deploy-awscli-default.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: aws-cli-deployment
5 | spec:
6 | selector:
7 | matchLabels:
8 | app: aws-cli
9 | replicas: 1
10 | template:
11 | metadata:
12 | labels:
13 | app: aws-cli
14 | spec:
15 | containers:
16 | - name: aws-cli
17 | image: amazon/aws-cli
18 | command: ["/bin/sh", "-c", "sleep 100000000"]
19 |
--------------------------------------------------------------------------------
/lesson-30/charts/demo/templates/service.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: Service
3 | metadata:
4 | name: {{ include "demo.fullname" . }}
5 | labels:
6 | {{- include "demo.labels" . | nindent 4 }}
7 | spec:
8 | type: {{ .Values.service.type }}
9 | ports:
10 | - port: {{ .Values.service.port }}
11 | targetPort: http
12 | protocol: TCP
13 | name: http
14 | selector:
15 | {{- include "demo.selectorLabels" . | nindent 4 }}
16 |
--------------------------------------------------------------------------------
/lesson-41/terraform/kms.tf:
--------------------------------------------------------------------------------
1 | ################################################################################
2 | # AWS KMS Key
3 | ################################################################################
4 |
5 | resource "aws_kms_key" "kms" {
6 | description = "AWS KMS key used to encrypt AWS resources."
7 | key_usage = "ENCRYPT_DECRYPT"
8 | customer_master_key_spec = "SYMMETRIC_DEFAULT"
9 | deletion_window_in_days = 7
10 | }
11 |
--------------------------------------------------------------------------------
/lesson-42/terraform/kms.tf:
--------------------------------------------------------------------------------
1 | ################################################################################
2 | # AWS KMS Key
3 | ################################################################################
4 |
5 | resource "aws_kms_key" "kms" {
6 | description = "AWS KMS key used to encrypt AWS resources."
7 | key_usage = "ENCRYPT_DECRYPT"
8 | customer_master_key_spec = "SYMMETRIC_DEFAULT"
9 | deletion_window_in_days = 7
10 | }
11 |
--------------------------------------------------------------------------------
/lesson-43/k8s/example-3/deploy-app.yaml:
--------------------------------------------------------------------------------
1 | ---
2 | apiVersion: apps/v1
3 | kind: Deployment
4 | metadata:
5 | name: myapp
6 | namespace: example-3
7 | spec:
8 | selector:
9 | matchLabels:
10 | app: myapp
11 | replicas: 1
12 | template:
13 | metadata:
14 | labels:
15 | app: myapp
16 | spec:
17 | containers:
18 | - name: aws-cli
19 | image: amazon/aws-cli
20 | command: ["/bin/sh", "-c", "sleep 100000000"]
21 |
--------------------------------------------------------------------------------
/lesson-44-45-46-47-48/repo-examples/demo-cache/.gitlab-ci.yml:
--------------------------------------------------------------------------------
1 | job1:
2 | script:
3 | - ls -la
4 | - echo $(date) >> date.txt
5 | - ls -la
6 | cache: &global_cache
7 | paths:
8 | - date.txt
9 | policy: pull-push
10 |
11 | job2:
12 | needs: ["job1"]
13 | script:
14 | - ls -la
15 | - cat date.txt
16 | cache:
17 | # inherit all global cache settings
18 | <<: *global_cache
19 | # override the policy
20 | policy: pull
21 |
--------------------------------------------------------------------------------
/lesson-30/argocd/README.md:
--------------------------------------------------------------------------------
1 | ## Install Argo CD
2 |
3 | ```kubectl create namespace argocd```
4 |
5 | ```kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml```
6 |
7 | ## Access The Argo CD API Server
8 |
9 | ```kubectl port-forward svc/argocd-server -n argocd 8080:443```
10 |
11 | ## Login Using The CLI
12 |
13 | ```kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d; echo```
--------------------------------------------------------------------------------
/lesson-30/charts/demo/.helmignore:
--------------------------------------------------------------------------------
1 | # Patterns to ignore when building packages.
2 | # This supports shell glob matching, relative path matching, and
3 | # negation (prefixed with !). Only one pattern per line.
4 | .DS_Store
5 | # Common VCS dirs
6 | .git/
7 | .gitignore
8 | .bzr/
9 | .bzrignore
10 | .hg/
11 | .hgignore
12 | .svn/
13 | # Common backup files
14 | *.swp
15 | *.bak
16 | *.tmp
17 | *.orig
18 | *~
19 | # Various IDEs
20 | .project
21 | .idea/
22 | *.tmproj
23 | .vscode/
24 |
--------------------------------------------------------------------------------
/lesson-30/dev/kuber/deploy.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: kuber-2
5 | labels:
6 | app: kuber
7 | spec:
8 | replicas: 2
9 | selector:
10 | matchLabels:
11 | app: http-server
12 | template:
13 | metadata:
14 | labels:
15 | app: http-server
16 | spec:
17 | containers:
18 | - name: kuber-app
19 | image: bakavets/kuber:v1.0
20 | ports:
21 | - containerPort: 8000
22 |
--------------------------------------------------------------------------------
/lesson-35/k8s/charts/app/.helmignore:
--------------------------------------------------------------------------------
1 | # Patterns to ignore when building packages.
2 | # This supports shell glob matching, relative path matching, and
3 | # negation (prefixed with !). Only one pattern per line.
4 | .DS_Store
5 | # Common VCS dirs
6 | .git/
7 | .gitignore
8 | .bzr/
9 | .bzrignore
10 | .hg/
11 | .hgignore
12 | .svn/
13 | # Common backup files
14 | *.swp
15 | *.bak
16 | *.tmp
17 | *.orig
18 | *~
19 | # Various IDEs
20 | .project
21 | .idea/
22 | *.tmproj
23 | .vscode/
24 |
--------------------------------------------------------------------------------
/lesson-35/k8s/development/.helmignore:
--------------------------------------------------------------------------------
1 | # Patterns to ignore when building packages.
2 | # This supports shell glob matching, relative path matching, and
3 | # negation (prefixed with !). Only one pattern per line.
4 | .DS_Store
5 | # Common VCS dirs
6 | .git/
7 | .gitignore
8 | .bzr/
9 | .bzrignore
10 | .hg/
11 | .hgignore
12 | .svn/
13 | # Common backup files
14 | *.swp
15 | *.bak
16 | *.tmp
17 | *.orig
18 | *~
19 | # Various IDEs
20 | .project
21 | .idea/
22 | *.tmproj
23 | .vscode/
24 |
--------------------------------------------------------------------------------
/lesson-39/k8s/example-2/README.md:
--------------------------------------------------------------------------------
1 | export K8S_NODE=ip-10-23-56-192.eu-west-1.compute.internal
2 |
3 | kubectl taint nodes $K8S_NODE node.k8s/app-role=api:PreferNoSchedule
4 |
5 | kubectl taint nodes $K8S_NODE gpu=true:NoSchedule
6 |
7 | # Remove from node '$K8S_NODE' the taint with key 'node.k8s/app-role' and effect 'PreferNoSchedule' if one exists
8 |
9 | kubectl taint nodes $K8S_NODE node.k8s/app-role:PreferNoSchedule-
10 |
11 | kubectl taint nodes $K8S_NODE gpu=true:NoSchedule-
12 |
--------------------------------------------------------------------------------
/lesson-30/charts/demo/templates/tests/test-connection.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: Pod
3 | metadata:
4 | name: "{{ include "demo.fullname" . }}-test-connection"
5 | labels:
6 | {{- include "demo.labels" . | nindent 4 }}
7 | annotations:
8 | "helm.sh/hook": test
9 | spec:
10 | containers:
11 | - name: wget
12 | image: busybox
13 | command: ['wget']
14 | args: ['{{ include "demo.fullname" . }}:{{ .Values.service.port }}']
15 | restartPolicy: Never
16 |
--------------------------------------------------------------------------------
/lesson-36/k8s/example-1/external-secret.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: external-secrets.io/v1beta1
2 | kind: ExternalSecret
3 | metadata:
4 | name: api-token
5 | namespace: default
6 | spec:
7 | refreshInterval: "0"
8 | # refreshInterval: "1m"
9 | secretStoreRef:
10 | name: aws-parameter-store
11 | kind: ClusterSecretStore
12 | target:
13 | name: k8s-secret-api-token
14 | creationPolicy: Owner
15 | data:
16 | - secretKey: token
17 | remoteRef:
18 | key: demo-api-token
--------------------------------------------------------------------------------
/lesson-40/k8s/example-1/az-spread.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: az-spread
5 | labels:
6 | app: kuber
7 | spec:
8 | replicas: 45
9 | selector:
10 | matchLabels:
11 | app: http-server
12 | template:
13 | metadata:
14 | labels:
15 | app: http-server
16 | spec:
17 | containers:
18 | - name: kuber-app
19 | image: bakavets/kuber
20 | ports:
21 | - containerPort: 8000
22 |
--------------------------------------------------------------------------------
/lesson-44-45-46-47-48/k8s/charts/app/.helmignore:
--------------------------------------------------------------------------------
1 | # Patterns to ignore when building packages.
2 | # This supports shell glob matching, relative path matching, and
3 | # negation (prefixed with !). Only one pattern per line.
4 | .DS_Store
5 | # Common VCS dirs
6 | .git/
7 | .gitignore
8 | .bzr/
9 | .bzrignore
10 | .hg/
11 | .hgignore
12 | .svn/
13 | # Common backup files
14 | *.swp
15 | *.bak
16 | *.tmp
17 | *.orig
18 | *~
19 | # Various IDEs
20 | .project
21 | .idea/
22 | *.tmproj
23 | .vscode/
24 |
--------------------------------------------------------------------------------
/lesson-23/1-sc-kuber.yaml:
--------------------------------------------------------------------------------
1 | # https://kubernetes.io/docs/reference/kubernetes-api/config-and-storage-resources/storage-class-v1/
2 | apiVersion: storage.k8s.io/v1
3 | kind: StorageClass
4 | metadata:
5 | name: custom-gp2
6 | provisioner: kubernetes.io/aws-ebs # https://kubernetes.io/docs/concepts/storage/storage-classes/#provisioner
7 | parameters:
8 | type: gp2
9 | reclaimPolicy: Retain # https://kubernetes.io/docs/concepts/storage/storage-classes/#reclaim-policy
10 | allowVolumeExpansion: true
11 |
--------------------------------------------------------------------------------
/lesson-35/k8s/charts/app/templates/deploy-1.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: kuber-1
5 | labels:
6 | app: kuber-1
7 | spec:
8 | replicas: 2
9 | selector:
10 | matchLabels:
11 | app: http-server-1
12 | template:
13 | metadata:
14 | labels:
15 | app: http-server-1
16 | spec:
17 | containers:
18 | - name: kuber-app
19 | image: bakavets/kuber:v1.0
20 | ports:
21 | - containerPort: 8000
22 |
--------------------------------------------------------------------------------
/lesson-35/k8s/charts/app/templates/deploy-2.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: kuber-2
5 | labels:
6 | app: kuber-2
7 | spec:
8 | replicas: 2
9 | selector:
10 | matchLabels:
11 | app: http-server-2
12 | template:
13 | metadata:
14 | labels:
15 | app: http-server-2
16 | spec:
17 | containers:
18 | - name: kuber-app
19 | image: bakavets/kuber:v2.0
20 | ports:
21 | - containerPort: 8000
22 |
--------------------------------------------------------------------------------
/lesson-35/k8s/infrastructure/applications/.helmignore:
--------------------------------------------------------------------------------
1 | # Patterns to ignore when building packages.
2 | # This supports shell glob matching, relative path matching, and
3 | # negation (prefixed with !). Only one pattern per line.
4 | .DS_Store
5 | # Common VCS dirs
6 | .git/
7 | .gitignore
8 | .bzr/
9 | .bzrignore
10 | .hg/
11 | .hgignore
12 | .svn/
13 | # Common backup files
14 | *.swp
15 | *.bak
16 | *.tmp
17 | *.orig
18 | *~
19 | # Various IDEs
20 | .project
21 | .idea/
22 | *.tmproj
23 | .vscode/
24 |
--------------------------------------------------------------------------------
/lesson-44-45-46-47-48/k8s/development/.helmignore:
--------------------------------------------------------------------------------
1 | # Patterns to ignore when building packages.
2 | # This supports shell glob matching, relative path matching, and
3 | # negation (prefixed with !). Only one pattern per line.
4 | .DS_Store
5 | # Common VCS dirs
6 | .git/
7 | .gitignore
8 | .bzr/
9 | .bzrignore
10 | .hg/
11 | .hgignore
12 | .svn/
13 | # Common backup files
14 | *.swp
15 | *.bak
16 | *.tmp
17 | *.orig
18 | *~
19 | # Various IDEs
20 | .project
21 | .idea/
22 | *.tmproj
23 | .vscode/
24 |
--------------------------------------------------------------------------------
/lesson-24/k8s/2-deploy-awscli.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: aws-cli-deployment
5 | namespace: demo-irsa
6 | spec:
7 | selector:
8 | matchLabels:
9 | app: aws-cli
10 | replicas: 1
11 | template:
12 | metadata:
13 | labels:
14 | app: aws-cli
15 | spec:
16 | serviceAccount: demo
17 | containers:
18 | - name: aws-cli
19 | image: amazon/aws-cli
20 | command: ["/bin/sh", "-c", "sleep 100000000"]
21 |
--------------------------------------------------------------------------------
/lesson-20/1-cronjob-allow.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: batch/v1beta1
2 | kind: CronJob
3 | metadata:
4 | name: hello-allow
5 | spec:
6 | schedule: "*/1 * * * *"
7 | concurrencyPolicy: Allow
8 | jobTemplate:
9 | spec:
10 | template:
11 | spec:
12 | containers:
13 | - name: hello
14 | image: busybox
15 | args:
16 | - /bin/sh
17 | - -c
18 | - date; echo "Hello World!"; sleep 140
19 | restartPolicy: OnFailure
20 |
--------------------------------------------------------------------------------
/lesson-31/k8s/apps/deploy-1.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: counter-1
5 | labels:
6 | app: counter-1
7 | spec:
8 | replicas: 1
9 | selector:
10 | matchLabels:
11 | app: counter-1
12 | template:
13 | metadata:
14 | labels:
15 | app: counter-1
16 | spec:
17 | containers:
18 | - name: count
19 | image: busybox
20 | args: [/bin/sh, -c, 'i=0; while true; do echo "$i: $(date)"; i=$((i+1)); sleep 1; done']
21 |
--------------------------------------------------------------------------------
/lesson-43/k8s/example-1/network-policies/allow-ingress-nginx.yaml:
--------------------------------------------------------------------------------
1 | ---
2 | apiVersion: networking.k8s.io/v1
3 | kind: NetworkPolicy
4 | metadata:
5 | name: allow-ingress-nginx
6 | namespace: example-1
7 | spec:
8 | podSelector:
9 | matchLabels:
10 | app: nginx
11 | policyTypes:
12 | - Ingress
13 | ingress:
14 | - from:
15 | - podSelector:
16 | matchLabels:
17 | app: http-server
18 | ports:
19 | - port: 80
20 | protocol: TCP
21 |
--------------------------------------------------------------------------------
/lesson-20/2-cronjob-forbid.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: batch/v1beta1
2 | kind: CronJob
3 | metadata:
4 | name: hello-forbid
5 | spec:
6 | schedule: "*/1 * * * *"
7 | concurrencyPolicy: Forbid
8 | jobTemplate:
9 | spec:
10 | template:
11 | spec:
12 | containers:
13 | - name: hello
14 | image: busybox
15 | args:
16 | - /bin/sh
17 | - -c
18 | - date; echo "Hello World!"; sleep 140
19 | restartPolicy: OnFailure
20 |
--------------------------------------------------------------------------------
/lesson-20/3-cronjob-replace.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: batch/v1beta1
2 | kind: CronJob
3 | metadata:
4 | name: hello-replace
5 | spec:
6 | schedule: "*/1 * * * *"
7 | concurrencyPolicy: Replace
8 | jobTemplate:
9 | spec:
10 | template:
11 | spec:
12 | containers:
13 | - name: hello
14 | image: busybox
15 | args:
16 | - /bin/sh
17 | - -c
18 | - date; echo "Hello World!"; sleep 140
19 | restartPolicy: OnFailure
20 |
--------------------------------------------------------------------------------
/lesson-35/k8s/infrastructure/charts/cert-manager-configs/.helmignore:
--------------------------------------------------------------------------------
1 | # Patterns to ignore when building packages.
2 | # This supports shell glob matching, relative path matching, and
3 | # negation (prefixed with !). Only one pattern per line.
4 | .DS_Store
5 | # Common VCS dirs
6 | .git/
7 | .gitignore
8 | .bzr/
9 | .bzrignore
10 | .hg/
11 | .hgignore
12 | .svn/
13 | # Common backup files
14 | *.swp
15 | *.bak
16 | *.tmp
17 | *.orig
18 | *~
19 | # Various IDEs
20 | .project
21 | .idea/
22 | *.tmproj
23 | .vscode/
24 |
--------------------------------------------------------------------------------
/lesson-44-45-46-47-48/k8s/charts/app/templates/deploy-1.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: kuber-1
5 | labels:
6 | app: kuber-1
7 | spec:
8 | replicas: 2
9 | selector:
10 | matchLabels:
11 | app: http-server-1
12 | template:
13 | metadata:
14 | labels:
15 | app: http-server-1
16 | spec:
17 | containers:
18 | - name: kuber-app
19 | image: bakavets/kuber:v1.0
20 | ports:
21 | - containerPort: 8000
22 |
--------------------------------------------------------------------------------
/lesson-44-45-46-47-48/k8s/charts/app/templates/deploy-2.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: kuber-2
5 | labels:
6 | app: kuber-2
7 | spec:
8 | replicas: 2
9 | selector:
10 | matchLabels:
11 | app: http-server-2
12 | template:
13 | metadata:
14 | labels:
15 | app: http-server-2
16 | spec:
17 | containers:
18 | - name: kuber-app
19 | image: bakavets/kuber:v2.0
20 | ports:
21 | - containerPort: 8000
22 |
--------------------------------------------------------------------------------
/lesson-44-45-46-47-48/k8s/infrastructure/applications/.helmignore:
--------------------------------------------------------------------------------
1 | # Patterns to ignore when building packages.
2 | # This supports shell glob matching, relative path matching, and
3 | # negation (prefixed with !). Only one pattern per line.
4 | .DS_Store
5 | # Common VCS dirs
6 | .git/
7 | .gitignore
8 | .bzr/
9 | .bzrignore
10 | .hg/
11 | .hgignore
12 | .svn/
13 | # Common backup files
14 | *.swp
15 | *.bak
16 | *.tmp
17 | *.orig
18 | *~
19 | # Various IDEs
20 | .project
21 | .idea/
22 | *.tmproj
23 | .vscode/
24 |
--------------------------------------------------------------------------------
/lesson-26/example-5/env-file.properties:
--------------------------------------------------------------------------------
1 | # Env-files contain a list of environment variables.
2 | # These syntax rules apply:
3 | # Each line in an env file has to be in VAR=VAL format.
4 | # Lines beginning with # (i.e. comments) are ignored.
5 | # Blank lines are ignored.
6 | # There is no special handling of quotation marks (i.e. they will be part of the ConfigMap value)).
7 | env_1="value_1"
8 | env_2=value_2
9 | env_3=value_3
10 | env_4="value_4"
11 | env_5=value_5
12 | env_6=value_6
13 | env_7="value_7"
14 |
--------------------------------------------------------------------------------
/lesson-32/k8s/example-1/README.md:
--------------------------------------------------------------------------------
1 | Network Load Balancer: https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.4/guide/service/nlb/
2 |
3 | Service annotations: https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.4/guide/service/annotations/
4 |
5 | Pod readiness gate: https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.4/deploy/pod_readiness_gate/
6 |
7 | ```while true; do sleep 1; curl http://domain-name.amazonaws.com; echo " - "$(date); done```
8 |
9 | ```kubectl get pod -o wide -n example-1```
--------------------------------------------------------------------------------
/lesson-44-45-46-47-48/k8s/gitlab/agent/external-secrets.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: external-secrets.io/v1beta1
2 | kind: ExternalSecret
3 | metadata:
4 | name: gitlab-agent
5 | namespace: gitlab-agent
6 | spec:
7 | refreshInterval: "0"
8 | secretStoreRef:
9 | kind: ClusterSecretStore
10 | name: aws-parameter-store
11 | target:
12 | name: gitlab-agent
13 | creationPolicy: Owner
14 | data:
15 | - secretKey: token
16 | remoteRef:
17 | key: demo-gitlab
18 | property: kas.tokens.internal
19 |
--------------------------------------------------------------------------------
/lesson-44-45-46-47-48/k8s/infrastructure/charts/cert-manager-configs/.helmignore:
--------------------------------------------------------------------------------
1 | # Patterns to ignore when building packages.
2 | # This supports shell glob matching, relative path matching, and
3 | # negation (prefixed with !). Only one pattern per line.
4 | .DS_Store
5 | # Common VCS dirs
6 | .git/
7 | .gitignore
8 | .bzr/
9 | .bzrignore
10 | .hg/
11 | .hgignore
12 | .svn/
13 | # Common backup files
14 | *.swp
15 | *.bak
16 | *.tmp
17 | *.orig
18 | *~
19 | # Various IDEs
20 | .project
21 | .idea/
22 | *.tmproj
23 | .vscode/
24 |
--------------------------------------------------------------------------------
/lesson-29/k8s/chartmuseum-values.yaml:
--------------------------------------------------------------------------------
1 | env:
2 | open:
3 | STORAGE: amazon
4 | STORAGE_AMAZON_BUCKET: demo-helm-chartmuseum
5 | STORAGE_AMAZON_PREFIX:
6 | STORAGE_AMAZON_REGION: eu-north-1
7 | AWS_SDK_LOAD_CONFIG: true
8 | DISABLE_API: false
9 | secret:
10 | BASIC_AUTH_USER: admin
11 | BASIC_AUTH_PASS: mypassword
12 | serviceAccount:
13 | create: true
14 | name: chartmuseum
15 | annotations:
16 | eks.amazonaws.com/role-arn: arn:aws:iam::123456789012:role/demo-eks-cluster-chartmuseum-role
17 |
--------------------------------------------------------------------------------
/lesson-44-45-46-47-48/k8s/infrastructure/charts/external-secrets-configs/.helmignore:
--------------------------------------------------------------------------------
1 | # Patterns to ignore when building packages.
2 | # This supports shell glob matching, relative path matching, and
3 | # negation (prefixed with !). Only one pattern per line.
4 | .DS_Store
5 | # Common VCS dirs
6 | .git/
7 | .gitignore
8 | .bzr/
9 | .bzrignore
10 | .hg/
11 | .hgignore
12 | .svn/
13 | # Common backup files
14 | *.swp
15 | *.bak
16 | *.tmp
17 | *.orig
18 | *~
19 | # Various IDEs
20 | .project
21 | .idea/
22 | *.tmproj
23 | .vscode/
24 |
--------------------------------------------------------------------------------
/lesson-44-45-46-47-48/k8s/infrastructure/charts/external-secrets-configs/templates/css-parameter-store.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: external-secrets.io/v1beta1
2 | kind: ClusterSecretStore
3 | metadata:
4 | name: aws-parameter-store
5 | spec:
6 | provider:
7 | aws:
8 | service: ParameterStore
9 | region: {{ .Values.aws.region }}
10 | auth:
11 | jwt:
12 | serviceAccountRef:
13 | name: {{ .Values.serviceAccountRef.name }}
14 | namespace: {{ .Values.serviceAccountRef.namespace }}
15 |
--------------------------------------------------------------------------------
/lesson-44-45-46-47-48/k8s/infrastructure/charts/external-secrets-configs/templates/css-secrets-manager.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: external-secrets.io/v1beta1
2 | kind: ClusterSecretStore
3 | metadata:
4 | name: aws-secrets-manager
5 | spec:
6 | provider:
7 | aws:
8 | service: SecretsManager
9 | region: {{ .Values.aws.region }}
10 | auth:
11 | jwt:
12 | serviceAccountRef:
13 | name: {{ .Values.serviceAccountRef.name }}
14 | namespace: {{ .Values.serviceAccountRef.namespace }}
15 |
--------------------------------------------------------------------------------
/lesson-18/daemonset.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: DaemonSet
3 | metadata:
4 | name: kuber-daemonset
5 | labels:
6 | app: kuber-daemonset
7 | spec:
8 | selector:
9 | matchLabels:
10 | app: kuber-daemon
11 | template:
12 | metadata:
13 | labels:
14 | app: kuber-daemon
15 | spec:
16 | nodeSelector:
17 | topology.kubernetes.io/zone: "eu-west-1c"
18 | containers:
19 | - name: kuber-app
20 | image: bakavets/kuber
21 | ports:
22 | - containerPort: 8000
--------------------------------------------------------------------------------
/lesson-31/README.md:
--------------------------------------------------------------------------------
1 | ```helm repo add elastic https://helm.elastic.co```
2 |
3 | ```helm repo update elastic```
4 |
5 | ```helm upgrade --install elasticsearch --version 7.17.3 elastic/elasticsearch --set replicas=1 -n elastic --create-namespace --debug```
6 |
7 | ```helm upgrade --install kibana --version 7.17.3 elastic/kibana -n elastic --debug```
8 |
9 | https://github.com/fluent/fluentd-kubernetes-daemonset
10 |
11 | https://docs.fluentd.org/configuration/config-file#5-group-filter-and-output-the-ldquolabelrdquo-directive
12 |
13 |
--------------------------------------------------------------------------------
/lesson-34/README.md:
--------------------------------------------------------------------------------
1 | ```
2 | minikube start --kubernetes-version=v1.20.0 --profile k8s-v1.20.0
3 | ```
4 | ```
5 | minikube start --kubernetes-version=v1.23.9 --profile k8s-v1.23.9
6 | ```
7 | ```
8 | minikube start --kubernetes-version=v1.24.3 --profile k8s-v1.24.3
9 | ```
10 |
11 | https://jwt.io
12 |
13 | https://kubernetes.io/docs/reference/access-authn-authz/authorization/#determine-the-request-verb
14 |
15 | https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/#service-account-token-volume-projection
16 |
--------------------------------------------------------------------------------
/lesson-44-45-46-47-48/repo-examples/k8s-manifests/.gitlab-ci.yml:
--------------------------------------------------------------------------------
1 | # https://docs.gitlab.com/ee/user/clusters/agent/ci_cd_workflow.html#update-your-gitlab-ciyml-file-to-run-kubectl-commands
2 | deploy:
3 | image:
4 | name: bitnami/kubectl:latest
5 | entrypoint: [""]
6 | script:
7 | - kubectl config get-contexts
8 | - kubectl config use-context root/agents:k8s-agent
9 | - kubectl get pods
10 | - kubectl apply -f kuber.yaml
11 | - kubectl auth can-i '*' '*' --all-namespaces
12 | - kubectl auth can-i --list
13 |
--------------------------------------------------------------------------------
/lesson-15/docker-entrypoint-exec/server.py:
--------------------------------------------------------------------------------
1 | from http.server import HTTPServer, BaseHTTPRequestHandler
2 | import socket
3 |
4 | class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
5 | def do_GET(self):
6 | self.send_response(200)
7 | self.end_headers()
8 | self.wfile.write(b'Hello world from hostname: ' + socket.gethostname().encode())
9 |
10 | SERVER_PORT = 8000
11 | httpd = HTTPServer(('0.0.0.0', SERVER_PORT), SimpleHTTPRequestHandler)
12 | print('Listening on port %s ...' % SERVER_PORT)
13 | httpd.serve_forever()
--------------------------------------------------------------------------------
/lesson-26/example-2/kuber-deploy-arg.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: kuber-args
5 | labels:
6 | app: kuber
7 | spec:
8 | replicas: 1
9 | selector:
10 | matchLabels:
11 | app: http-server-args
12 | template:
13 | metadata:
14 | labels:
15 | app: http-server-args
16 | spec:
17 | containers:
18 | - name: kuber-app
19 | image: bakavets/kuber:v1.0-args
20 | args: ["1","7","Hello World!"]
21 | ports:
22 | - containerPort: 8000
--------------------------------------------------------------------------------
/lesson-49/repo-examples/app-1/server.py:
--------------------------------------------------------------------------------
1 | from http.server import HTTPServer, BaseHTTPRequestHandler
2 | import socket
3 |
4 | class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
5 | def do_GET(self):
6 | self.send_response(200)
7 | self.end_headers()
8 | self.wfile.write(b'Hello world from hostname: ' + socket.gethostname().encode())
9 |
10 | SERVER_PORT = 8000
11 | httpd = HTTPServer(('0.0.0.0', SERVER_PORT), SimpleHTTPRequestHandler)
12 | print('Listening on port %s ...' % SERVER_PORT)
13 | httpd.serve_forever()
--------------------------------------------------------------------------------
/lesson-49/repo-examples/app-2/server.py:
--------------------------------------------------------------------------------
1 | from http.server import HTTPServer, BaseHTTPRequestHandler
2 | import socket
3 |
4 | class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
5 | def do_GET(self):
6 | self.send_response(200)
7 | self.end_headers()
8 | self.wfile.write(b'Hello world from hostname: ' + socket.gethostname().encode())
9 |
10 | SERVER_PORT = 8000
11 | httpd = HTTPServer(('0.0.0.0', SERVER_PORT), SimpleHTTPRequestHandler)
12 | print('Listening on port %s ...' % SERVER_PORT)
13 | httpd.serve_forever()
--------------------------------------------------------------------------------
/lesson-15/docker-entrypoint-shell/server.py:
--------------------------------------------------------------------------------
1 | from http.server import HTTPServer, BaseHTTPRequestHandler
2 | import socket
3 |
4 | class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
5 | def do_GET(self):
6 | self.send_response(200)
7 | self.end_headers()
8 | self.wfile.write(b'Hello world from hostname: ' + socket.gethostname().encode())
9 |
10 | SERVER_PORT = 8000
11 | httpd = HTTPServer(('0.0.0.0', SERVER_PORT), SimpleHTTPRequestHandler)
12 | print('Listening on port %s ...' % SERVER_PORT)
13 | httpd.serve_forever()
--------------------------------------------------------------------------------
/lesson-08/rs-kuber-matchExpressions.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: ReplicaSet
3 | metadata:
4 | name: kuber-rs-2
5 | spec:
6 | replicas: 3
7 | selector:
8 | matchExpressions:
9 | - key: app
10 | operator: In
11 | values:
12 | - kuber
13 | - http-server
14 | - key: env
15 | operator: Exists
16 | template:
17 | metadata:
18 | labels:
19 | app: kuber
20 | env: dev
21 | spec:
22 | containers:
23 | - name: kuber-app
24 | image: bokovets/kuber
--------------------------------------------------------------------------------
/lesson-09/kuber-deployment-recreate.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: kuber
5 | labels:
6 | app: kuber
7 | spec:
8 | replicas: 5
9 | minReadySeconds: 10
10 | strategy:
11 | type: Recreate
12 | selector:
13 | matchLabels:
14 | app: http-server
15 | template:
16 | metadata:
17 | labels:
18 | app: http-server
19 | spec:
20 | containers:
21 | - name: kuber-app
22 | image: bokovets/kuber:v1.0
23 | ports:
24 | - containerPort: 8000
25 |
--------------------------------------------------------------------------------
/lesson-08/kuber-pods-manual.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: Pod
3 | metadata:
4 | name: kuber-app-manual-1
5 | labels:
6 | app: kuber
7 | env: prod
8 | spec:
9 | containers:
10 | - name: kuber-app-1
11 | image: bokovets/kuber
12 | ports:
13 | - containerPort: 8000
14 | ---
15 | apiVersion: v1
16 | kind: Pod
17 | metadata:
18 | name: kuber-app-manual-2
19 | labels:
20 | app: http-server
21 | env: dev
22 | spec:
23 | containers:
24 | - name: kuber-app-1
25 | image: bokovets/kuber
26 | ports:
27 | - containerPort: 8000
--------------------------------------------------------------------------------
/lesson-20/5-cronjob-skip-next-schedule.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: batch/v1beta1
2 | kind: CronJob
3 | metadata:
4 | name: cronjon-skip-next-schedule
5 | spec:
6 | schedule: "*/5 * * * *"
7 | startingDeadlineSeconds: 60
8 | concurrencyPolicy: Forbid
9 | jobTemplate:
10 | spec:
11 | template:
12 | spec:
13 | containers:
14 | - name: hello
15 | image: busybox
16 | args:
17 | - /bin/sh
18 | - -c
19 | - date; echo "Hello World!"; sleep 400
20 | restartPolicy: Never
--------------------------------------------------------------------------------
/lesson-27/example-1/deploy-1.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: kuber-1
5 | labels:
6 | app: kuber-1
7 | spec:
8 | replicas: 1
9 | selector:
10 | matchLabels:
11 | app: http-server-1
12 | template:
13 | metadata:
14 | labels:
15 | app: http-server-1
16 | spec:
17 | containers:
18 | - name: kuber-app
19 | image: bakavets/kuber:v1.0
20 | ports:
21 | - containerPort: 8000
22 | envFrom:
23 | - secretRef:
24 | name: secret-data
--------------------------------------------------------------------------------
/lesson-31/k8s/apps/deploy-2.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: counter-2
5 | labels:
6 | app: counter-2
7 | spec:
8 | replicas: 1
9 | selector:
10 | matchLabels:
11 | app: counter-2
12 | template:
13 | metadata:
14 | labels:
15 | app: counter-2
16 | annotations:
17 | fluentd.active: 'true'
18 | spec:
19 | containers:
20 | - name: count
21 | image: busybox
22 | args: [/bin/sh, -c, 'i=0; while true; do echo "$i: $(date)"; i=$((i+1)); sleep 1; done']
23 |
--------------------------------------------------------------------------------
/lesson-43/k8s/example-3/deploy-awscli.yaml:
--------------------------------------------------------------------------------
1 | ---
2 | apiVersion: v1
3 | kind: Namespace
4 | metadata:
5 | name: example-3
6 | ---
7 | apiVersion: apps/v1
8 | kind: Deployment
9 | metadata:
10 | name: aws-cli
11 | namespace: example-3
12 | spec:
13 | selector:
14 | matchLabels:
15 | app: aws-cli
16 | replicas: 1
17 | template:
18 | metadata:
19 | labels:
20 | app: aws-cli
21 | spec:
22 | containers:
23 | - name: aws-cli
24 | image: amazon/aws-cli
25 | command: ["/bin/sh", "-c", "sleep 100000000"]
26 |
--------------------------------------------------------------------------------
/lesson-20/6-cronjob-startingDeadlineSeconds.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: batch/v1beta1
2 | kind: CronJob
3 | metadata:
4 | name: cronjon-startingdeadlineseconds
5 | spec:
6 | schedule: "*/5 * * * *"
7 | startingDeadlineSeconds: 60
8 | concurrencyPolicy: Forbid
9 | jobTemplate:
10 | spec:
11 | template:
12 | spec:
13 | containers:
14 | - name: hello
15 | image: busybox
16 | args:
17 | - /bin/sh
18 | - -c
19 | - date; echo "Hello World!"; sleep 340
20 | restartPolicy: Never
--------------------------------------------------------------------------------
/lesson-31/k8s/apps/deploy-3.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: counter-3
5 | labels:
6 | app: counter-3
7 | spec:
8 | replicas: 1
9 | selector:
10 | matchLabels:
11 | app: counter-3
12 | template:
13 | metadata:
14 | labels:
15 | app: counter-3
16 | annotations:
17 | fluentd.active: 'false'
18 | spec:
19 | containers:
20 | - name: count
21 | image: busybox
22 | args: [/bin/sh, -c, 'i=0; while true; do echo "$i: $(date)"; i=$((i+1)); sleep 1; done']
23 |
--------------------------------------------------------------------------------
/lesson-20/8-cronjob-without-startingDeadlineSeconds.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: batch/v1beta1
2 | kind: CronJob
3 | metadata:
4 | name: hello-without-startingdeadlineseconds
5 | spec:
6 | schedule: "*/1 * * * *"
7 | concurrencyPolicy: Forbid
8 | jobTemplate:
9 | spec:
10 | backoffLimit: 1
11 | template:
12 | spec:
13 | containers:
14 | - name: hello
15 | image: busybox
16 | args:
17 | - /bin/sh
18 | - -c
19 | - date; echo "Hello World!"; sleep 7000
20 | restartPolicy: Never
21 |
--------------------------------------------------------------------------------
/lesson-30/argocd/projects/infra.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: argoproj.io/v1alpha1
2 | kind: AppProject
3 | metadata:
4 | name: infrastructure
5 | namespace: argocd
6 | # Finalizer that ensures that project is not deleted until it is not referenced by any application
7 | finalizers:
8 | - resources-finalizer.argocd.argoproj.io
9 | spec:
10 | description: Project with infrastructure related applications
11 | sourceRepos:
12 | - '*'
13 | destinations:
14 | - namespace: '*'
15 | server: '*'
16 | clusterResourceWhitelist:
17 | - group: '*'
18 | kind: '*'
19 |
--------------------------------------------------------------------------------
/lesson-35/k8s/infrastructure/applications/templates/00-project-dev.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: argoproj.io/v1alpha1
2 | kind: AppProject
3 | metadata:
4 | name: development
5 | # Finalizer that ensures that project is not deleted until it is not referenced by any application
6 | finalizers:
7 | - resources-finalizer.argocd.argoproj.io
8 | spec:
9 | description: Project containing development environment services
10 | sourceRepos:
11 | - '*'
12 | destinations:
13 | - namespace: '*'
14 | server: '*'
15 | clusterResourceWhitelist:
16 | - group: '*'
17 | kind: '*'
18 |
--------------------------------------------------------------------------------
/lesson-35/k8s/infrastructure/applications/templates/00-project-infra.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: argoproj.io/v1alpha1
2 | kind: AppProject
3 | metadata:
4 | name: infrastructure
5 | # Finalizer that ensures that project is not deleted until it is not referenced by any application
6 | finalizers:
7 | - resources-finalizer.argocd.argoproj.io
8 | spec:
9 | description: Project with infrastructure related applications
10 | sourceRepos:
11 | - '*'
12 | destinations:
13 | - namespace: '*'
14 | server: '*'
15 | clusterResourceWhitelist:
16 | - group: '*'
17 | kind: '*'
18 |
--------------------------------------------------------------------------------
/lesson-40/k8s/kind/README.md:
--------------------------------------------------------------------------------
1 | GitHub: https://github.com/kubernetes-sigs/kind
2 |
3 | Installation and usage: https://github.com/kubernetes-sigs/kind#installation-and-usage
4 |
5 | To use kind, you will need to install docker. Once you have docker running you can create a cluster with:
6 |
7 | ```kind create cluster --name k8s --config kind-config.yaml```
8 |
9 | To delete your cluster use:
10 |
11 | ```kind delete cluster --name k8s```
12 |
13 | Rolling restart of the "zone-spread-topology" deployment:
14 |
15 | ```kubectl rollout restart deployment zone-spread-topology```
16 |
--------------------------------------------------------------------------------
/lesson-44-45-46-47-48/k8s/infrastructure/applications/templates/00-project-dev.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: argoproj.io/v1alpha1
2 | kind: AppProject
3 | metadata:
4 | name: development
5 | # Finalizer that ensures that project is not deleted until it is not referenced by any application
6 | finalizers:
7 | - resources-finalizer.argocd.argoproj.io
8 | spec:
9 | description: Project containing development environment services
10 | sourceRepos:
11 | - '*'
12 | destinations:
13 | - namespace: '*'
14 | server: '*'
15 | clusterResourceWhitelist:
16 | - group: '*'
17 | kind: '*'
18 |
--------------------------------------------------------------------------------
/lesson-27/example-3/deploy-private.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: kuber-private
5 | labels:
6 | app: kuber-private
7 | spec:
8 | replicas: 1
9 | selector:
10 | matchLabels:
11 | app: http-server-private
12 | template:
13 | metadata:
14 | labels:
15 | app: http-server-private
16 | spec:
17 | # imagePullSecrets:
18 | # - name: secret-docker-registry
19 | containers:
20 | - name: kuber-app
21 | image: bakavets/kuber-private
22 | ports:
23 | - containerPort: 8000
24 |
25 |
--------------------------------------------------------------------------------
/lesson-44-45-46-47-48/k8s/infrastructure/applications/templates/00-project-infra.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: argoproj.io/v1alpha1
2 | kind: AppProject
3 | metadata:
4 | name: infrastructure
5 | # Finalizer that ensures that project is not deleted until it is not referenced by any application
6 | finalizers:
7 | - resources-finalizer.argocd.argoproj.io
8 | spec:
9 | description: Project with infrastructure related applications
10 | sourceRepos:
11 | - '*'
12 | destinations:
13 | - namespace: '*'
14 | server: '*'
15 | clusterResourceWhitelist:
16 | - group: '*'
17 | kind: '*'
18 |
--------------------------------------------------------------------------------
/lesson-34/example-4/app.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: ServiceAccount
3 | metadata:
4 | name: mysa
5 | ---
6 | apiVersion: apps/v1
7 | kind: Deployment
8 | metadata:
9 | name: kuber
10 | labels:
11 | app: kuber
12 | spec:
13 | replicas: 1
14 | selector:
15 | matchLabels:
16 | app: http-server
17 | template:
18 | metadata:
19 | labels:
20 | app: http-server
21 | spec:
22 | serviceAccountName: mysa
23 | containers:
24 | - name: kuber-app
25 | image: bakavets/kuber:v1.0
26 | ports:
27 | - containerPort: 8000
28 |
--------------------------------------------------------------------------------
/lesson-36/k8s/example-4/mysql-secrets-manager.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: external-secrets.io/v1beta1
2 | kind: ExternalSecret
3 | metadata:
4 | name: mysql-secrets
5 | namespace: example
6 | spec:
7 | refreshInterval: 1h
8 | secretStoreRef:
9 | kind: SecretStore
10 | name: aws-ps-ns
11 | target:
12 | name: mysql-secrets
13 | creationPolicy: Owner
14 | data:
15 | - secretKey: MYSQL_USER
16 | remoteRef:
17 | key: demo-mysql
18 | property: MYSQL_USER
19 | - secretKey: MYSQL_PASSWORD
20 | remoteRef:
21 | key: demo-mysql
22 | property: MYSQL_PASSWORD
23 |
--------------------------------------------------------------------------------
/lesson-20/7-cronjob-startingDeadlineSeconds.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: batch/v1beta1
2 | kind: CronJob
3 | metadata:
4 | name: hello-startingdeadlineseconds
5 | spec:
6 | schedule: "*/1 * * * *"
7 | startingDeadlineSeconds: 8200
8 | concurrencyPolicy: Forbid
9 | jobTemplate:
10 | spec:
11 | backoffLimit: 1
12 | template:
13 | spec:
14 | containers:
15 | - name: hello
16 | image: busybox
17 | args:
18 | - /bin/sh
19 | - -c
20 | - date; echo "Hello World!"; sleep 8000
21 | restartPolicy: Never
22 |
--------------------------------------------------------------------------------
/lesson-25/k8s/example-2/ingress.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: networking.k8s.io/v1
2 | kind: Ingress
3 | metadata:
4 | name: app3-ingress
5 | spec:
6 | ingressClassName: nginx # replacement of annotation: kubernetes.io/ingress.class: nginx
7 | tls:
8 | - hosts:
9 | - app-3.kubxr.com
10 | secretName: app-tls-3
11 | rules:
12 | - host: app-3.kubxr.com
13 | http:
14 | paths:
15 | - pathType: Prefix
16 | path: /
17 | backend:
18 | service:
19 | name: kuber-service-3
20 | port:
21 | number: 80
22 |
--------------------------------------------------------------------------------
/lesson-33/k8s/README.md:
--------------------------------------------------------------------------------
1 | ExternalDNS GitHub: https://github.com/kubernetes-sigs/external-dns
2 |
3 | ExternalDNS Artifacthub: https://artifacthub.io/packages/helm/bitnami/external-dns
4 |
5 | Install ExternalDNS using Helm:
6 |
7 | ```helm repo add bitnami https://charts.bitnami.com/bitnami```
8 |
9 | ```helm repo update bitnami```
10 |
11 | ```helm search repo bitnami/external-dns```
12 |
13 | ```helm upgrade --install external-dns bitnami/external-dns --version 6.7.4 -n kube-system -f external-dns-values.yaml```
14 |
15 | Note: https://github.com/kubernetes-sigs/external-dns/blob/v0.12.2/docs/registry.md
--------------------------------------------------------------------------------
/lesson-38/k8s/example-1/with-node-affinity.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: with-node-selector
5 | labels:
6 | app: kuber
7 | spec:
8 | replicas: 3
9 | selector:
10 | matchLabels:
11 | app: http-server
12 | template:
13 | metadata:
14 | labels:
15 | app: http-server
16 | spec:
17 | containers:
18 | - name: kuber-app
19 | image: bakavets/kuber
20 | ports:
21 | - containerPort: 8000
22 | nodeSelector:
23 | topology.kubernetes.io/zone: eu-west-1b
24 | capacityType: spot
25 |
--------------------------------------------------------------------------------
/lesson-09/kuber-deployment.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: kuber
5 | labels:
6 | app: kuber
7 | spec:
8 | replicas: 5
9 | minReadySeconds: 10
10 | strategy:
11 | rollingUpdate:
12 | maxSurge: 1
13 | maxUnavailable: 1
14 | type: RollingUpdate
15 | selector:
16 | matchLabels:
17 | app: http-server
18 | template:
19 | metadata:
20 | labels:
21 | app: http-server
22 | spec:
23 | containers:
24 | - name: kuber-app
25 | image: bokovets/kuber:v2.0
26 | ports:
27 | - containerPort: 8000
28 |
--------------------------------------------------------------------------------
/lesson-10/kuber-deployment.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: kuber
5 | labels:
6 | app: kuber
7 | spec:
8 | replicas: 3
9 | minReadySeconds: 5
10 | strategy:
11 | rollingUpdate:
12 | maxSurge: 1
13 | maxUnavailable: 1
14 | type: RollingUpdate
15 | selector:
16 | matchLabels:
17 | app: http-server
18 | template:
19 | metadata:
20 | labels:
21 | app: http-server
22 | spec:
23 | containers:
24 | - name: kuber-app
25 | image: bokovets/kuber:v1.0
26 | ports:
27 | - containerPort: 8000
28 |
--------------------------------------------------------------------------------
/lesson-11/kuber-deployment.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: kuber
5 | labels:
6 | app: kuber
7 | spec:
8 | replicas: 3
9 | minReadySeconds: 5
10 | strategy:
11 | rollingUpdate:
12 | maxSurge: 1
13 | maxUnavailable: 1
14 | type: RollingUpdate
15 | selector:
16 | matchLabels:
17 | app: http-server
18 | template:
19 | metadata:
20 | labels:
21 | app: http-server
22 | spec:
23 | containers:
24 | - name: kuber-app
25 | image: bokovets/kuber:v1.0
26 | ports:
27 | - containerPort: 8000
28 |
--------------------------------------------------------------------------------
/lesson-43/k8s/example-2/network-policies/allow-ingress.yaml:
--------------------------------------------------------------------------------
1 | ---
2 | apiVersion: networking.k8s.io/v1
3 | kind: NetworkPolicy
4 | metadata:
5 | name: allow-ingress
6 | namespace: example-2
7 | spec:
8 | podSelector:
9 | matchLabels:
10 | app: http-server-2
11 | policyTypes:
12 | - Ingress
13 | ingress:
14 | - from:
15 | - namespaceSelector:
16 | matchLabels:
17 | kubernetes.io/metadata.name: example-1
18 | podSelector:
19 | matchLabels:
20 | app: http-server
21 | ports:
22 | - port: 8000
23 | protocol: TCP
24 |
--------------------------------------------------------------------------------
/lesson-20/0-cronjob.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: batch/v1beta1
2 | kind: CronJob
3 | metadata:
4 | name: hello
5 | spec:
6 | schedule: "*/1 * * * *"
7 | jobTemplate:
8 | spec:
9 | backoffLimit: 4
10 | activeDeadlineSeconds: 240
11 | parallelism: 2
12 | completions: 3
13 | template:
14 | spec:
15 | containers:
16 | - name: hello
17 | image: busybox
18 | imagePullPolicy: IfNotPresent
19 | command:
20 | - /bin/sh
21 | - -c
22 | - date; echo Hello from the Kubernetes cluster
23 | restartPolicy: OnFailure
24 |
--------------------------------------------------------------------------------
/lesson-20/4-cronjob-suspend.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: batch/v1beta1
2 | kind: CronJob
3 | metadata:
4 | name: hello-suspend
5 | spec:
6 | schedule: "*/1 * * * *"
7 | concurrencyPolicy: Allow
8 | successfulJobsHistoryLimit: 2
9 | failedJobsHistoryLimit: 2
10 | suspend: false
11 | jobTemplate:
12 | spec:
13 | backoffLimit: 1
14 | template:
15 | spec:
16 | containers:
17 | - name: hello
18 | image: busybox
19 | args:
20 | - /bin/sh
21 | - -c
22 | - date; echo "Hello World!"; exit $((RANDOM%2))
23 | restartPolicy: OnFailure
24 |
--------------------------------------------------------------------------------
/lesson-44-45-46-47-48/k8s/gitlab/secrets.yaml:
--------------------------------------------------------------------------------
1 | # https://docs.gitlab.com/charts/advanced/external-object-storage/aws-iam-roles.html
2 | # https://docs.gitlab.com/ee/install/aws/manual_install_aws.html
3 | ---
4 | apiVersion: v1
5 | kind: Secret
6 | metadata:
7 | name: gitlab-rails-s3-storage
8 | namespace: gitlab
9 | stringData:
10 | connection: |
11 | provider: AWS
12 | use_iam_profile: true
13 | region: eu-west-1
14 | ---
15 | apiVersion: v1
16 | kind: Secret
17 | metadata:
18 | name: s3-credentials
19 | namespace: gitlab
20 | stringData:
21 | config: |
22 | [default]
23 | bucket_location = eu-west-1
24 |
--------------------------------------------------------------------------------
/lesson-32/k8s/README.md:
--------------------------------------------------------------------------------
1 | Ingress annotations: https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.4/guide/ingress/annotations/
2 |
3 | Service annotations: https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.4/guide/service/annotations/
4 |
5 | Install AWS Load Balancer Controller using Helm:
6 |
7 | ```helm repo add eks https://aws.github.io/eks-charts```
8 |
9 | ```helm repo update eks```
10 |
11 | ```helm search repo eks/aws-load-balancer-controller```
12 |
13 | ```helm upgrade --install aws-load-balancer-controller eks/aws-load-balancer-controller --version 1.4.2 -n kube-system -f albc-values.yaml```
14 |
15 |
--------------------------------------------------------------------------------
/lesson-10/pod-service-port-names.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: Pod
3 | metadata:
4 | name: kuber-app-manual
5 | labels:
6 | app: web-server
7 | spec:
8 | containers:
9 | - name: kuber-app-image
10 | image: bokovets/kuber:v2.0
11 | ports:
12 | - name: http
13 | containerPort: 8000
14 | - name: https
15 | containerPort: 8000
16 | ---
17 | apiVersion: v1
18 | kind: Service
19 | metadata:
20 | name: kuber-app-manual-service
21 | spec:
22 | selector:
23 | app: web-server
24 | ports:
25 | - name: http
26 | port: 80
27 | targetPort: http
28 | - name: https
29 | port: 443
30 | targetPort: https
--------------------------------------------------------------------------------
/lesson-26/example-4/deploy.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: kuber-2
5 | labels:
6 | app: kuber-2
7 | spec:
8 | replicas: 1
9 | selector:
10 | matchLabels:
11 | app: http-server-2
12 | template:
13 | metadata:
14 | labels:
15 | app: http-server-2
16 | spec:
17 | containers:
18 | - name: kuber-app
19 | image: bakavets/kuber:v1.0-args
20 | args: ["$(INTERVAL)","$(COUNT)","$(TEXT_ARG)"]
21 | ports:
22 | - containerPort: 8000
23 | envFrom:
24 | - # prefix: CONFIG_
25 | configMapRef:
26 | name: demo-cm
--------------------------------------------------------------------------------
/lesson-36/k8s/example-1/deploy.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: kuber
5 | labels:
6 | app: kuber
7 | spec:
8 | replicas: 1
9 | selector:
10 | matchLabels:
11 | app: http-server
12 | template:
13 | metadata:
14 | labels:
15 | app: http-server
16 | spec:
17 | containers:
18 | - name: kuber-app
19 | image: bakavets/kuber
20 | ports:
21 | - containerPort: 8000
22 | env:
23 | - name: API_TOKEN
24 | valueFrom:
25 | secretKeyRef:
26 | name: k8s-secret-api-token
27 | key: token
28 |
--------------------------------------------------------------------------------
/lesson-35/terraform/templates/values.yaml:
--------------------------------------------------------------------------------
1 | configs:
2 | repositories:
3 | k8s-repo:
4 | name: k8s-repo
5 | url: git@gitlab.com:${k8s_repo}.git
6 | type: git
7 | sshPrivateKey: |
8 | ${indent(8, k8s_ssh_private_key)}
9 |
10 | server:
11 | ingress:
12 | enabled: true
13 | annotations:
14 | cert-manager.io/cluster-issuer: letsencrypt-prod
15 | ingressClassName: nginx
16 | hosts:
17 | - argocd.${host}
18 | tls:
19 | - hosts:
20 | - argocd.${host}
21 | secretName: argocd-tls
22 | extraArgs:
23 | - --insecure # https://github.com/argoproj/argo-cd/issues/2953#issuecomment-602898868
24 |
--------------------------------------------------------------------------------
/lesson-30/argocd/projects/dev.yaml:
--------------------------------------------------------------------------------
1 | # https://argo-cd.readthedocs.io/en/stable/operator-manual/declarative-setup/#projects
2 | apiVersion: argoproj.io/v1alpha1
3 | kind: AppProject
4 | metadata:
5 | name: development
6 | namespace: argocd
7 | # Finalizer that ensures that project is not deleted until it is not referenced by any application
8 | finalizers:
9 | - resources-finalizer.argocd.argoproj.io
10 | spec:
11 | description: Project containing development environment services
12 | sourceRepos:
13 | - '*'
14 | destinations:
15 | - namespace: '*'
16 | server: '*'
17 | clusterResourceWhitelist:
18 | - group: '*'
19 | kind: '*'
20 |
--------------------------------------------------------------------------------
/lesson-24/terraform/variables.tf:
--------------------------------------------------------------------------------
1 | variable "aws_region" {
2 | description = "AWS Region"
3 | default = "eu-north-1"
4 | }
5 |
6 | variable "default_tags" {
7 | type = map(string)
8 | description = "Default tags for AWS that will be attached to each resource"
9 | default = {
10 | "TerminationDate" = "Permanent",
11 | "Environment" = "Development",
12 | "Team" = "DevOps",
13 | "DeployedBy" = "Terraform",
14 | "OwnerEmail" = "devops@example.com"
15 | }
16 | }
17 |
18 | variable "deployment_prefix" {
19 | description = "Prefix of the deployment"
20 | type = string
21 | default = "demo"
22 | }
23 |
--------------------------------------------------------------------------------
/lesson-29/terraform/variables.tf:
--------------------------------------------------------------------------------
1 | variable "aws_region" {
2 | description = "AWS Region"
3 | default = "eu-north-1"
4 | }
5 |
6 | variable "default_tags" {
7 | type = map(string)
8 | description = "Default tags for AWS that will be attached to each resource."
9 | default = {
10 | "TerminationDate" = "Permanent",
11 | "Environment" = "Development",
12 | "Team" = "DevOps",
13 | "DeployedBy" = "Terraform",
14 | "OwnerEmail" = "devops@example.com"
15 | }
16 | }
17 |
18 | variable "deployment_prefix" {
19 | description = "Prefix of the deployment"
20 | type = string
21 | default = "demo"
22 | }
23 |
--------------------------------------------------------------------------------
/lesson-31/terraform/variables.tf:
--------------------------------------------------------------------------------
1 | variable "aws_region" {
2 | description = "AWS Region"
3 | default = "eu-north-1"
4 | }
5 |
6 | variable "default_tags" {
7 | type = map(string)
8 | description = "Default tags for AWS that will be attached to each resource."
9 | default = {
10 | "TerminationDate" = "Permanent",
11 | "Environment" = "Development",
12 | "Team" = "DevOps",
13 | "DeployedBy" = "Terraform",
14 | "OwnerEmail" = "devops@example.com"
15 | }
16 | }
17 |
18 | variable "deployment_prefix" {
19 | description = "Prefix of the deployment"
20 | type = string
21 | default = "demo"
22 | }
23 |
--------------------------------------------------------------------------------
/lesson-32/terraform/variables.tf:
--------------------------------------------------------------------------------
1 | variable "aws_region" {
2 | description = "AWS Region."
3 | default = "eu-north-1"
4 | }
5 |
6 | variable "default_tags" {
7 | type = map(string)
8 | description = "Default tags for AWS that will be attached to each resource."
9 | default = {
10 | "TerminationDate" = "Permanent",
11 | "Environment" = "Development",
12 | "Team" = "DevOps",
13 | "DeployedBy" = "Terraform",
14 | "OwnerEmail" = "devops@example.com"
15 | }
16 | }
17 |
18 | variable "deployment_prefix" {
19 | description = "Prefix of the deployment."
20 | type = string
21 | default = "demo"
22 | }
23 |
--------------------------------------------------------------------------------
/lesson-33/terraform/variables.tf:
--------------------------------------------------------------------------------
1 | variable "aws_region" {
2 | description = "AWS Region."
3 | default = "eu-north-1"
4 | }
5 |
6 | variable "default_tags" {
7 | type = map(string)
8 | description = "Default tags for AWS that will be attached to each resource."
9 | default = {
10 | "TerminationDate" = "Permanent",
11 | "Environment" = "Development",
12 | "Team" = "DevOps",
13 | "DeployedBy" = "Terraform",
14 | "OwnerEmail" = "devops@example.com"
15 | }
16 | }
17 |
18 | variable "deployment_prefix" {
19 | description = "Prefix of the deployment."
20 | type = string
21 | default = "demo"
22 | }
23 |
--------------------------------------------------------------------------------
/lesson-36/terraform/variables.tf:
--------------------------------------------------------------------------------
1 | variable "aws_region" {
2 | description = "AWS Region."
3 | default = "eu-west-1"
4 | }
5 |
6 | variable "default_tags" {
7 | type = map(string)
8 | description = "Default tags for AWS that will be attached to each resource."
9 | default = {
10 | "TerminationDate" = "Permanent",
11 | "Environment" = "Development",
12 | "Team" = "DevOps",
13 | "DeployedBy" = "Terraform",
14 | "OwnerEmail" = "devops@example.com"
15 | }
16 | }
17 |
18 | variable "deployment_prefix" {
19 | description = "Prefix of the deployment."
20 | type = string
21 | default = "demo"
22 | }
23 |
--------------------------------------------------------------------------------
/lesson-37/terraform/variables.tf:
--------------------------------------------------------------------------------
1 | variable "aws_region" {
2 | description = "AWS Region."
3 | default = "eu-west-1"
4 | }
5 |
6 | variable "default_tags" {
7 | type = map(string)
8 | description = "Default tags for AWS that will be attached to each resource."
9 | default = {
10 | "TerminationDate" = "Permanent",
11 | "Environment" = "Development",
12 | "Team" = "DevOps",
13 | "DeployedBy" = "Terraform",
14 | "OwnerEmail" = "devops@example.com"
15 | }
16 | }
17 |
18 | variable "deployment_prefix" {
19 | description = "Prefix of the deployment."
20 | type = string
21 | default = "demo"
22 | }
23 |
--------------------------------------------------------------------------------
/lesson-38/terraform/variables.tf:
--------------------------------------------------------------------------------
1 | variable "aws_region" {
2 | description = "AWS Region."
3 | default = "eu-west-1"
4 | }
5 |
6 | variable "default_tags" {
7 | type = map(string)
8 | description = "Default tags for AWS that will be attached to each resource."
9 | default = {
10 | "TerminationDate" = "Permanent",
11 | "Environment" = "Development",
12 | "Team" = "DevOps",
13 | "DeployedBy" = "Terraform",
14 | "OwnerEmail" = "devops@example.com"
15 | }
16 | }
17 |
18 | variable "deployment_prefix" {
19 | description = "Prefix of the deployment."
20 | type = string
21 | default = "demo"
22 | }
23 |
--------------------------------------------------------------------------------
/lesson-39/terraform/variables.tf:
--------------------------------------------------------------------------------
1 | variable "aws_region" {
2 | description = "AWS Region."
3 | default = "eu-west-1"
4 | }
5 |
6 | variable "default_tags" {
7 | type = map(string)
8 | description = "Default tags for AWS that will be attached to each resource."
9 | default = {
10 | "TerminationDate" = "Permanent",
11 | "Environment" = "Development",
12 | "Team" = "DevOps",
13 | "DeployedBy" = "Terraform",
14 | "OwnerEmail" = "devops@example.com"
15 | }
16 | }
17 |
18 | variable "deployment_prefix" {
19 | description = "Prefix of the deployment."
20 | type = string
21 | default = "demo"
22 | }
23 |
--------------------------------------------------------------------------------
/lesson-40/terraform/variables.tf:
--------------------------------------------------------------------------------
1 | variable "aws_region" {
2 | description = "AWS Region."
3 | default = "eu-west-1"
4 | }
5 |
6 | variable "default_tags" {
7 | type = map(string)
8 | description = "Default tags for AWS that will be attached to each resource."
9 | default = {
10 | "TerminationDate" = "Permanent",
11 | "Environment" = "Development",
12 | "Team" = "DevOps",
13 | "DeployedBy" = "Terraform",
14 | "OwnerEmail" = "devops@example.com"
15 | }
16 | }
17 |
18 | variable "deployment_prefix" {
19 | description = "Prefix of the deployment."
20 | type = string
21 | default = "demo"
22 | }
23 |
--------------------------------------------------------------------------------
/lesson-41/terraform/variables.tf:
--------------------------------------------------------------------------------
1 | variable "aws_region" {
2 | description = "AWS Region."
3 | default = "eu-west-1"
4 | }
5 |
6 | variable "default_tags" {
7 | type = map(string)
8 | description = "Default tags for AWS that will be attached to each resource."
9 | default = {
10 | "TerminationDate" = "Permanent",
11 | "Environment" = "Development",
12 | "Team" = "DevOps",
13 | "DeployedBy" = "Terraform",
14 | "OwnerEmail" = "devops@example.com"
15 | }
16 | }
17 |
18 | variable "deployment_prefix" {
19 | description = "Prefix of the deployment."
20 | type = string
21 | default = "demo"
22 | }
23 |
--------------------------------------------------------------------------------
/lesson-42/terraform/variables.tf:
--------------------------------------------------------------------------------
1 | variable "aws_region" {
2 | description = "AWS Region."
3 | default = "eu-west-1"
4 | }
5 |
6 | variable "default_tags" {
7 | type = map(string)
8 | description = "Default tags for AWS that will be attached to each resource."
9 | default = {
10 | "TerminationDate" = "Permanent",
11 | "Environment" = "Development",
12 | "Team" = "DevOps",
13 | "DeployedBy" = "Terraform",
14 | "OwnerEmail" = "devops@example.com"
15 | }
16 | }
17 |
18 | variable "deployment_prefix" {
19 | description = "Prefix of the deployment."
20 | type = string
21 | default = "demo"
22 | }
23 |
--------------------------------------------------------------------------------
/lesson-43/terraform/variables.tf:
--------------------------------------------------------------------------------
1 | variable "aws_region" {
2 | description = "AWS Region."
3 | default = "eu-west-1"
4 | }
5 |
6 | variable "default_tags" {
7 | type = map(string)
8 | description = "Default tags for AWS that will be attached to each resource."
9 | default = {
10 | "TerminationDate" = "Permanent",
11 | "Environment" = "Development",
12 | "Team" = "DevOps",
13 | "DeployedBy" = "Terraform",
14 | "OwnerEmail" = "devops@example.com"
15 | }
16 | }
17 |
18 | variable "deployment_prefix" {
19 | description = "Prefix of the deployment."
20 | type = string
21 | default = "demo"
22 | }
23 |
--------------------------------------------------------------------------------
/lesson-23/0-deploy-kuber.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: kuber
5 | labels:
6 | app: kuber
7 | spec:
8 | replicas: 1
9 | selector:
10 | matchLabels:
11 | app: http-server
12 | template:
13 | metadata:
14 | labels:
15 | app: http-server
16 | spec:
17 | containers:
18 | - name: kuber-app
19 | image: bakavets/kuber
20 | ports:
21 | - containerPort: 8000
22 | volumeMounts:
23 | - mountPath: /cache
24 | name: cache-volume
25 | volumes:
26 | - name: cache-volume
27 | persistentVolumeClaim:
28 | claimName: aws-pvc-kuber
--------------------------------------------------------------------------------
/lesson-44-45-46-47-48/terraform/templates/values.yaml:
--------------------------------------------------------------------------------
1 | configs:
2 | repositories:
3 | k8s-repo:
4 | name: k8s-repo
5 | url: git@gitlab.com:${k8s_repo}.git
6 | type: git
7 | sshPrivateKey: |
8 | ${indent(8, k8s_ssh_private_key)}
9 |
10 | server:
11 | ingress:
12 | enabled: true
13 | annotations:
14 | cert-manager.io/cluster-issuer: letsencrypt-prod
15 | ingressClassName: nginx
16 | hosts:
17 | - argocd.${host}
18 | tls:
19 | - hosts:
20 | - argocd.${host}
21 | secretName: argocd-tls
22 | extraArgs:
23 | - --insecure # https://github.com/argoproj/argo-cd/issues/2953#issuecomment-602898868
24 |
--------------------------------------------------------------------------------
/lesson-23/1-deploy-kuber.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: kuber-1
5 | labels:
6 | app: kuber
7 | spec:
8 | replicas: 1
9 | selector:
10 | matchLabels:
11 | app: http-server
12 | template:
13 | metadata:
14 | labels:
15 | app: http-server
16 | spec:
17 | containers:
18 | - name: kuber-app
19 | image: bakavets/kuber
20 | ports:
21 | - containerPort: 8000
22 | volumeMounts:
23 | - mountPath: /cache
24 | name: cache-volume
25 | volumes:
26 | - name: cache-volume
27 | persistentVolumeClaim:
28 | claimName: aws-pvc-kuber-1
--------------------------------------------------------------------------------
/lesson-40/k8s/kind/kind-config.yaml:
--------------------------------------------------------------------------------
1 | # three node (two workers) cluster config
2 | kind: Cluster
3 | apiVersion: kind.x-k8s.io/v1alpha4
4 | featureGates:
5 | MatchLabelKeysInPodTopologySpread: true
6 | nodes:
7 | - role: control-plane
8 | - role: worker
9 | kubeadmConfigPatches:
10 | - |
11 | kind: JoinConfiguration
12 | nodeRegistration:
13 | kubeletExtraArgs:
14 | node-labels: "topology.kubernetes.io/zone=A"
15 | - role: worker
16 | kubeadmConfigPatches:
17 | - |
18 | kind: JoinConfiguration
19 | nodeRegistration:
20 | kubeletExtraArgs:
21 | node-labels: "topology.kubernetes.io/zone=B"
22 |
--------------------------------------------------------------------------------
/lesson-41/k8s/example-1/deploy.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: kuber
5 | labels:
6 | app: kuber
7 | spec:
8 | replicas: 1
9 | selector:
10 | matchLabels:
11 | app: http-server
12 | template:
13 | metadata:
14 | labels:
15 | app: http-server
16 | spec:
17 | containers:
18 | - name: kuber-app
19 | image: bakavets/kuber
20 | ports:
21 | - containerPort: 8000
22 | volumeMounts:
23 | - mountPath: /data
24 | name: data-volume
25 | volumes:
26 | - name: data-volume
27 | persistentVolumeClaim:
28 | claimName: aws-pvc-kuber
29 |
--------------------------------------------------------------------------------
/lesson-41/k8s/example-2/deploy.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: kuber
5 | labels:
6 | app: kuber
7 | spec:
8 | replicas: 1
9 | selector:
10 | matchLabels:
11 | app: http-server
12 | template:
13 | metadata:
14 | labels:
15 | app: http-server
16 | spec:
17 | containers:
18 | - name: kuber-app
19 | image: bakavets/kuber
20 | ports:
21 | - containerPort: 8000
22 | volumeMounts:
23 | - mountPath: /data
24 | name: data-volume
25 | volumes:
26 | - name: data-volume
27 | persistentVolumeClaim:
28 | claimName: aws-pvc-kuber
29 |
--------------------------------------------------------------------------------
/lesson-41/k8s/example-3/deploy.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: kuber
5 | labels:
6 | app: kuber
7 | spec:
8 | replicas: 1
9 | selector:
10 | matchLabels:
11 | app: http-server
12 | template:
13 | metadata:
14 | labels:
15 | app: http-server
16 | spec:
17 | containers:
18 | - name: kuber-app
19 | image: bakavets/kuber
20 | ports:
21 | - containerPort: 8000
22 | volumeMounts:
23 | - mountPath: /data
24 | name: data-volume
25 | volumes:
26 | - name: data-volume
27 | persistentVolumeClaim:
28 | claimName: aws-pvc-kuber
29 |
--------------------------------------------------------------------------------
/lesson-41/k8s/example-4/deploy.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: kuber
5 | labels:
6 | app: kuber
7 | spec:
8 | replicas: 1
9 | selector:
10 | matchLabels:
11 | app: http-server
12 | template:
13 | metadata:
14 | labels:
15 | app: http-server
16 | spec:
17 | containers:
18 | - name: kuber-app
19 | image: bakavets/kuber
20 | ports:
21 | - containerPort: 8000
22 | volumeMounts:
23 | - mountPath: /data
24 | name: data-volume
25 | volumes:
26 | - name: data-volume
27 | persistentVolumeClaim:
28 | claimName: aws-pvc-kuber
29 |
--------------------------------------------------------------------------------
/lesson-26/example-1/deploy.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: kuber-1
5 | labels:
6 | app: kuber-1
7 | spec:
8 | replicas: 1
9 | selector:
10 | matchLabels:
11 | app: http-server-1
12 | template:
13 | metadata:
14 | labels:
15 | app: http-server-1
16 | spec:
17 | containers:
18 | - name: kuber-app
19 | image: bakavets/kuber:v1.0
20 | ports:
21 | - containerPort: 8000
22 | env:
23 | - name: HELLO
24 | value: "Hello"
25 | - name: WORLD
26 | value: "World"
27 | - name: ENV_HELLO_WORLD
28 | value: "$(HELLO)_$(WORLD) from Pod"
29 |
--------------------------------------------------------------------------------
/lesson-34/example-1/nginx.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: nginx-deployment
5 | namespace: example-1
6 | spec:
7 | selector:
8 | matchLabels:
9 | app: nginx
10 | replicas: 1
11 | template:
12 | metadata:
13 | labels:
14 | app: nginx
15 | spec:
16 | containers:
17 | - name: nginx
18 | image: nginx
19 | ports:
20 | - containerPort: 80
21 | ---
22 | apiVersion: v1
23 | kind: Service
24 | metadata:
25 | name: nginx-svc
26 | namespace: example-1
27 | spec:
28 | selector:
29 | app: nginx
30 | ports:
31 | - protocol: TCP
32 | port: 80
33 | targetPort: 80
34 |
--------------------------------------------------------------------------------
/lesson-31/k8s/fluentd/rbac.yaml:
--------------------------------------------------------------------------------
1 | ---
2 | apiVersion: v1
3 | kind: ServiceAccount
4 | metadata:
5 | name: fluentd
6 | namespace: fluentd
7 | ---
8 | apiVersion: rbac.authorization.k8s.io/v1
9 | kind: ClusterRole
10 | metadata:
11 | name: fluentd
12 | rules:
13 | - apiGroups:
14 | - ""
15 | resources:
16 | - pods
17 | - namespaces
18 | verbs:
19 | - get
20 | - list
21 | - watch
22 | ---
23 | kind: ClusterRoleBinding
24 | apiVersion: rbac.authorization.k8s.io/v1
25 | metadata:
26 | name: fluentd
27 | roleRef:
28 | kind: ClusterRole
29 | name: fluentd
30 | apiGroup: rbac.authorization.k8s.io
31 | subjects:
32 | - kind: ServiceAccount
33 | name: fluentd
34 | namespace: fluentd
35 |
--------------------------------------------------------------------------------
/lesson-40/k8s/README.md:
--------------------------------------------------------------------------------
1 | ```for node in $(kubectl get po -o wide | grep -v NODE | awk '{print $7}'); do kubectl get node $node -L topology.kubernetes.io/zone,node.k8s/role | tail -n +2 | awk '{ print $1, "\033[32m" $6 "\033[0m","\033[35m" $7 "\033[0m"}'; done | sort | uniq -c```
2 |
3 | ### Respect PodTopologySpread after rolling upgrades:
4 |
5 | https://github.com/kubernetes/enhancements/issues/3243
6 |
7 | https://github.com/kubernetes/kubernetes/pull/111441
8 |
9 | Issues:
10 | * https://github.com/kubernetes/kubernetes/issues/98215
11 | * https://github.com/kubernetes/kubernetes/issues/105661
12 | * https://stackoverflow.com/questions/66510883/k8s-pod-topology-spread-is-not-respected-after-rollout
13 |
--------------------------------------------------------------------------------
/lesson-43/k8s/example-1/nginx.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: nginx-deployment
5 | namespace: example-1
6 | spec:
7 | selector:
8 | matchLabels:
9 | app: nginx
10 | replicas: 1
11 | template:
12 | metadata:
13 | labels:
14 | app: nginx
15 | spec:
16 | containers:
17 | - name: nginx
18 | image: nginx
19 | ports:
20 | - containerPort: 80
21 | ---
22 | apiVersion: v1
23 | kind: Service
24 | metadata:
25 | name: nginx-svc
26 | namespace: example-1
27 | spec:
28 | selector:
29 | app: nginx
30 | ports:
31 | - protocol: TCP
32 | port: 80
33 | targetPort: 80
34 |
--------------------------------------------------------------------------------
/lesson-12/deploy-svc-app-latest.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: kuber
5 | labels:
6 | app: kuber
7 | spec:
8 | replicas: 2
9 | selector:
10 | matchLabels:
11 | app: http-server
12 | template:
13 | metadata:
14 | labels:
15 | app: http-server
16 | spec:
17 | containers:
18 | - name: kuber-app
19 | image: bakavets/kuber
20 | ports:
21 | - containerPort: 8000
22 | ---
23 | apiVersion: v1
24 | kind: Service
25 | metadata:
26 | name: kuber-service
27 | spec:
28 | selector:
29 | app: http-server
30 | ports:
31 | - protocol: TCP
32 | port: 80
33 | targetPort: 8000
34 |
35 |
--------------------------------------------------------------------------------
/lesson-27/example-2/deploy-1.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: kuber-1
5 | labels:
6 | app: kuber-1
7 | spec:
8 | replicas: 1
9 | selector:
10 | matchLabels:
11 | app: http-server-1
12 | template:
13 | metadata:
14 | labels:
15 | app: http-server-1
16 | spec:
17 | containers:
18 | - name: kuber-app
19 | image: bakavets/kuber:v1.0
20 | ports:
21 | - containerPort: 8000
22 | volumeMounts:
23 | - name: secrets
24 | mountPath: "/etc/secrets"
25 | volumes:
26 | - name: secrets
27 | secret:
28 | secretName: secret-data
29 | defaultMode: 0400
--------------------------------------------------------------------------------
/lesson-49/terraform/variables.tf:
--------------------------------------------------------------------------------
1 | variable "aws_region" {
2 | description = "AWS Region."
3 | default = "eu-west-1"
4 | type = string
5 | }
6 |
7 | variable "default_tags" {
8 | type = map(string)
9 | description = "Default tags for AWS that will be attached to each resource."
10 | default = {
11 | "TerminationDate" = "Permanent",
12 | "Environment" = "Development",
13 | "Team" = "DevOps",
14 | "DeployedBy" = "Terraform",
15 | "OwnerEmail" = "devops@example.com"
16 | }
17 | }
18 |
19 | variable "deployment_prefix" {
20 | description = "Prefix of the deployment."
21 | type = string
22 | default = "demo"
23 | }
24 |
25 |
--------------------------------------------------------------------------------
/lesson-35/terraform/versions.tf:
--------------------------------------------------------------------------------
1 | terraform {
2 | required_version = ">= 1.0.2"
3 |
4 | required_providers {
5 | aws = {
6 | source = "hashicorp/aws"
7 | version = ">= 3.72"
8 | }
9 | kubernetes = {
10 | source = "hashicorp/kubernetes"
11 | version = ">= 2.10"
12 | }
13 | tls = {
14 | source = "hashicorp/tls"
15 | version = "~> 3.0"
16 | }
17 | helm = {
18 | source = "hashicorp/helm"
19 | version = ">= 2.4"
20 | }
21 | gitlab = {
22 | source = "gitlabhq/gitlab"
23 | version = "~> 3.16.1"
24 | }
25 | kubectl = {
26 | source = "gavinbunney/kubectl"
27 | version = ">= 1.14"
28 | }
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/lesson-12/deploy-svc-app-v1.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: kuber-v1
5 | labels:
6 | app: kuber-v1
7 | spec:
8 | replicas: 2
9 | selector:
10 | matchLabels:
11 | app: http-server-v1
12 | template:
13 | metadata:
14 | labels:
15 | app: http-server-v1
16 | spec:
17 | containers:
18 | - name: kuber-app
19 | image: bakavets/kuber:v1.0
20 | ports:
21 | - containerPort: 8000
22 | ---
23 | apiVersion: v1
24 | kind: Service
25 | metadata:
26 | name: kuber-service-v1
27 | spec:
28 | selector:
29 | app: http-server-v1
30 | ports:
31 | - protocol: TCP
32 | port: 80
33 | targetPort: 8000
34 |
35 |
--------------------------------------------------------------------------------
/lesson-12/deploy-svc-app-v2.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: kuber-v2
5 | labels:
6 | app: kuber-v2
7 | spec:
8 | replicas: 2
9 | selector:
10 | matchLabels:
11 | app: http-server-v2
12 | template:
13 | metadata:
14 | labels:
15 | app: http-server-v2
16 | spec:
17 | containers:
18 | - name: kuber-app
19 | image: bakavets/kuber:v2.0
20 | ports:
21 | - containerPort: 8000
22 | ---
23 | apiVersion: v1
24 | kind: Service
25 | metadata:
26 | name: kuber-service-v2
27 | spec:
28 | selector:
29 | app: http-server-v2
30 | ports:
31 | - protocol: TCP
32 | port: 80
33 | targetPort: 8000
34 |
35 |
--------------------------------------------------------------------------------
/lesson-12/deploy-svc-app-v3.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: kuber-v3
5 | labels:
6 | app: kuber-v3
7 | spec:
8 | replicas: 2
9 | selector:
10 | matchLabels:
11 | app: http-server-v3
12 | template:
13 | metadata:
14 | labels:
15 | app: http-server-v3
16 | spec:
17 | containers:
18 | - name: kuber-app
19 | image: bakavets/kuber:v3.0
20 | ports:
21 | - containerPort: 8000
22 | ---
23 | apiVersion: v1
24 | kind: Service
25 | metadata:
26 | name: kuber-service-v3
27 | spec:
28 | selector:
29 | app: http-server-v3
30 | ports:
31 | - protocol: TCP
32 | port: 80
33 | targetPort: 8000
34 |
35 |
--------------------------------------------------------------------------------
/lesson-25/k8s/example-4/ingress.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: networking.k8s.io/v1
2 | kind: Ingress
3 | metadata:
4 | name: app-bakavets-ingress
5 | namespace: demo
6 | annotations:
7 | cert-manager.io/issuer: letsencrypt-prod-issuer
8 | spec:
9 | ingressClassName: nginx # replacement of annotation: kubernetes.io/ingress.class: nginx
10 | tls:
11 | - hosts:
12 | - demo.k8s.bakavets.com
13 | secretName: app-tls-bakavets
14 | rules:
15 | - host: demo.k8s.bakavets.com
16 | http:
17 | paths:
18 | - pathType: Prefix
19 | path: /
20 | backend:
21 | service:
22 | name: kuber-service
23 | port:
24 | number: 80
25 |
--------------------------------------------------------------------------------
/lesson-33/terraform/helm-alb.tf:
--------------------------------------------------------------------------------
1 | resource "helm_release" "aws_load_balancer_controller" {
2 | name = "aws-load-balancer-controller"
3 | repository = "https://aws.github.io/eks-charts"
4 | chart = "aws-load-balancer-controller"
5 | version = "1.4.3"
6 | namespace = local.k8s_service_account_lb_namespace
7 |
8 | set {
9 | name = "clusterName"
10 | value = module.eks.cluster_id
11 | }
12 |
13 | set {
14 | name = "serviceAccount.name"
15 | value = local.k8s_service_account_lb_name
16 | }
17 |
18 | set {
19 | name = "serviceAccount.annotations.eks\\.amazonaws\\.com/role-arn"
20 | value = module.iam_assumable_role_aws_load_balancer_controller.iam_role_arn
21 | }
22 |
23 | }
24 |
--------------------------------------------------------------------------------
/lesson-25/k8s/example-3/deploy-svc-app.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: kuber
5 | labels:
6 | app: kuber
7 | spec:
8 | replicas: 2
9 | selector:
10 | matchLabels:
11 | app: http-server
12 | template:
13 | metadata:
14 | labels:
15 | app: http-server
16 | spec:
17 | containers:
18 | - name: kuber-app
19 | image: bakavets/kuber
20 | ports:
21 | - containerPort: 8000
22 | ---
23 | apiVersion: v1
24 | kind: Service
25 | metadata:
26 | name: kuber-service
27 | spec:
28 | selector:
29 | app: http-server
30 | ports:
31 | - protocol: TCP
32 | port: 80
33 | targetPort: 8000
34 | type: ClusterIP
35 |
36 |
--------------------------------------------------------------------------------
/lesson-16/deploy-svc-app-1.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: kuber-1
5 | labels:
6 | app: kuber-1
7 | spec:
8 | replicas: 2
9 | selector:
10 | matchLabels:
11 | app: http-server-1
12 | template:
13 | metadata:
14 | labels:
15 | app: http-server-1
16 | spec:
17 | containers:
18 | - name: kuber-app
19 | image: bakavets/kuber:v1.0
20 | ports:
21 | - containerPort: 8000
22 | ---
23 | apiVersion: v1
24 | kind: Service
25 | metadata:
26 | name: kuber-service-1
27 | spec:
28 | selector:
29 | app: http-server-1
30 | ports:
31 | - protocol: TCP
32 | port: 80
33 | targetPort: 8000
34 | type: ClusterIP
35 |
36 |
--------------------------------------------------------------------------------
/lesson-16/deploy-svc-app-2.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: kuber-2
5 | labels:
6 | app: kuber-2
7 | spec:
8 | replicas: 2
9 | selector:
10 | matchLabels:
11 | app: http-server-2
12 | template:
13 | metadata:
14 | labels:
15 | app: http-server-2
16 | spec:
17 | containers:
18 | - name: kuber-app
19 | image: bakavets/kuber:v2.0
20 | ports:
21 | - containerPort: 8000
22 | ---
23 | apiVersion: v1
24 | kind: Service
25 | metadata:
26 | name: kuber-service-2
27 | spec:
28 | selector:
29 | app: http-server-2
30 | ports:
31 | - protocol: TCP
32 | port: 80
33 | targetPort: 8000
34 | type: ClusterIP
35 |
36 |
--------------------------------------------------------------------------------
/lesson-16/prod_ClusterIssuer.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: cert-manager.io/v1
2 | kind: ClusterIssuer
3 | metadata:
4 | name: letsencrypt-prod
5 | spec:
6 | acme:
7 | # You must replace this email address with your own.
8 | # Let's Encrypt will use this to contact you about expiring
9 | # certificates, and issues related to your account.
10 | email: bakavets.com@gmail.com
11 | server: https://acme-v02.api.letsencrypt.org/directory
12 | privateKeySecretRef:
13 | # Secret resource that will be used to store the ACME account's private key.
14 | name: letsencrypt-prod-private-key
15 | # Add a single challenge solver, HTTP01 using nginx
16 | solvers:
17 | - http01:
18 | ingress:
19 | class: nginx
--------------------------------------------------------------------------------
/lesson-21-22/1-deploy-two-containers.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: Pod
3 | metadata:
4 | name: two-containers
5 | spec:
6 | restartPolicy: Never
7 | containers:
8 | - name: nginx-container
9 | image: nginx
10 | volumeMounts:
11 | - name: shared-data
12 | mountPath: /usr/share/nginx/html
13 | readOnly: true
14 | - name: debian-container
15 | image: debian
16 | volumeMounts:
17 | - name: shared-data
18 | mountPath: /pod-data
19 | command: ["/bin/sh"]
20 | args: ["-c", "while true; do echo Hello from the debian container date: $(date)> /pod-data/index.html; sleep 1; done"]
21 | volumes:
22 | - name: shared-data
23 | emptyDir: # {}
24 | medium: Memory
--------------------------------------------------------------------------------
/lesson-15/docker/server-default.py:
--------------------------------------------------------------------------------
1 | from http.server import HTTPServer, BaseHTTPRequestHandler
2 | import socket
3 | import sys
4 |
5 | class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
6 | def do_GET(self):
7 | self.send_response(200)
8 | self.send_header('Content-type','text/html')
9 | self.end_headers()
10 | self.wfile.write(b'Hello from hostname: ' + socket.gethostname().encode() + b'
')
11 | self.wfile.write(b'Text arg: ' + str(string_arg).encode() + b'
')
12 |
13 | string_arg = sys.argv[1]
14 | SERVER_PORT = 8000
15 | httpd = HTTPServer(('0.0.0.0', SERVER_PORT), SimpleHTTPRequestHandler)
16 | print('Listening on port %s ...' % SERVER_PORT)
17 | httpd.serve_forever()
--------------------------------------------------------------------------------
/lesson-25/k8s/example-1/deploy-svc-app-1.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: kuber-1
5 | labels:
6 | app: kuber-1
7 | spec:
8 | replicas: 2
9 | selector:
10 | matchLabels:
11 | app: http-server-1
12 | template:
13 | metadata:
14 | labels:
15 | app: http-server-1
16 | spec:
17 | containers:
18 | - name: kuber-app
19 | image: bakavets/kuber:v1.0
20 | ports:
21 | - containerPort: 8000
22 | ---
23 | apiVersion: v1
24 | kind: Service
25 | metadata:
26 | name: kuber-service-1
27 | spec:
28 | selector:
29 | app: http-server-1
30 | ports:
31 | - protocol: TCP
32 | port: 80
33 | targetPort: 8000
34 | type: ClusterIP
35 |
36 |
--------------------------------------------------------------------------------
/lesson-25/k8s/example-1/deploy-svc-app-2.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: kuber-2
5 | labels:
6 | app: kuber-2
7 | spec:
8 | replicas: 2
9 | selector:
10 | matchLabels:
11 | app: http-server-2
12 | template:
13 | metadata:
14 | labels:
15 | app: http-server-2
16 | spec:
17 | containers:
18 | - name: kuber-app
19 | image: bakavets/kuber:v2.0
20 | ports:
21 | - containerPort: 8000
22 | ---
23 | apiVersion: v1
24 | kind: Service
25 | metadata:
26 | name: kuber-service-2
27 | spec:
28 | selector:
29 | app: http-server-2
30 | ports:
31 | - protocol: TCP
32 | port: 80
33 | targetPort: 8000
34 | type: ClusterIP
35 |
36 |
--------------------------------------------------------------------------------
/lesson-25/k8s/example-2/deploy-svc-app-3.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: kuber-3
5 | labels:
6 | app: kuber-3
7 | spec:
8 | replicas: 2
9 | selector:
10 | matchLabels:
11 | app: http-server-3
12 | template:
13 | metadata:
14 | labels:
15 | app: http-server-3
16 | spec:
17 | containers:
18 | - name: kuber-app
19 | image: bakavets/kuber:v3.0
20 | ports:
21 | - containerPort: 8000
22 | ---
23 | apiVersion: v1
24 | kind: Service
25 | metadata:
26 | name: kuber-service-3
27 | spec:
28 | selector:
29 | app: http-server-3
30 | ports:
31 | - protocol: TCP
32 | port: 80
33 | targetPort: 8000
34 | type: ClusterIP
35 |
36 |
--------------------------------------------------------------------------------
/lesson-25/k8s/example-3/deploy-svc-app-4.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: kuber-4
5 | labels:
6 | app: kuber-4
7 | spec:
8 | replicas: 2
9 | selector:
10 | matchLabels:
11 | app: http-server-4
12 | template:
13 | metadata:
14 | labels:
15 | app: http-server-4
16 | spec:
17 | containers:
18 | - name: kuber-app
19 | image: bakavets/kuber:v1.0
20 | ports:
21 | - containerPort: 8000
22 | ---
23 | apiVersion: v1
24 | kind: Service
25 | metadata:
26 | name: kuber-service-4
27 | spec:
28 | selector:
29 | app: http-server-4
30 | ports:
31 | - protocol: TCP
32 | port: 80
33 | targetPort: 8000
34 | type: ClusterIP
35 |
36 |
--------------------------------------------------------------------------------
/lesson-25/k8s/example-3/deploy-svc-app-5.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: kuber-5
5 | labels:
6 | app: kuber-5
7 | spec:
8 | replicas: 2
9 | selector:
10 | matchLabels:
11 | app: http-server-5
12 | template:
13 | metadata:
14 | labels:
15 | app: http-server-5
16 | spec:
17 | containers:
18 | - name: kuber-app
19 | image: bakavets/kuber:v2.0
20 | ports:
21 | - containerPort: 8000
22 | ---
23 | apiVersion: v1
24 | kind: Service
25 | metadata:
26 | name: kuber-service-5
27 | spec:
28 | selector:
29 | app: http-server-5
30 | ports:
31 | - protocol: TCP
32 | port: 80
33 | targetPort: 8000
34 | type: ClusterIP
35 |
36 |
--------------------------------------------------------------------------------
/lesson-16/staging_ClusterIssuer.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: cert-manager.io/v1
2 | kind: ClusterIssuer
3 | metadata:
4 | name: letsencrypt-staging
5 | spec:
6 | acme:
7 | # You must replace this email address with your own.
8 | # Let's Encrypt will use this to contact you about expiring
9 | # certificates, and issues related to your account.
10 | email: bakavets.com@gmail.com
11 | server: https://acme-staging-v02.api.letsencrypt.org/directory
12 | privateKeySecretRef:
13 | # Secret resource that will be used to store the ACME account's private key.
14 | name: letsencrypt-staging-private-key
15 | # Add a single challenge solver, HTTP01 using nginx
16 | solvers:
17 | - http01:
18 | ingress:
19 | class: nginx
--------------------------------------------------------------------------------
/lesson-34/example-2/sa.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: ServiceAccount
3 | metadata:
4 | name: app-sa-2
5 | namespace: example-2
6 | ---
7 | apiVersion: rbac.authorization.k8s.io/v1
8 | kind: ClusterRole
9 | metadata:
10 | # "namespace" omitted since ClusterRoles are not namespaced
11 | name: example-2-cr
12 | rules:
13 | - apiGroups: ["apps"]
14 | resources: ["deployments"]
15 | verbs: ["list"]
16 | ---
17 | apiVersion: rbac.authorization.k8s.io/v1
18 | kind: ClusterRoleBinding
19 | metadata:
20 | name: example-2-crb
21 | subjects:
22 | - kind: ServiceAccount
23 | name: app-sa-2
24 | namespace: example-2
25 | roleRef:
26 | kind: ClusterRole
27 | name: example-2-cr
28 | apiGroup: rbac.authorization.k8s.io
29 |
--------------------------------------------------------------------------------
/lesson-27/example-2/deploy-2.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: kuber-2
5 | labels:
6 | app: kuber-2
7 | spec:
8 | replicas: 1
9 | selector:
10 | matchLabels:
11 | app: http-server-2
12 | template:
13 | metadata:
14 | labels:
15 | app: http-server-2
16 | spec:
17 | containers:
18 | - name: kuber-app
19 | image: bakavets/kuber:v2.0
20 | ports:
21 | - containerPort: 8000
22 | volumeMounts:
23 | - name: secrets
24 | mountPath: "/etc/secrets"
25 | volumes:
26 | - name: secrets
27 | secret:
28 | secretName: secret-data
29 | items:
30 | - key: username
31 | path: my-group/my-username
--------------------------------------------------------------------------------
/lesson-13/kuber-deploy.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: kuber-default
5 | labels:
6 | app: kuber
7 | spec:
8 | replicas: 1
9 | selector:
10 | matchLabels:
11 | app: http-server-default
12 | template:
13 | metadata:
14 | labels:
15 | app: http-server-default
16 | spec:
17 | containers:
18 | - name: kuber-app
19 | image: bakavets/kuber:v1.0
20 | ports:
21 | - containerPort: 8000
22 | ---
23 | apiVersion: v1
24 | kind: Service
25 | metadata:
26 | name: kuber-default-service
27 | spec:
28 | selector:
29 | app: http-server-default
30 | ports:
31 | - protocol: TCP
32 | port: 80
33 | targetPort: 8000
34 | nodePort: 30001
35 | type: NodePort
--------------------------------------------------------------------------------
/lesson-25/k8s/README.md:
--------------------------------------------------------------------------------
1 | ## Install NGINX Ingress Controller: https://kubernetes.github.io/ingress-nginx/deploy/#aws
2 |
3 | NGINX Ingress Controller ingressClassName: https://kubernetes.github.io/ingress-nginx/user-guide/basic-usage/
4 |
5 | # Install Cert-manager using Helm
6 |
7 | ```bash
8 | helm repo add jetstack https://charts.jetstack.io
9 | ```
10 |
11 | ```bash
12 | helm repo update
13 | ```
14 |
15 | ```bash
16 | helm install cert-manager jetstack/cert-manager --namespace cert-manager --create-namespace --version v1.7.0 -f values-cert-manager.yaml
17 | ```
18 |
19 | # Upgrade Cert-manager using Helm
20 |
21 | ```bash
22 | helm upgrade cert-manager jetstack/cert-manager --namespace cert-manager --create-namespace --version v1.7.0 -f values-cert-manager.yaml
23 | ```
--------------------------------------------------------------------------------
/lesson-34/example-3/sa.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: ServiceAccount
3 | metadata:
4 | name: app-sa-3
5 | namespace: example-3
6 | ---
7 | apiVersion: rbac.authorization.k8s.io/v1
8 | kind: ClusterRole
9 | metadata:
10 | # "namespace" omitted since ClusterRoles are not namespaced
11 | name: example-3-cr
12 | rules:
13 | - apiGroups: ["apps"]
14 | resources: ["deployments"]
15 | verbs: ["list"]
16 | ---
17 | apiVersion: rbac.authorization.k8s.io/v1
18 | kind: RoleBinding
19 | metadata:
20 | name: rb
21 | namespace: example-3
22 | roleRef:
23 | apiGroup: rbac.authorization.k8s.io
24 | kind: ClusterRole
25 | name: example-3-cr
26 | subjects:
27 | - kind: ServiceAccount
28 | name: app-sa-3
29 | namespace: example-3
30 |
--------------------------------------------------------------------------------
/lesson-49/README.md:
--------------------------------------------------------------------------------
1 | Terraform
2 | ```
3 | export AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
4 | export AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
5 |
6 | cd terraform
7 | terraform init
8 | terraform plan
9 | terraform apply
10 |
11 | aws configure --profile personal
12 | aws eks update-kubeconfig --name demo-eks-cluster --profile personal --region eu-west-1
13 | ```
14 |
15 | K8s
16 | ```
17 | cd k8s
18 | kubectl create ns gitlab-space-external
19 | kubectl apply -f gitlab-runner-secret.yaml
20 |
21 | helm repo add gitlab https://charts.gitlab.io
22 | helm repo update gitlab
23 | helm install --namespace gitlab-space-external gitlab-runner -f gitlab-runner-values.yaml gitlab/gitlab-runner --version 0.57.0
24 |
25 | kubectl apply -f sa-kaniko.yaml
26 | ```
27 |
--------------------------------------------------------------------------------
/lesson-25/k8s/example-4/deploy-svc-app.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: kuber
5 | namespace: demo
6 | labels:
7 | app: kuber
8 | spec:
9 | replicas: 2
10 | selector:
11 | matchLabels:
12 | app: http-server
13 | template:
14 | metadata:
15 | labels:
16 | app: http-server
17 | spec:
18 | containers:
19 | - name: kuber-app
20 | image: bakavets/kuber
21 | ports:
22 | - containerPort: 8000
23 | ---
24 | apiVersion: v1
25 | kind: Service
26 | metadata:
27 | name: kuber-service
28 | namespace: demo
29 | spec:
30 | selector:
31 | app: http-server
32 | ports:
33 | - protocol: TCP
34 | port: 80
35 | targetPort: 8000
36 | type: ClusterIP
37 |
38 |
--------------------------------------------------------------------------------
/lesson-40/k8s/kind/topology.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: zone-spread-topology
5 | labels:
6 | app: kuber
7 | spec:
8 | replicas: 6
9 | selector:
10 | matchLabels:
11 | app: http-server
12 | template:
13 | metadata:
14 | labels:
15 | app: http-server
16 | spec:
17 | containers:
18 | - name: kuber-app
19 | image: nginx
20 | topologySpreadConstraints:
21 | - maxSkew: 1
22 | topologyKey: topology.kubernetes.io/zone
23 | whenUnsatisfiable: DoNotSchedule
24 | labelSelector:
25 | matchLabels:
26 | app: http-server
27 | # matchLabelKeys:
28 | # - app
29 | # - pod-template-hash
30 |
--------------------------------------------------------------------------------
/lesson-26/example-3/pod.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: Pod
3 | metadata:
4 | name: demo-pod
5 | spec:
6 | containers:
7 | - name: container
8 | image: busybox
9 | command: [ "/bin/sh", "-c", "echo Interval = $(INTERVAL). Desired count of print = $(COUNT). Text: $(TEXT_ARG)"]
10 | env:
11 | - name: INTERVAL
12 | valueFrom:
13 | configMapKeyRef:
14 | name: demo-cm
15 | key: interval
16 | - name: COUNT
17 | valueFrom:
18 | configMapKeyRef:
19 | name: demo-cm
20 | key: count
21 | - name: TEXT_ARG
22 | valueFrom:
23 | configMapKeyRef:
24 | name: demo-cm
25 | key: config.ini
26 | restartPolicy: Never
--------------------------------------------------------------------------------
/lesson-26/example-2/kuber-deploy.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: kuber-args
5 | labels:
6 | app: kuber
7 | spec:
8 | replicas: 1
9 | selector:
10 | matchLabels:
11 | app: http-server-args
12 | template:
13 | metadata:
14 | labels:
15 | app: http-server-args
16 | spec:
17 | containers:
18 | - name: kuber-app
19 | image: bakavets/kuber:v1.0-args
20 | args: ["$(INTERVAL)","$(COUNT)","$(TEXT_ARG)"]
21 | ports:
22 | - containerPort: 8000
23 | env:
24 | - name: INTERVAL
25 | value: "3"
26 | - name: COUNT
27 | value: "4"
28 | - name: TEXT_ARG
29 | value: "Interval = $(INTERVAL). Desired count of print = $(COUNT)."
30 |
31 |
--------------------------------------------------------------------------------
/lesson-42/k8s/example-1/deploy.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: kuber
5 | labels:
6 | app: kuber
7 | spec:
8 | replicas: 2
9 | selector:
10 | matchLabels:
11 | app: http-server
12 | template:
13 | metadata:
14 | labels:
15 | app: http-server
16 | spec:
17 | # securityContext:
18 | # runAsUser: 1100
19 | # runAsGroup: 3000
20 | # fsGroup: 2000
21 | containers:
22 | - name: kuber-app
23 | image: bakavets/kuber
24 | ports:
25 | - containerPort: 8000
26 | volumeMounts:
27 | - mountPath: /data
28 | name: data-volume
29 | volumes:
30 | - name: data-volume
31 | persistentVolumeClaim:
32 | claimName: efs-claim
33 |
--------------------------------------------------------------------------------
/lesson-32/k8s/example-2/deploy-svc-app-1.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: kuber-1
5 | namespace: example-2
6 | labels:
7 | app: kuber-1
8 | spec:
9 | replicas: 2
10 | selector:
11 | matchLabels:
12 | app: http-server-1
13 | template:
14 | metadata:
15 | labels:
16 | app: http-server-1
17 | spec:
18 | containers:
19 | - name: kuber-app
20 | image: bakavets/kuber:v1.0
21 | ports:
22 | - containerPort: 8000
23 | ---
24 | apiVersion: v1
25 | kind: Service
26 | metadata:
27 | name: kuber-service-1
28 | namespace: example-2
29 | spec:
30 | selector:
31 | app: http-server-1
32 | ports:
33 | - protocol: TCP
34 | port: 80
35 | targetPort: 8000
36 | type: NodePort
37 |
38 |
--------------------------------------------------------------------------------
/lesson-32/k8s/example-2/deploy-svc-app-2.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: kuber-2
5 | namespace: example-2
6 | labels:
7 | app: kuber-2
8 | spec:
9 | replicas: 2
10 | selector:
11 | matchLabels:
12 | app: http-server-2
13 | template:
14 | metadata:
15 | labels:
16 | app: http-server-2
17 | spec:
18 | containers:
19 | - name: kuber-app
20 | image: bakavets/kuber:v2.0
21 | ports:
22 | - containerPort: 8000
23 | ---
24 | apiVersion: v1
25 | kind: Service
26 | metadata:
27 | name: kuber-service-2
28 | namespace: example-2
29 | spec:
30 | selector:
31 | app: http-server-2
32 | ports:
33 | - protocol: TCP
34 | port: 80
35 | targetPort: 8000
36 | type: NodePort
37 |
38 |
--------------------------------------------------------------------------------
/lesson-44-45-46-47-48/repo-examples/k8s-manifests/kuber.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: kuber-default
5 | namespace: default
6 | labels:
7 | app: kuber
8 | spec:
9 | replicas: 1
10 | selector:
11 | matchLabels:
12 | app: http-server-default
13 | template:
14 | metadata:
15 | labels:
16 | app: http-server-default
17 | spec:
18 | containers:
19 | - name: kuber-app
20 | image: bakavets/kuber:v1.0
21 | ports:
22 | - containerPort: 8000
23 | ---
24 | apiVersion: v1
25 | kind: Service
26 | metadata:
27 | name: kuber-default-service
28 | namespace: default
29 | spec:
30 | selector:
31 | app: http-server-default
32 | ports:
33 | - protocol: TCP
34 | port: 80
35 | targetPort: 8000
36 |
--------------------------------------------------------------------------------
/lesson-44-45-46-47-48/terraform/versions.tf:
--------------------------------------------------------------------------------
1 | terraform {
2 | required_version = ">= 1.0.2"
3 |
4 | required_providers {
5 | aws = {
6 | source = "hashicorp/aws"
7 | version = ">= 3.72"
8 | }
9 | kubernetes = {
10 | source = "hashicorp/kubernetes"
11 | version = ">= 2.10"
12 | }
13 | tls = {
14 | source = "hashicorp/tls"
15 | version = "~> 3.0"
16 | }
17 | helm = {
18 | source = "hashicorp/helm"
19 | version = ">= 2.4"
20 | }
21 | gitlab = {
22 | source = "gitlabhq/gitlab"
23 | version = "~> 3.16.1"
24 | }
25 | kubectl = {
26 | source = "gavinbunney/kubectl"
27 | version = ">= 1.14"
28 | }
29 | random = {
30 | source = "hashicorp/random"
31 | version = ">= 3.1"
32 | }
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/lesson-26/example-5/README.md:
--------------------------------------------------------------------------------
1 | Create a Kubernetes Configmap with custom nginx.conf using kubectl:
2 |
3 | ```bash
4 | kubectl create configmap nginx-config --from-file=nginx.conf
5 | ```
6 |
7 | ## Create ConfigMaps from literal values
8 |
9 | You can use kubectl create configmap with the --from-literal argument to define a literal value from the command line:
10 | ```bash
11 | kubectl create configmap config --from-literal=interval=7 --from-literal=count=3 --from-literal=config.ini="Hello from ConfigMap"
12 | ```
13 |
14 | ## Create ConfigMaps from folder:
15 |
16 | ```bash
17 | kubectl create configmap my-config --from-file=configs/
18 | ```
19 |
20 | ## Use the option --from-env-file to create a ConfigMap from an env-file, for example:
21 |
22 | ```bash
23 | kubectl create configmap config-env-file --from-env-file=env-file.properties
24 | ```
--------------------------------------------------------------------------------
/lesson-15/kuber-deploy.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: kuber-args
5 | labels:
6 | app: kuber
7 | spec:
8 | replicas: 1
9 | selector:
10 | matchLabels:
11 | app: http-server-args
12 | template:
13 | metadata:
14 | labels:
15 | app: http-server-args
16 | spec:
17 | containers:
18 | - name: kuber-app
19 | image: bakavets/kuber:v1.0-args
20 | args:
21 | - "3"
22 | - "2"
23 | - text-temp
24 | ports:
25 | - containerPort: 8000
26 | ---
27 | apiVersion: v1
28 | kind: Service
29 | metadata:
30 | name: kuber-args-service
31 | spec:
32 | selector:
33 | app: http-server-args
34 | ports:
35 | - protocol: TCP
36 | port: 80
37 | targetPort: 8000
38 | nodePort: 30001
39 | type: NodePort
--------------------------------------------------------------------------------
/lesson-25/terraform/variables.tf:
--------------------------------------------------------------------------------
1 | variable "aws_region" {
2 | description = "AWS Region"
3 | default = "eu-north-1"
4 | }
5 |
6 | variable "default_tags" {
7 | type = map(string)
8 | description = "Default tags for AWS that will be attached to each resource"
9 | default = {
10 | "TerminationDate" = "Permanent",
11 | "Environment" = "Development",
12 | "Team" = "DevOps",
13 | "DeployedBy" = "Terraform",
14 | "OwnerEmail" = "devops@example.com"
15 | }
16 | }
17 |
18 | variable "deployment_prefix" {
19 | description = "Prefix of the deployment"
20 | type = string
21 | default = "demo"
22 | }
23 |
24 | variable "aws_route53_hosted_zone_id" {
25 | description = "AWS Route53 Hosted zone ID"
26 | type = string
27 | default = "Z04182373OABFAT240LL1"
28 | }
29 |
--------------------------------------------------------------------------------
/lesson-27/example-1/deploy-2.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: kuber-2
5 | labels:
6 | app: kuber-2
7 | spec:
8 | replicas: 1
9 | selector:
10 | matchLabels:
11 | app: http-server-2
12 | template:
13 | metadata:
14 | labels:
15 | app: http-server-2
16 | spec:
17 | containers:
18 | - name: kuber-app
19 | image: bakavets/kuber:v2.0
20 | ports:
21 | - containerPort: 8000
22 | env:
23 | - name: SECRET_USERNAME
24 | valueFrom:
25 | secretKeyRef:
26 | name: secret-stringdata
27 | key: username
28 | - name: SECRET_PASSWORD
29 | valueFrom:
30 | secretKeyRef:
31 | name: secret-stringdata
32 | key: password
--------------------------------------------------------------------------------
/lesson-39/k8s/example-2/with-prefer-no-schedule-taint.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: with-prefer-no-schedule-taint
5 | labels:
6 | app: kuber
7 | spec:
8 | replicas: 4
9 | selector:
10 | matchLabels:
11 | app: http-server
12 | template:
13 | metadata:
14 | labels:
15 | app: http-server
16 | spec:
17 | containers:
18 | - name: kuber-app
19 | image: bakavets/kuber
20 | ports:
21 | - containerPort: 8000
22 | resources:
23 | limits:
24 | cpu: 1
25 | memory: 2Gi
26 | requests:
27 | cpu: 1
28 | memory: 512Mi
29 | tolerations:
30 | - key: node.k8s/app-role
31 | operator: Exists
32 | effect: PreferNoSchedule
33 |
--------------------------------------------------------------------------------
/lesson-43/k8s/example-1/deploy.yaml:
--------------------------------------------------------------------------------
1 | ---
2 | apiVersion: v1
3 | kind: Namespace
4 | metadata:
5 | name: example-1
6 | ---
7 | apiVersion: apps/v1
8 | kind: Deployment
9 | metadata:
10 | name: kuber
11 | namespace: example-1
12 | labels:
13 | app: kuber
14 | spec:
15 | replicas: 2
16 | selector:
17 | matchLabels:
18 | app: http-server
19 | template:
20 | metadata:
21 | labels:
22 | app: http-server
23 | spec:
24 | containers:
25 | - name: kuber-app
26 | image: bakavets/kuber
27 | ports:
28 | - containerPort: 8000
29 | ---
30 | apiVersion: v1
31 | kind: Service
32 | metadata:
33 | name: kuber-service
34 | namespace: example-1
35 | spec:
36 | selector:
37 | app: http-server
38 | ports:
39 | - protocol: TCP
40 | port: 80
41 | targetPort: 8000
42 |
--------------------------------------------------------------------------------
/lesson-30/argocd/applications/ingress-nginx.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: argoproj.io/v1alpha1
2 | kind: Application
3 | metadata:
4 | name: ingress-nginx
5 | namespace: argocd
6 | finalizers:
7 | - resources-finalizer.argocd.argoproj.io
8 | spec:
9 | project: infrastructure
10 |
11 | source:
12 | repoURL: 'https://kubernetes.github.io/ingress-nginx'
13 | targetRevision: 4.1.1
14 | chart: ingress-nginx
15 | helm:
16 | parameters:
17 | - name: "controller.replicaCount"
18 | value: "2"
19 | - name: "controller.service.type"
20 | value: "NodePort"
21 |
22 | destination:
23 | namespace: ingress-nginx
24 | server: https://kubernetes.default.svc
25 |
26 | # Sync policy
27 | syncPolicy:
28 | automated:
29 | prune: true
30 | selfHeal: true
31 | syncOptions:
32 | - CreateNamespace=true
33 |
--------------------------------------------------------------------------------
/lesson-25/k8s/prod-clusterissuer.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: cert-manager.io/v1
2 | kind: ClusterIssuer
3 | metadata:
4 | name: letsencrypt-prod
5 | spec:
6 | acme:
7 | # You must replace this email address with your own.
8 | # Let's Encrypt will use this to contact you about expiring
9 | # certificates, and issues related to your account.
10 | email: bakavets.com@gmail.com
11 | server: https://acme-v02.api.letsencrypt.org/directory
12 | privateKeySecretRef:
13 | # Secret resource that will be used to store the ACME account's private key.
14 | name: letsencrypt-prod-private-key
15 | solvers:
16 | # this solver handles kubxr.com challenges
17 | - selector:
18 | dnsZones:
19 | - "kubxr.com"
20 | dns01:
21 | route53:
22 | region: eu-north-1
23 | hostedZoneID: Z04182373OABFAT240LL1
24 |
--------------------------------------------------------------------------------
/lesson-43/k8s/example-2/deploy.yaml:
--------------------------------------------------------------------------------
1 | ---
2 | apiVersion: v1
3 | kind: Namespace
4 | metadata:
5 | name: example-2
6 | ---
7 | apiVersion: apps/v1
8 | kind: Deployment
9 | metadata:
10 | name: kuber-2
11 | namespace: example-2
12 | labels:
13 | app: kuber-2
14 | spec:
15 | replicas: 1
16 | selector:
17 | matchLabels:
18 | app: http-server-2
19 | template:
20 | metadata:
21 | labels:
22 | app: http-server-2
23 | spec:
24 | containers:
25 | - name: kuber-app
26 | image: bakavets/kuber:v2.0
27 | ports:
28 | - containerPort: 8000
29 | ---
30 | apiVersion: v1
31 | kind: Service
32 | metadata:
33 | name: kuber-service-2
34 | namespace: example-2
35 | spec:
36 | selector:
37 | app: http-server-2
38 | ports:
39 | - protocol: TCP
40 | port: 80
41 | targetPort: 8000
42 |
--------------------------------------------------------------------------------
/lesson-39/k8s/example-3/with-no-execute-taint.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: with-no-execute-taint
5 | labels:
6 | app: kuber
7 | spec:
8 | replicas: 3
9 | selector:
10 | matchLabels:
11 | app: http-server
12 | template:
13 | metadata:
14 | labels:
15 | app: http-server
16 | spec:
17 | containers:
18 | - name: kuber-app
19 | image: bakavets/kuber
20 | ports:
21 | - containerPort: 8000
22 | resources:
23 | limits:
24 | cpu: 1
25 | memory: 2Gi
26 | requests:
27 | cpu: 1
28 | memory: 512Mi
29 | tolerations:
30 | - key: "gpu"
31 | operator: "Equal"
32 | value: "true"
33 | effect: "NoExecute"
34 | # tolerationSeconds: 180
35 |
--------------------------------------------------------------------------------
/lesson-25/k8s/staging-clusterissuer.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: cert-manager.io/v1
2 | kind: ClusterIssuer
3 | metadata:
4 | name: letsencrypt-staging
5 | spec:
6 | acme:
7 | # You must replace this email address with your own.
8 | # Let's Encrypt will use this to contact you about expiring
9 | # certificates, and issues related to your account.
10 | email: bakavets.com@gmail.com
11 | server: https://acme-staging-v02.api.letsencrypt.org/directory
12 | privateKeySecretRef:
13 | # Secret resource that will be used to store the ACME account's private key.
14 | name: letsencrypt-staging-private-key
15 | solvers:
16 | # this solver handles kubxr.com challenges
17 | - selector:
18 | dnsZones:
19 | - "kubxr.com"
20 | dns01:
21 | route53:
22 | region: eu-north-1
23 | hostedZoneID: Z04182373OABFAT240LL1
24 |
--------------------------------------------------------------------------------
/lesson-34/example-3/app.yaml:
--------------------------------------------------------------------------------
1 | ---
2 | apiVersion: v1
3 | kind: Namespace
4 | metadata:
5 | name: example-3
6 | ---
7 | apiVersion: apps/v1
8 | kind: Deployment
9 | metadata:
10 | name: kuber
11 | namespace: example-3
12 | labels:
13 | app: kuber
14 | spec:
15 | replicas: 1
16 | selector:
17 | matchLabels:
18 | app: http-server
19 | template:
20 | metadata:
21 | labels:
22 | app: http-server
23 | spec:
24 | serviceAccountName: app-sa-3
25 | containers:
26 | - name: kuber-app
27 | image: bakavets/kuber
28 | ports:
29 | - containerPort: 8000
30 | ---
31 | apiVersion: v1
32 | kind: Service
33 | metadata:
34 | name: kuber-service
35 | namespace: example-3
36 | spec:
37 | selector:
38 | app: http-server
39 | ports:
40 | - protocol: TCP
41 | port: 80
42 | targetPort: 8000
43 |
--------------------------------------------------------------------------------
/lesson-13/kuber-deploy-readinessProbe-http.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: kuber-http-readinessprobe
5 | labels:
6 | app: kuber
7 | spec:
8 | replicas: 1
9 | selector:
10 | matchLabels:
11 | app: http-server-default
12 | template:
13 | metadata:
14 | labels:
15 | app: http-server-default
16 | spec:
17 | containers:
18 | - name: kuber-app
19 | image: bakavets/kuber:v1.0-unhealthy
20 | ports:
21 | - containerPort: 8000
22 | readinessProbe:
23 | httpGet:
24 | path: /healthcheck
25 | port: 8000
26 | initialDelaySeconds: 5
27 | periodSeconds: 5
28 | livenessProbe:
29 | httpGet:
30 | path: /healthcheck
31 | port: 8000
32 | initialDelaySeconds: 5
33 | periodSeconds: 5
34 |
35 |
--------------------------------------------------------------------------------
/lesson-27/example-1/README.md:
--------------------------------------------------------------------------------
1 | ### Create a Secret using kubectl from-file:
2 |
3 | ```bash
4 | echo -n 'admin' > ./username.txt
5 | echo -n 'superpass12345&*' > ./password.txt
6 | ```
7 |
8 | ```bash
9 | kubectl create secret generic db-user-pass-from-file \
10 | --from-file=./username.txt \
11 | --from-file=./password.txt
12 | ```
13 |
14 | ```bash
15 | kubectl get secret db-user-pass-from-file -o yaml
16 | ```
17 |
18 | ### Create a Secret using kubectl from-literal:
19 |
20 | ```bash
21 | kubectl create secret generic db-user-pass-from-literal \
22 | --from-literal=username=devuser \
23 | --from-literal=password='P!S?*r$zDsY'
24 | ```
25 |
26 | ### Decoding the Secret:
27 |
28 | ```bash
29 | kubectl get secret db-user-pass-from-file -o jsonpath='{.data}'
30 | ```
31 |
32 | ```bash
33 | kubectl get secret db-user-pass-from-literal -o jsonpath='{.data.password}' | base64 --decode
34 | ```
35 |
--------------------------------------------------------------------------------
/lesson-34/example-1/app.yaml:
--------------------------------------------------------------------------------
1 | ---
2 | apiVersion: v1
3 | kind: Namespace
4 | metadata:
5 | name: example-1
6 | ---
7 | apiVersion: apps/v1
8 | kind: Deployment
9 | metadata:
10 | name: kuber-1
11 | namespace: example-1
12 | labels:
13 | app: kuber-1
14 | spec:
15 | replicas: 1
16 | selector:
17 | matchLabels:
18 | app: http-server-1
19 | template:
20 | metadata:
21 | labels:
22 | app: http-server-1
23 | spec:
24 | serviceAccountName: app-sa
25 | containers:
26 | - name: kuber-app
27 | image: bakavets/kuber:v1.0
28 | ports:
29 | - containerPort: 8000
30 | ---
31 | apiVersion: v1
32 | kind: Service
33 | metadata:
34 | name: kuber-service-1
35 | namespace: example-1
36 | spec:
37 | selector:
38 | app: http-server-1
39 | ports:
40 | - protocol: TCP
41 | port: 80
42 | targetPort: 8000
43 |
--------------------------------------------------------------------------------
/lesson-35/k8s/development/templates/app.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: argoproj.io/v1alpha1
2 | kind: Application
3 | metadata:
4 | name: demo-app
5 | finalizers:
6 | - resources-finalizer.argocd.argoproj.io
7 | spec:
8 | project: development
9 | source:
10 | repoURL: {{ .Values.source.repoURL }}
11 | targetRevision: {{ .Values.source.targetRevision }}
12 | path: {{ .Values.source.path }}
13 | helm:
14 | values: |
15 | hosts:
16 | app1: {{ .Values.appHosts.app1 }}
17 | app2: {{ .Values.appHosts.app2 }}
18 |
19 | clusterIssuer:
20 | name: {{ .Values.clusterIssuer.name }}
21 |
22 | destination:
23 | namespace: {{ .Values.namespace }}
24 | server: {{ .Values.spec.destination.server }}
25 |
26 | syncPolicy:
27 | automated:
28 | prune: true
29 | selfHeal: true
30 | syncOptions:
31 | - CreateNamespace=true
32 |
--------------------------------------------------------------------------------
/lesson-25/k8s/example-4/prod-issuer.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: cert-manager.io/v1
2 | kind: Issuer
3 | metadata:
4 | name: letsencrypt-prod-issuer
5 | namespace: demo
6 | spec:
7 | acme:
8 | # You must replace this email address with your own.
9 | # Let's Encrypt will use this to contact you about expiring
10 | # certificates, and issues related to your account.
11 | email: bakavets.com@gmail.com
12 | server: https://acme-v02.api.letsencrypt.org/directory
13 | privateKeySecretRef:
14 | # Secret resource that will be used to store the ACME account's private key.
15 | name: letsencrypt-prod-issuer-private-key
16 | solvers:
17 | # this solver handles k8s.bakavets.com challenges
18 | - selector:
19 | dnsZones:
20 | - "k8s.bakavets.com"
21 | dns01:
22 | route53:
23 | region: eu-north-1
24 | hostedZoneID: Z00382002AO1UBHWVUQZY
--------------------------------------------------------------------------------
/lesson-34/example-2/app.yaml:
--------------------------------------------------------------------------------
1 | ---
2 | apiVersion: v1
3 | kind: Namespace
4 | metadata:
5 | name: example-2
6 | ---
7 | apiVersion: apps/v1
8 | kind: Deployment
9 | metadata:
10 | name: kuber-2
11 | namespace: example-2
12 | labels:
13 | app: kuber-2
14 | spec:
15 | replicas: 1
16 | selector:
17 | matchLabels:
18 | app: http-server-2
19 | template:
20 | metadata:
21 | labels:
22 | app: http-server-2
23 | spec:
24 | serviceAccountName: app-sa-2
25 | containers:
26 | - name: kuber-app
27 | image: bakavets/kuber:v2.0
28 | ports:
29 | - containerPort: 8000
30 | ---
31 | apiVersion: v1
32 | kind: Service
33 | metadata:
34 | name: kuber-service-2
35 | namespace: example-2
36 | spec:
37 | selector:
38 | app: http-server-2
39 | ports:
40 | - protocol: TCP
41 | port: 80
42 | targetPort: 8000
43 |
--------------------------------------------------------------------------------
/lesson-44-45-46-47-48/k8s/development/templates/app.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: argoproj.io/v1alpha1
2 | kind: Application
3 | metadata:
4 | name: demo-app
5 | finalizers:
6 | - resources-finalizer.argocd.argoproj.io
7 | spec:
8 | project: development
9 | source:
10 | repoURL: {{ .Values.source.repoURL }}
11 | targetRevision: {{ .Values.source.targetRevision }}
12 | path: {{ .Values.source.path }}
13 | helm:
14 | values: |
15 | hosts:
16 | app1: {{ .Values.appHosts.app1 }}
17 | app2: {{ .Values.appHosts.app2 }}
18 |
19 | clusterIssuer:
20 | name: {{ .Values.clusterIssuer.name }}
21 |
22 | destination:
23 | namespace: {{ .Values.namespace }}
24 | server: {{ .Values.spec.destination.server }}
25 |
26 | syncPolicy:
27 | automated:
28 | prune: true
29 | selfHeal: true
30 | syncOptions:
31 | - CreateNamespace=true
32 |
--------------------------------------------------------------------------------
/lesson-21-22/0-deploy-kuber.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: kuber
5 | labels:
6 | app: kuber
7 | spec:
8 | replicas: 3
9 | selector:
10 | matchLabels:
11 | app: http-server
12 | template:
13 | metadata:
14 | labels:
15 | app: http-server
16 | spec:
17 | containers:
18 | - name: kuber-app-1
19 | image: bakavets/kuber
20 | ports:
21 | - containerPort: 8000
22 | volumeMounts:
23 | - mountPath: /cache-1
24 | name: cache-volume
25 | - name: nginx
26 | image: nginx
27 | ports:
28 | - containerPort: 80
29 | volumeMounts:
30 | - mountPath: /usr/share/nginx/html/data
31 | # - mountPath: /cache-2
32 | name: cache-volume
33 | subPath: data
34 | volumes:
35 | - name: cache-volume
36 | emptyDir: {}
37 |
--------------------------------------------------------------------------------
/lesson-35/k8s/infrastructure/applications/values.yaml:
--------------------------------------------------------------------------------
1 | aws:
2 | region: us-east-1
3 | route53:
4 | dnsZone: example.com
5 | hostedZoneID: Z123456789EXAMPLE
6 |
7 | clusterName: eks-cluster
8 |
9 | source:
10 | repoURL: git@gitlab.com:example/example.git
11 | targetRevision: main
12 |
13 | bootstrapApp:
14 | certManager:
15 | serviceAccountName: cert-manager-route53
16 | serviceAccountNamespace: cert-manager
17 | eksRoleArn: arn:aws:iam::123456789123:role/role-name
18 |
19 | certManagerConfigs:
20 | acme:
21 | email: example.com@gmail.com
22 |
23 | awsLBController:
24 | serviceAccountName: aws-load-balancer-controller
25 | namespace: kube-system
26 | eksRoleArn: arn:aws:iam::123456789123:role/role-name
27 |
28 | externalDNS:
29 | serviceAccountName: external-dns
30 | namespace: external-dns
31 | eksRoleArn: arn:aws:iam::123456789123:role/role-name
32 |
--------------------------------------------------------------------------------
/lesson-23/0-pv-kuber.yaml:
--------------------------------------------------------------------------------
1 | # https://kubernetes.io/docs/reference/kubernetes-api/config-and-storage-resources/persistent-volume-v1/
2 | apiVersion: v1
3 | kind: PersistentVolume
4 | metadata:
5 | name: aws-pv-kuber
6 | labels:
7 | type: aws-pv-kuber
8 | spec:
9 | capacity:
10 | storage: 3Gi
11 | accessModes: # https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes
12 | - ReadWriteOnce
13 | persistentVolumeReclaimPolicy: Retain # https://kubernetes.io/docs/reference/kubernetes-api/config-and-storage-resources/persistent-volume-v1/#PersistentVolumeSpec # https://kubernetes.io/docs/concepts/storage/persistent-volumes/#recycle
14 | storageClassName: "" # Empty value means that this volume does not belong to any StorageClass. https://kubernetes.io/docs/concepts/storage/persistent-volumes/#class-1
15 | awsElasticBlockStore:
16 | volumeID: "vol-02a71cfd076eac916"
17 | fsType: ext4
--------------------------------------------------------------------------------
/lesson-25/k8s/example-4/staging-issuer.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: cert-manager.io/v1
2 | kind: Issuer
3 | metadata:
4 | name: letsencrypt-staging-issuer
5 | namespace: demo
6 | spec:
7 | acme:
8 | # You must replace this email address with your own.
9 | # Let's Encrypt will use this to contact you about expiring
10 | # certificates, and issues related to your account.
11 | email: bakavets.com@gmail.com
12 | server: https://acme-staging-v02.api.letsencrypt.org/directory
13 | privateKeySecretRef:
14 | # Secret resource that will be used to store the ACME account's private key.
15 | name: letsencrypt-staging-issuer-private-key
16 | solvers:
17 | # this solver handles k8s.bakavets.com challenges
18 | - selector:
19 | dnsZones:
20 | - "k8s.bakavets.com"
21 | dns01:
22 | route53:
23 | region: eu-north-1
24 | hostedZoneID: Z00382002AO1UBHWVUQZY
--------------------------------------------------------------------------------
/lesson-37/terraform/irsa-ebs-csi-driver.tf:
--------------------------------------------------------------------------------
1 | locals {
2 | ebs_csi_driver = {
3 | namespace = "kube-system"
4 | service_account_name = "ebs-csi-controller-sa"
5 | }
6 | }
7 |
8 | module "irsa_ebs_csi_driver" {
9 | source = "terraform-aws-modules/iam/aws//modules/iam-assumable-role-with-oidc"
10 | version = "5.3.0"
11 | create_role = true
12 | role_name = "${local.cluster_name}-ebs-csi-driver-role"
13 | provider_url = replace(module.eks.cluster_oidc_issuer_url, "https://", "")
14 | role_policy_arns = [data.aws_iam_policy.ebs_csi_driver.arn]
15 | oidc_fully_qualified_subjects = ["system:serviceaccount:${local.ebs_csi_driver.namespace}:${local.ebs_csi_driver.service_account_name}"]
16 | }
17 |
18 | data "aws_iam_policy" "ebs_csi_driver" {
19 | name = "AmazonEBSCSIDriverPolicy"
20 | }
21 |
--------------------------------------------------------------------------------
/lesson-16/ingress.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: networking.k8s.io/v1
2 | kind: Ingress
3 | metadata:
4 | name: main-ingress
5 | annotations:
6 | kubernetes.io/ingress.class: nginx
7 | cert-manager.io/cluster-issuer: "letsencrypt-prod"
8 | spec:
9 | tls:
10 | - hosts:
11 | - app-1.bakavets.com
12 | - app-2.bakavets.com
13 | secretName: app-tls
14 | rules:
15 | - host: app-1.bakavets.com
16 | http:
17 | paths:
18 | - pathType: Prefix
19 | path: /
20 | backend:
21 | service:
22 | name: kuber-service-1
23 | port:
24 | number: 80
25 | - host: app-2.bakavets.com
26 | http:
27 | paths:
28 | - pathType: Prefix
29 | path: /
30 | backend:
31 | service:
32 | name: kuber-service-2
33 | port:
34 | number: 80
--------------------------------------------------------------------------------
/lesson-44-45-46-47-48/k8s/infrastructure/charts/bootstrap-app/templates/external-secrets.yaml:
--------------------------------------------------------------------------------
1 | {{ if .Values.externalSecrets.enabled }}
2 | apiVersion: argoproj.io/v1alpha1
3 | kind: Application
4 | metadata:
5 | name: external-secrets
6 | annotations:
7 | argocd.argoproj.io/sync-wave: "-20"
8 | finalizers:
9 | - resources-finalizer.argocd.argoproj.io
10 | spec:
11 | project: infrastructure
12 | source:
13 | repoURL: https://charts.external-secrets.io
14 | targetRevision: {{ .Values.externalSecrets.version }}
15 | chart: external-secrets
16 | helm:
17 | values: |
18 | installCRDs: true
19 |
20 | destination:
21 | namespace: {{ .Values.externalSecrets.namespace }}
22 | server: {{ .Values.spec.destination.server }}
23 |
24 | syncPolicy:
25 | automated:
26 | prune: true
27 | selfHeal: true
28 | syncOptions:
29 | - CreateNamespace=true
30 | {{ end }}
31 |
--------------------------------------------------------------------------------
/lesson-44-45-46-47-48/terraform/irsa-ebs-csi-driver.tf:
--------------------------------------------------------------------------------
1 | locals {
2 | ebs_csi_driver = {
3 | namespace = "kube-system"
4 | service_account_name = "ebs-csi-controller-sa"
5 | }
6 | }
7 |
8 | module "irsa_ebs_csi_driver" {
9 | source = "terraform-aws-modules/iam/aws//modules/iam-assumable-role-with-oidc"
10 | version = "5.3.0"
11 | create_role = true
12 | role_name = "${local.cluster_name}-ebs-csi-driver-role"
13 | provider_url = replace(module.eks.cluster_oidc_issuer_url, "https://", "")
14 | role_policy_arns = [data.aws_iam_policy.ebs_csi_driver.arn]
15 | oidc_fully_qualified_subjects = ["system:serviceaccount:${local.ebs_csi_driver.namespace}:${local.ebs_csi_driver.service_account_name}"]
16 | }
17 |
18 | data "aws_iam_policy" "ebs_csi_driver" {
19 | name = "AmazonEBSCSIDriverPolicy"
20 | }
21 |
--------------------------------------------------------------------------------
/lesson-36/k8s/example-2/mysql-secrets-manager.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: external-secrets.io/v1beta1
2 | kind: ExternalSecret
3 | metadata:
4 | name: mysql-secrets-manager
5 | namespace: default
6 | spec:
7 | refreshInterval: '0'
8 | secretStoreRef:
9 | kind: ClusterSecretStore
10 | name: aws-secrets-manager
11 | target:
12 | name: mysql-secrets-manager
13 | creationPolicy: Owner
14 | data:
15 | - secretKey: MYSQL_HOST
16 | remoteRef:
17 | key: demo-mysql
18 | property: MYSQL_HOST
19 | - secretKey: MYSQL_PORT
20 | remoteRef:
21 | key: demo-mysql
22 | property: MYSQL_PORT
23 | - secretKey: MYSQL_DB
24 | remoteRef:
25 | key: demo-mysql
26 | property: MYSQL_DATABASE
27 | - secretKey: MYSQL_USER
28 | remoteRef:
29 | key: demo-mysql
30 | property: MYSQL_USER
31 | - secretKey: MYSQL_PASSWORD
32 | remoteRef:
33 | key: demo-mysql
34 | property: MYSQL_PASSWORD
35 |
--------------------------------------------------------------------------------
/lesson-44-45-46-47-48/k8s/gitlab/runners/internal/external-secrets.yaml:
--------------------------------------------------------------------------------
1 | ---
2 | apiVersion: external-secrets.io/v1beta1
3 | kind: ExternalSecret
4 | metadata:
5 | name: gitlab-runner-secret
6 | namespace: gitlab-space
7 | spec:
8 | refreshInterval: "0"
9 | secretStoreRef:
10 | kind: ClusterSecretStore
11 | name: aws-parameter-store
12 | target:
13 | name: gitlab-runner-secret
14 | creationPolicy: Owner
15 | template:
16 | data:
17 | # DEPRECATED: The Registration Token(runner-registration-token) for adding new Runners to the GitLab Server.
18 | # ref: https://docs.gitlab.com/ee/ci/runners/new_creation_workflow.html
19 | runner-registration-token: "" # need to leave as an empty string for compatibility reasons
20 | runner-token: '{{ index . "runner-token" }}'
21 | data:
22 | - secretKey: runner-token
23 | remoteRef:
24 | key: demo-gitlab
25 | property: runner.tokens.internal
26 |
--------------------------------------------------------------------------------
/lesson-13/kuber-deploy-livenessProbe-http.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: kuber-http
5 | labels:
6 | app: kuber
7 | spec:
8 | replicas: 1
9 | selector:
10 | matchLabels:
11 | app: http-server-http
12 | template:
13 | metadata:
14 | labels:
15 | app: http-server-http
16 | spec:
17 | containers:
18 | - name: kuber-app
19 | image: bakavets/kuber:v1.0-unhealthy
20 | ports:
21 | - containerPort: 8000
22 | livenessProbe:
23 | httpGet:
24 | path: /healthcheck
25 | port: 8000
26 | initialDelaySeconds: 5
27 | periodSeconds: 5
28 | ---
29 | apiVersion: v1
30 | kind: Service
31 | metadata:
32 | name: kuber-service-http
33 | spec:
34 | selector:
35 | app: http-server-http
36 | ports:
37 | - protocol: TCP
38 | port: 80
39 | targetPort: 8000
40 | nodePort: 30003
41 | type: NodePort
--------------------------------------------------------------------------------
/lesson-42/k8s/example-3/deploy.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: efs-app-ap
5 | labels:
6 | app: efs-app-ap
7 | spec:
8 | replicas: 2
9 | selector:
10 | matchLabels:
11 | app: efs-app-ap
12 | template:
13 | metadata:
14 | labels:
15 | app: efs-app-ap
16 | spec:
17 | # securityContext:
18 | # runAsUser: 10
19 | # runAsGroup: 30
20 | # fsGroup: 20
21 | containers:
22 | - name: app
23 | image: centos
24 | command: ["/bin/sh"]
25 | args:
26 | [
27 | "-c",
28 | "while true; do echo $(date -u) - $HOSTNAME >> /data/out.txt; sleep 3; done",
29 | ]
30 | volumeMounts:
31 | - name: efs-volume
32 | mountPath: /data
33 | volumes:
34 | - name: efs-volume
35 | persistentVolumeClaim:
36 | claimName: efs-claim-ap
37 |
--------------------------------------------------------------------------------
/lesson-40/k8s/example-4/topology.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: az-spread-topology
5 | labels:
6 | app: kuber
7 | spec:
8 | replicas: 21
9 | selector:
10 | matchLabels:
11 | app: http-server
12 | template:
13 | metadata:
14 | labels:
15 | app: http-server
16 | version: v1
17 | spec:
18 | containers:
19 | - name: kuber-app
20 | image: bakavets/kuber
21 | ports:
22 | - containerPort: 8000
23 | resources:
24 | limits:
25 | cpu: 400m
26 | memory: 256Mi
27 | requests:
28 | cpu: 400m
29 | memory: 256Mi
30 | topologySpreadConstraints:
31 | - maxSkew: 1
32 | topologyKey: topology.kubernetes.io/zone
33 | whenUnsatisfiable: DoNotSchedule
34 | labelSelector:
35 | matchLabels:
36 | app: http-server
37 |
--------------------------------------------------------------------------------
/lesson-44-45-46-47-48/k8s/gitlab/runners/external/external-secrets.yaml:
--------------------------------------------------------------------------------
1 | ---
2 | apiVersion: external-secrets.io/v1beta1
3 | kind: ExternalSecret
4 | metadata:
5 | name: gitlab-runner-secret
6 | namespace: gitlab-space-external
7 | spec:
8 | refreshInterval: "0"
9 | secretStoreRef:
10 | kind: ClusterSecretStore
11 | name: aws-parameter-store
12 | target:
13 | name: gitlab-runner-secret
14 | creationPolicy: Owner
15 | template:
16 | data:
17 | # DEPRECATED: The Registration Token(runner-registration-token) for adding new Runners to the GitLab Server.
18 | # ref: https://docs.gitlab.com/ee/ci/runners/new_creation_workflow.html
19 | runner-registration-token: "" # need to leave as an empty string for compatibility reasons
20 | runner-token: '{{ index . "runner-token" }}'
21 | data:
22 | - secretKey: runner-token
23 | remoteRef:
24 | key: demo-gitlab
25 | property: runner.tokens.external
26 |
--------------------------------------------------------------------------------
/lesson-25/k8s/example-1/ingress.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: networking.k8s.io/v1
2 | kind: Ingress
3 | metadata:
4 | name: main-ingress
5 | annotations:
6 | cert-manager.io/cluster-issuer: "letsencrypt-prod"
7 | spec:
8 | ingressClassName: nginx # replacement of annotation: kubernetes.io/ingress.class: nginx
9 | tls:
10 | - hosts:
11 | - app-1.kubxr.com
12 | - app-2.kubxr.com
13 | secretName: app-tls
14 | rules:
15 | - host: app-1.kubxr.com
16 | http:
17 | paths:
18 | - pathType: Prefix
19 | path: /
20 | backend:
21 | service:
22 | name: kuber-service-1
23 | port:
24 | number: 80
25 | - host: app-2.kubxr.com
26 | http:
27 | paths:
28 | - pathType: Prefix
29 | path: /
30 | backend:
31 | service:
32 | name: kuber-service-2
33 | port:
34 | number: 80
35 |
--------------------------------------------------------------------------------
/lesson-35/k8s/charts/app/templates/ingress.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: networking.k8s.io/v1
2 | kind: Ingress
3 | metadata:
4 | name: main-ingress
5 | annotations:
6 | cert-manager.io/cluster-issuer: {{ .Values.clusterIssuer.name }}
7 | spec:
8 | ingressClassName: nginx
9 | tls:
10 | - hosts:
11 | - {{ .Values.hosts.app1 }}
12 | - {{ .Values.hosts.app2 }}
13 | secretName: app-tls
14 | rules:
15 | - host: {{ .Values.hosts.app1 }}
16 | http:
17 | paths:
18 | - pathType: Prefix
19 | path: /
20 | backend:
21 | service:
22 | name: kuber-service-1
23 | port:
24 | number: 80
25 | - host: {{ .Values.hosts.app2 }}
26 | http:
27 | paths:
28 | - pathType: Prefix
29 | path: /
30 | backend:
31 | service:
32 | name: kuber-service-2
33 | port:
34 | number: 80
35 |
--------------------------------------------------------------------------------
/lesson-35/k8s/infrastructure/charts/cert-manager-configs/templates/cluster-issuer-prod.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: cert-manager.io/v1
2 | kind: ClusterIssuer
3 | metadata:
4 | name: letsencrypt-prod
5 | spec:
6 | acme:
7 | # You must replace this email address with your own.
8 | # Let's Encrypt will use this to contact you about expiring
9 | # certificates, and issues related to your account.
10 | email: {{ .Values.acme.email }}
11 | server: https://acme-v02.api.letsencrypt.org/directory
12 | privateKeySecretRef:
13 | # Secret resource that will be used to store the ACME account's private key.
14 | name: letsencrypt-prod-private-key
15 | solvers:
16 | - selector:
17 | dnsZones:
18 | {{- range .Values.acme.dnsZones }}
19 | - {{ . }}
20 | {{- end }}
21 | dns01:
22 | route53:
23 | region: {{ .Values.acme.route53.region }}
24 | hostedZoneID: {{ .Values.acme.route53.hostedZoneID }}
25 |
--------------------------------------------------------------------------------
/lesson-35/terraform/variables.tf:
--------------------------------------------------------------------------------
1 | variable "aws_region" {
2 | description = "AWS Region."
3 | default = "eu-west-1"
4 | }
5 |
6 | variable "default_tags" {
7 | type = map(string)
8 | description = "Default tags for AWS that will be attached to each resource."
9 | default = {
10 | "TerminationDate" = "Permanent",
11 | "Environment" = "Development",
12 | "Team" = "DevOps",
13 | "DeployedBy" = "Terraform",
14 | "OwnerEmail" = "devops@example.com"
15 | }
16 | }
17 |
18 | variable "deployment_prefix" {
19 | description = "Prefix of the deployment."
20 | type = string
21 | default = "demo"
22 | }
23 |
24 | variable "gitlab_token" {
25 | type = string
26 | sensitive = true
27 | description = "The OAuth2 Token, Project, Group, Personal Access Token or CI Job Token used to connect to GitLab. The OAuth method is used in this provider for authentication (using Bearer authorization token)."
28 | }
29 |
--------------------------------------------------------------------------------
/lesson-44-45-46-47-48/k8s/charts/app/templates/ingress.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: networking.k8s.io/v1
2 | kind: Ingress
3 | metadata:
4 | name: main-ingress
5 | annotations:
6 | cert-manager.io/cluster-issuer: {{ .Values.clusterIssuer.name }}
7 | spec:
8 | ingressClassName: nginx
9 | tls:
10 | - hosts:
11 | - {{ .Values.hosts.app1 }}
12 | - {{ .Values.hosts.app2 }}
13 | secretName: app-tls
14 | rules:
15 | - host: {{ .Values.hosts.app1 }}
16 | http:
17 | paths:
18 | - pathType: Prefix
19 | path: /
20 | backend:
21 | service:
22 | name: kuber-service-1
23 | port:
24 | number: 80
25 | - host: {{ .Values.hosts.app2 }}
26 | http:
27 | paths:
28 | - pathType: Prefix
29 | path: /
30 | backend:
31 | service:
32 | name: kuber-service-2
33 | port:
34 | number: 80
35 |
--------------------------------------------------------------------------------
/lesson-44-45-46-47-48/k8s/infrastructure/charts/cert-manager-configs/templates/cluster-issuer-prod.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: cert-manager.io/v1
2 | kind: ClusterIssuer
3 | metadata:
4 | name: letsencrypt-prod
5 | spec:
6 | acme:
7 | # You must replace this email address with your own.
8 | # Let's Encrypt will use this to contact you about expiring
9 | # certificates, and issues related to your account.
10 | email: {{ .Values.acme.email }}
11 | server: https://acme-v02.api.letsencrypt.org/directory
12 | privateKeySecretRef:
13 | # Secret resource that will be used to store the ACME account's private key.
14 | name: letsencrypt-prod-private-key
15 | solvers:
16 | - selector:
17 | dnsZones:
18 | {{- range .Values.acme.dnsZones }}
19 | - {{ . }}
20 | {{- end }}
21 | dns01:
22 | route53:
23 | region: {{ .Values.acme.route53.region }}
24 | hostedZoneID: {{ .Values.acme.route53.hostedZoneID }}
25 |
--------------------------------------------------------------------------------
/lesson-44-45-46-47-48/terraform/variables.tf:
--------------------------------------------------------------------------------
1 | variable "aws_region" {
2 | description = "AWS Region."
3 | default = "eu-west-1"
4 | }
5 |
6 | variable "default_tags" {
7 | type = map(string)
8 | description = "Default tags for AWS that will be attached to each resource."
9 | default = {
10 | "TerminationDate" = "Permanent",
11 | "Environment" = "Development",
12 | "Team" = "DevOps",
13 | "DeployedBy" = "Terraform",
14 | "OwnerEmail" = "devops@example.com"
15 | }
16 | }
17 |
18 | variable "deployment_prefix" {
19 | description = "Prefix of the deployment."
20 | type = string
21 | default = "demo"
22 | }
23 |
24 | variable "gitlab_token" {
25 | type = string
26 | sensitive = true
27 | description = "The OAuth2 Token, Project, Group, Personal Access Token or CI Job Token used to connect to GitLab. The OAuth method is used in this provider for authentication (using Bearer authorization token)."
28 | }
29 |
--------------------------------------------------------------------------------
/lesson-40/k8s/common/nginx.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: nginx
5 | namespace: kube-system
6 | labels:
7 | app: nginx
8 | spec:
9 | replicas: 8
10 | selector:
11 | matchLabels:
12 | app: nginx
13 | template:
14 | metadata:
15 | labels:
16 | app: nginx
17 | spec:
18 | containers:
19 | - name: nginx
20 | image: nginx
21 | resources:
22 | limits:
23 | cpu: 1000m
24 | memory: 1Gi
25 | requests:
26 | cpu: 1000m
27 | memory: 512Mi
28 | affinity:
29 | nodeAffinity:
30 | requiredDuringSchedulingIgnoredDuringExecution:
31 | nodeSelectorTerms:
32 | - matchExpressions:
33 | - key: topology.kubernetes.io/zone
34 | operator: In
35 | values:
36 | - eu-west-1a
37 | - eu-west-1c
38 |
--------------------------------------------------------------------------------
/lesson-39/k8s/example-1/with-no-schedule-taint.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: with-no-schedule-taint
5 | labels:
6 | app: kuber
7 | spec:
8 | replicas: 2
9 | selector:
10 | matchLabels:
11 | app: http-server
12 | template:
13 | metadata:
14 | labels:
15 | app: http-server
16 | spec:
17 | containers:
18 | - name: kuber-app
19 | image: bakavets/kuber
20 | ports:
21 | - containerPort: 8000
22 | affinity:
23 | nodeAffinity:
24 | requiredDuringSchedulingIgnoredDuringExecution:
25 | nodeSelectorTerms:
26 | - matchExpressions:
27 | - key: node.k8s/role
28 | operator: In
29 | values:
30 | - app-worker
31 | tolerations:
32 | - key: node.k8s/app-role
33 | operator: Equal # Exists
34 | value: worker
35 | effect: NoSchedule
36 |
--------------------------------------------------------------------------------
/lesson-33/k8s/external-dns-values.yaml:
--------------------------------------------------------------------------------
1 | domainFilters: ["kubxr.com"] # will make ExternalDNS see only the hosted zones matching provided domain, omit to process all available hosted zones
2 | registry: txt # Registry method to use. TXT records signify that the corresponding ALIAS records are managed by ExternalDNS.
3 | txtOwnerId: my-demo-identifier # set to a unique value that doesn't change for the lifetime of your cluster. A name that identifies this instance of ExternalDNS.
4 | provider: aws # DNS provider where the DNS records will be created.
5 | policy: upsert-only # would prevent ExternalDNS from deleting any records. (options: sync, upsert-only )
6 | sources: ["service", "ingress"] # K8s resources type to be observed for new DNS entries by ExternalDNS
7 | serviceAccount:
8 | create: true
9 | name: external-dns
10 | annotations:
11 | eks.amazonaws.com/role-arn: arn:aws:iam::849634744839:role/demo-eks-cluster-external-dns-role
12 | aws:
13 | region: eu-north-1
14 | zoneType: public # only look at public hosted zones
--------------------------------------------------------------------------------
/lesson-30/charts/demo/templates/hpa.yaml:
--------------------------------------------------------------------------------
1 | {{- if .Values.autoscaling.enabled }}
2 | apiVersion: autoscaling/v2beta1
3 | kind: HorizontalPodAutoscaler
4 | metadata:
5 | name: {{ include "demo.fullname" . }}
6 | labels:
7 | {{- include "demo.labels" . | nindent 4 }}
8 | spec:
9 | scaleTargetRef:
10 | apiVersion: apps/v1
11 | kind: Deployment
12 | name: {{ include "demo.fullname" . }}
13 | minReplicas: {{ .Values.autoscaling.minReplicas }}
14 | maxReplicas: {{ .Values.autoscaling.maxReplicas }}
15 | metrics:
16 | {{- if .Values.autoscaling.targetCPUUtilizationPercentage }}
17 | - type: Resource
18 | resource:
19 | name: cpu
20 | targetAverageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }}
21 | {{- end }}
22 | {{- if .Values.autoscaling.targetMemoryUtilizationPercentage }}
23 | - type: Resource
24 | resource:
25 | name: memory
26 | targetAverageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }}
27 | {{- end }}
28 | {{- end }}
29 |
--------------------------------------------------------------------------------
/lesson-36/k8s/example-2/mysql-parameter-store.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: external-secrets.io/v1beta1
2 | kind: ExternalSecret
3 | metadata:
4 | name: mysql-parameter-store
5 | namespace: default
6 | spec:
7 | refreshInterval: 1h
8 | secretStoreRef:
9 | kind: ClusterSecretStore
10 | name: aws-parameter-store
11 | target:
12 | name: mysql-parameter-store
13 | creationPolicy: Owner
14 | data:
15 | - secretKey: MYSQL_HOST
16 | remoteRef:
17 | key: demo-mysql
18 | property: MYSQL_HOST
19 | - secretKey: MYSQL_PORT
20 | remoteRef:
21 | key: demo-mysql
22 | property: MYSQL_PORT
23 | - secretKey: MYSQL_DB
24 | remoteRef:
25 | key: demo-mysql
26 | property: MYSQL_DATABASE
27 | - secretKey: MYSQL_USER
28 | remoteRef:
29 | key: demo-mysql
30 | property: MYSQL_USER
31 | - secretKey: MYSQL_PASSWORD
32 | remoteRef:
33 | key: demo-mysql
34 | property: MYSQL_PASSWORD
35 | - secretKey: DEMO
36 | remoteRef:
37 | key: demo-mysql
38 | property: name.last
39 |
--------------------------------------------------------------------------------
/lesson-32/k8s/example-2/ingress.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: networking.k8s.io/v1
2 | kind: Ingress
3 | metadata:
4 | name: main-ingress
5 | namespace: example-2
6 | annotations:
7 | alb.ingress.kubernetes.io/scheme: internet-facing
8 | alb.ingress.kubernetes.io/target-type: instance # service must be of type "NodePort" or "LoadBalancer" to use instance mode
9 | alb.ingress.kubernetes.io/tags: Environment=Development,Team=DevOps,Project=app
10 | spec:
11 | ingressClassName: alb
12 | rules:
13 | - host: app-1.kubxr.com
14 | http:
15 | paths:
16 | - pathType: Prefix
17 | path: /
18 | backend:
19 | service:
20 | name: kuber-service-1
21 | port:
22 | number: 80
23 | - host: app-2.kubxr.com
24 | http:
25 | paths:
26 | - pathType: Prefix
27 | path: /
28 | backend:
29 | service:
30 | name: kuber-service-2
31 | port:
32 | number: 80
33 |
--------------------------------------------------------------------------------
/lesson-13/kuber-deploy-livenessProbe-exec.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: ubuntu
5 | labels:
6 | app: ubuntu
7 | spec:
8 | replicas: 1
9 | selector:
10 | matchLabels:
11 | app: ubuntu
12 | template:
13 | metadata:
14 | labels:
15 | app: ubuntu
16 | spec:
17 | containers:
18 | - name: ubuntu
19 | image: ubuntu
20 | args:
21 | - /bin/sh
22 | - -c
23 | - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
24 | livenessProbe:
25 | exec:
26 | command:
27 | - cat
28 | - /tmp/healthy
29 | initialDelaySeconds: 5 # Defaults to 0 seconds. Minimum value is 0.
30 | periodSeconds: 5 # Default to 10 seconds. Minimum value is 1.
31 | timeoutSeconds: 1 # Defaults to 1 second. Minimum value is 1.
32 | successThreshold: 1 # Defaults to 1. Must be 1 for liveness and startup Probes. Minimum value is 1.
33 | failureThreshold: 3 # Defaults to 3. Minimum value is 1.
--------------------------------------------------------------------------------