diff --git a/.spelling b/.spelling index 64d01ff..5aa14a2 100644 --- a/.spelling +++ b/.spelling @@ -74,6 +74,34 @@ themenbereiche änderungen auszuführen zeitraum +GitOps +FluxCD +gitlab +restic +vaultwarden +standort +höchstleistungen +Fähigkeiten +docker +Golang +Datenbankverwaltung +Einführung +selbstverwalteten +Entwicklungsteams +Zugriffsmanagement +Ausführung +Deployments +größeren +kundenorientierter +Datenbank-Lifecycle-Managements +Refactoring +Ablösung +CD-Lösung +Preview-Environments +Daten-Streaming +JavaScript +Zugriffsrechten +Repositories - index.md Rodionov db-operator @@ -126,3 +154,16 @@ Blue-Green-RabbitMQ-Deployments Kubernetes-Backends Faro Minio-Bucket +Open-Source-Kubernetes-Operators +Deployment-Workflows +Selenoid-Backends +db-operator +Terraform-Codebasis +Downtime +Cross-Cloud-Backup-Strategien +Federated-Prometheus-Cluster + - ./english/index.md +Golang +selenoid +golang +db-operator diff --git a/.woodpecker/build.yaml b/.woodpecker/build.yaml index 0bb8fef..328add5 100644 --- a/.woodpecker/build.yaml +++ b/.woodpecker/build.yaml @@ -20,6 +20,8 @@ steps: securityContext: privileged: true commands: + - mkdir -p ~/.local/share/fonts + - cp ./fonts/fira_sans/* ~/.local/share/fonts/ - apt-get update - |- apt-get install -y libx11-xcb1 libxcomposite1 libasound2 \ diff --git a/css/nord_dark.css b/css/nord_dark.css new file mode 100644 index 0000000..460180e --- /dev/null +++ b/css/nord_dark.css @@ -0,0 +1,144 @@ +/* =============================== + Nord Dark – Compact Markdown + github-markdown-css compatible + =============================== */ + +.markdown-body { + background: #2E3440; + color: #D8DEE9; + font-family: "Fira Sans"; + font-size: 15px; + line-height: 1.55; + padding-top: 2.0rem; + padding-bottom: 1.0rem; + padding-right: 3.0rem; + padding-left: 3.0rem; +} + +/* Headings */ +.markdown-body h1, +.markdown-body h2, +.markdown-body h3, +.markdown-body h4, +.markdown-body h5, +.markdown-body h6 { + border: none; + margin-top: 1.2em; + margin-bottom: 0.4em; + font-weight: 700; + color: #ECEFF4; +} + +.markdown-body h1 { font-size: 1.9em; } +.markdown-body h2 { font-size: 1.6em; } +.markdown-body h3 { font-size: 1.35em; } +.markdown-body h4 { font-size: 1.15em; } +.markdown-body h5 { font-size: 1.02em; } +.markdown-body h6 { font-size: 0.95em; } + +/* Paragraphs */ +.markdown-body p { + margin: 0.55em 0; +} + +/* Blockquotes – SAME vertical spacing as paragraphs */ +.markdown-body blockquote { + margin: 0.55em 0; + padding: 0.55em 0.8em; + border-left: 3px solid #8FBCBB; + background: #3B4252; + color: #D8DEE9; + font-style: italic; +} + +.markdown-body blockquote > :first-child { margin-top: 0; } +.markdown-body blockquote > :last-child { margin-bottom: 0; } + +/* Links */ +.markdown-body a { + color: #ECEFF4; /* same as headings → bold-text feel */ + font-weight: 700; /* bold */ + text-decoration: none; + border-bottom: 0.5px dotted #88C0D0; /* underline = link signal */ +} + +.markdown-body a:hover { + color: #8FBCBB; /* subtle Nord accent on hover */ + border-bottom-color: #8FBCBB; +} + +/* Code */ +.markdown-body code { + background: #3B4252; + color: #EBCB8B; + padding: 0.1em 0.3em; + border-radius: 3px; + font-size: 0.92em; +} + +.markdown-body pre { + background: #3B4252; + color: #ECEFF4; + padding: 0.75em 0.9em; + border-radius: 5px; + overflow-x: auto; + border-left: 3px solid #81A1C1; + margin: 0.7em 0; +} + +.markdown-body pre code { + background: none; + padding: 0; +} + +/* Lists */ +.markdown-body ul, +.markdown-body ol { + padding-left: 1.3em; + margin: 0.5em 0; +} + +.markdown-body ul li::marker, +.markdown-body ol li::marker { + color: #88C0D0; +} + +/* HR */ +.markdown-body hr { + border: none; + border-top: 1px dashed #4C566A; + margin: 1.2em 0; +} + +/* Tables */ +.markdown-body table { + border-collapse: collapse; + width: 100%; + margin: 0.7em 0; + font-size: 0.92em; +} + +.markdown-body th, +.markdown-body td { + border: 1px solid #4C566A; + padding: 0.35em 0.6em; +} + +.markdown-body th { + background: #3B4252; +} + +/* Images */ +.markdown-body img { + max-width: 100%; + background: #2E3440; + border: 0px solid #4C566A; + padding: 0.2em; + border-radius: 0px; +} + +/* Hide anchor icons */ +.markdown-body a.anchor { + display: none; +} + diff --git a/css/nord_light.css b/css/nord_light.css new file mode 100644 index 0000000..358e328 --- /dev/null +++ b/css/nord_light.css @@ -0,0 +1,141 @@ +/* =============================== + Nord Light – Compact Markdown + github-markdown-css compatible + =============================== */ + +.markdown-body { + background: #ECEFF4; + color: #2E3440; + font-family: "JetBrains Mono", "Fira Code", Menlo, Consolas, monospace; + font-size: 15px; + line-height: 1.55; + padding: 4.0rem; +} + +/* Headings */ +.markdown-body h1, +.markdown-body h2, +.markdown-body h3, +.markdown-body h4, +.markdown-body h5, +.markdown-body h6 { + border: none; + margin-top: 1.2em; + margin-bottom: 0.4em; + font-weight: 700; + color: #3B4252; +} + +.markdown-body h1 { font-size: 1.9em; } +.markdown-body h2 { font-size: 1.6em; } +.markdown-body h3 { font-size: 1.35em; } +.markdown-body h4 { font-size: 1.15em; } +.markdown-body h5 { font-size: 1.02em; } +.markdown-body h6 { font-size: 0.95em; color: #4C566A; } + +/* Paragraphs */ +.markdown-body p { + margin: 0.55em 0; +} + +/* Blockquotes – SAME vertical spacing as paragraphs */ +.markdown-body blockquote { + margin: 0.55em 0; + padding: 0.55em 0.8em; + border-left: 3px solid #81A1C1; + background: #E5E9F0; + color: #4C566A; + font-style: italic; +} + +/* Remove extra spacing inside blockquotes */ +.markdown-body blockquote > :first-child { margin-top: 0; } +.markdown-body blockquote > :last-child { margin-bottom: 0; } + +/* Links */ +.markdown-body a { + color: #5E81AC; + text-decoration: none; + border-bottom: 1px dotted #81A1C1; +} + +.markdown-body a:hover { + color: #81A1C1; + border-bottom-style: solid; +} + +/* Code */ +.markdown-body code { + background: #E5E9F0; + color: #BF616A; + padding: 0.1em 0.3em; + border-radius: 3px; + font-size: 0.92em; +} + +.markdown-body pre { + background: #E5E9F0; + color: #2E3440; + padding: 0.75em 0.9em; + border-radius: 5px; + overflow-x: auto; + border-left: 3px solid #88C0D0; + margin: 0.7em 0; +} + +.markdown-body pre code { + background: none; + padding: 0; +} + +/* Lists */ +.markdown-body ul, +.markdown-body ol { + padding-left: 1.3em; + margin: 0.5em 0; +} + +.markdown-body ul li::marker, +.markdown-body ol li::marker { + color: #5E81AC; +} + +/* HR */ +.markdown-body hr { + border: none; + border-top: 1px dashed #D8DEE9; + margin: 1.2em 0; +} + +/* Tables */ +.markdown-body table { + border-collapse: collapse; + width: 100%; + margin: 0.7em 0; + font-size: 0.92em; +} + +.markdown-body th, +.markdown-body td { + border: 1px solid #D8DEE9; + padding: 0.35em 0.6em; +} + +.markdown-body th { + background: #E5E9F0; +} + +/* Images */ +.markdown-body img { + max-width: 100%; + background: #E5E9F0; + border: 1px solid #D8DEE9; + padding: 0.2em; + border-radius: 3px; +} + +/* Hide anchor icons */ +.markdown-body a.anchor { + display: none; +} + diff --git a/css/solarized_light.css b/css/solarized_light.css new file mode 100644 index 0000000..7f56481 --- /dev/null +++ b/css/solarized_light.css @@ -0,0 +1,140 @@ +/* =============================== + Solarized Light – Compact Markdown + github-markdown-css compatible + =============================== */ + +.markdown-body { + background: #FDF6E3; /* base3 */ + color: #657B83; /* base00 */ + font-family: "JetBrains Mono", "Fira Code", Menlo, Consolas, monospace; + font-size: 15px; + line-height: 1.55; + padding: 4.0rem; +} + +/* Headings */ +.markdown-body h1, +.markdown-body h2, +.markdown-body h3, +.markdown-body h4, +.markdown-body h5, +.markdown-body h6 { + border: none; + margin-top: 1.2em; + margin-bottom: 0.4em; + font-weight: 700; + color: #586E75; /* base01 */ +} + +.markdown-body h1 { font-size: 1.9em; } +.markdown-body h2 { font-size: 1.6em; } +.markdown-body h3 { font-size: 1.35em; } +.markdown-body h4 { font-size: 1.15em; } +.markdown-body h5 { font-size: 1.02em; } +.markdown-body h6 { font-size: 0.95em; color: #839496; /* base0 */ } + +/* Paragraphs */ +.markdown-body p { + margin: 0.55em 0; +} + +/* Blockquotes – SAME vertical spacing as paragraphs */ +.markdown-body blockquote { + margin: 0.55em 0; + padding: 0.55em 0.8em; + border-left: 3px solid #268BD2; /* blue */ + background: #EEE8D5; /* base2 */ + color: #839496; /* base0 */ + font-style: italic; +} + +/* Remove extra spacing inside blockquotes */ +.markdown-body blockquote > :first-child { margin-top: 0; } +.markdown-body blockquote > :last-child { margin-bottom: 0; } + +/* Links */ +.markdown-body a { + color: #268BD2; /* blue */ + text-decoration: none; + border-bottom: 1px dotted #2AA198; /* cyan */ +} + +.markdown-body a:hover { + color: #2AA198; /* cyan */ + border-bottom-style: solid; +} + +/* Code */ +.markdown-body code { + background: #EEE8D5; /* base2 */ + color: #DC322F; /* red */ + padding: 0.1em 0.3em; + border-radius: 3px; + font-size: 0.92em; +} + +.markdown-body pre { + background: #EEE8D5; /* base2 */ + color: #586E75; /* base01 */ + padding: 0.75em 0.9em; + border-radius: 5px; + overflow-x: auto; + border-left: 3px solid #2AA198; /* cyan */ + margin: 0.7em 0; +} + +.markdown-body pre code { + background: none; + padding: 0; +} + +/* Lists */ +.markdown-body ul, +.markdown-body ol { + padding-left: 1.3em; + margin: 0.5em 0; +} + +.markdown-body ul li::marker, +.markdown-body ol li::marker { + color: #268BD2; /* blue */ +} + +/* HR */ +.markdown-body hr { + border: none; + border-top: 1px dashed #DDD6C1; /* subtle base2/base1 mix */ + margin: 1.2em 0; +} + +/* Tables */ +.markdown-body table { + border-collapse: collapse; + width: 100%; + margin: 0.7em 0; + font-size: 0.92em; +} + +.markdown-body th, +.markdown-body td { + border: 1px solid #DDD6C1; + padding: 0.35em 0.6em; +} + +.markdown-body th { + background: #EEE8D5; /* base2 */ +} + +/* Images */ +.markdown-body img { + max-width: 100%; + background: #EEE8D5; + border: 1px solid #DDD6C1; + padding: 0.2em; + border-radius: 3px; +} + +/* Hide anchor icons */ +.markdown-body a.anchor { + display: none; +} diff --git a/css/spacing.css b/css/spacing.css new file mode 100644 index 0000000..8d6dadb --- /dev/null +++ b/css/spacing.css @@ -0,0 +1,180 @@ +.markdown-body { + font-family: "JetBrains Mono", "Fira Code", Menlo, Consolas, monospace; + font-size: 16px; + line-height: 1.65; + padding: 1.25rem; +} + +/* ------------------------------- + Headings (no underline) + ------------------------------- */ +.markdown-body h1, +.markdown-body h2, +.markdown-body h3, +.markdown-body h4, +.markdown-body h5, +.markdown-body h6 { + border: none; + margin-top: 1.6em; + margin-bottom: 0.6em; + font-weight: 700; +} + +.markdown-body h1 { font-size: 2em; } +.markdown-body h2 { font-size: 1.7em; } +.markdown-body h3 { font-size: 1.4em; } +.markdown-body h4 { font-size: 1.2em; } +.markdown-body h5 { font-size: 1.05em; } +.markdown-body h6 { font-size: 1em; } + +/* ------------------------------- + Text + ------------------------------- */ +.markdown-body p { + margin: 0.75em 0; +} + +.markdown-body strong { + color: #ECEFF4; +} + +.markdown-body em { + color: #E5E9F0; +} + +/* ------------------------------- + Links + ------------------------------- */ +.markdown-body a { + color: #88C0D0; /* nord8 */ + text-decoration: none; + border-bottom: 1px dotted #81A1C1; +} + +.markdown-body a:hover { + color: #8FBCBB; /* nord7 */ + border-bottom-style: solid; +} + +/* ------------------------------- + Inline + Block Code + ------------------------------- */ +.markdown-body code { + background: #3B4252; /* nord1 */ + color: #EBCB8B; /* nord13 */ + padding: 0.15em 0.35em; + border-radius: 3px; + font-size: 0.95em; +} + +.markdown-body pre { + background: #3B4252; + color: #ECEFF4; + padding: 1em; + border-radius: 6px; + overflow-x: auto; + border-left: 4px solid #81A1C1; /* nord9 */ +} + +.markdown-body pre code { + background: none; + padding: 0; + color: inherit; +} + +/* ------------------------------- + Blockquotes + ------------------------------- */ +.markdown-body blockquote { + margin: 1em 0; + padding: 0.6em 1em; + border-left: 4px solid #8FBCBB; /* nord7 */ + background: #3B4252; + color: #D8DEE9; + font-style: italic; +} + +/* ------------------------------- + Lists + ------------------------------- */ +.markdown-body ul, +.markdown-body ol { + padding-left: 1.6em; + margin: 0.8em 0; +} + +.markdown-body ul li::marker { + color: #88C0D0; +} + +.markdown-body ol li::marker { + color: #88C0D0; + font-weight: bold; +} + +/* ------------------------------- + Horizontal Rule + ------------------------------- */ +.markdown-body hr { + border: none; + border-top: 1px dashed #4C566A; /* nord3 */ + margin: 2em 0; +} + +/* ------------------------------- + Tables + ------------------------------- */ +.markdown-body table { + border-collapse: collapse; + width: 100%; + margin: 1em 0; + font-size: 0.95em; +} + +.markdown-body th, +.markdown-body td { + border: 1px solid #4C566A; + padding: 0.5em 0.75em; +} + +.markdown-body th { + background: #3B4252; + color: #ECEFF4; +} + +.markdown-body tr:nth-child(even) td { + background: #434C5E; /* nord2 */ +} + +/* ------------------------------- + Images + ------------------------------- */ +.markdown-body img { + max-width: 100%; + background: #3B4252; + border: 1px solid #4C566A; + padding: 0.25em; + border-radius: 4px; +} + +/* ------------------------------- + Anchor links (hide GitHub icons) + ------------------------------- */ +.markdown-body a.anchor { + display: none; +} + +/* ------------------------------- + Print / PDF safety + ------------------------------- */ +@media print { + .markdown-body { + background: #ffffff; + color: #000000; + } + + a { + color: #000000; + border: none; + } +} diff --git a/english/index.md b/english/index.md index 8ca1a35..3b7c8be 100644 --- a/english/index.md +++ b/english/index.md @@ -1,10 +1,12 @@ --- pdf_options: format: a4 - margin: 20mm 10mm + margin: 0mm 0mm printBackground: true +trim_trailing_whitespace: false stylesheet: - - https://cdnjs.cloudflare.com/ajax/libs/github-markdown-css/5.5.1/github-markdown.css + - ./css/nord_dark.css + body_class: markdown-body css: |- .markdown-body { @@ -13,54 +15,76 @@ css: |- .page-break { page-break-after: always; } --- -## Nikolai Rodionov +photo +
-``` -> Location: Hamburg, Germany -> Email: allanger@zohomail.com -> Github: https://github.com/allanger -``` +## Nikolai Rodionov +### Senior DevOps Engineer + +
+ +> **Location:**  **Hamburg, Germany** +> **Email:**     allanger@zohomail.com +> **Phone:**     **4915223284008** +> **GitHub:**    https://github.com/allanger ### About me -I'm a DevOps engineer with almost 10 years of hands-on experience. I've been mostly focused on Kubernetes and CI/CD pipelines, but it doesn't mean that I would like to avoid tasks in other areas. -A couple of interesting tasks, that I've been working on: +Senior DevOps Engineer focused on **Kubernetes** and **CI/CD pipelines**. I build and run **scalable systems**, write **Go** and **Rust**, manage **servers** and **databases**, and help developers perform at their best. -- Migration from Datadog to the self-managed monitoring stack (Mimir/Loki/Tempo/Grafana) -- GCP Kafka access management with a self-written k8s operator () -- Migration of several MySQL Percona clusters to Kubernetes using the Percona Operator -- Implementation of a downtime-free blue-green deployment for RabbitMQ -- A data streaming automation from ~800 Postgres databases with structural changes via Kafka deployed to Kubernetes -- Implementation of a Kubernetes backend for Selenoid for running e2e tests in k8s environments +In addition, I'm a maintainer of an open-source **Kubernetes operator** designed to help users manage databases through CRDs: + -Also, I'm a maintainer of a Kubernetes operator that should help users manage databases via CRDs: + +--- + +### Skills + +**Linux** - **Docker** - **Kubernetes** - **CI/CD** - **Automations and Scripting** - **Bash/Golang/Rust** - **GitOps** +**Database Administration** - **Observability and Monitoring** - **Terraform/OpenTofu/Ansible** - **AWS/GCP/Azure** + +--- ### Experience -| Company | Position | Dates | -|------------------|-------------------|---------------------| -| **Onpier** | DevOps Engineer | 06.2024 - Until Now | -| **Giant Swarm** | Platform Engineer | 12.2023 - 05.2024 | -| **Grandcentrix** | SRE | 02.2023 - 11.2023 | -| **Klöckner.I** | DevOps Engineer | 01.2022 - 01.2023 | -| **Itigris** | DevOps Engineer | 07.2019 - 12.2021 | -| **Etersoft** | DevOps Engineer | 03.2017 - 06.2019 | +#### Onpier - DevOps Engineer [06.2024 - Until now] + - Bootstrapped deployment workflows and CI/CD pipelines for the monitoring stack using **helmfile** and **Github Actions** + - Configured and maintained a self-managed observability stack (**Mimir**/**Loki**/**Tempo**/**Grafana Alloy**/**Grafana**) + - Operated and supported **Tekton CD** and **ArgoCD** instances for developers + - Built and maintained [an open-source Kubernetes operator](https://github.com/ONPIER-OSS/gcp-kafka-auth-operator) for access management in **GCP Kafka** + - Implemented a custom [selenoid backend](https://github.com/ONPIER-OSS/selenoid) to run **e2e-tests** natively in **Kubernetes** -### Tools +#### Giant Swarm - Platform Engineer [12.2023 - 05.2024] + - Deployed and actively used **FluxCD** for GitOps-based workflows + - Maintained a large set of customer-facing **Helm charts** + - Contributed to and maintained multiple **Go** and **Rust** project -- **Environments**: Linux - Containers - Kubernetes - Proxmox -- **Kubernetes**: Helm - Kustomize - Kubebuilder - Helmfile -- **Scripting/Coding**: Bash - Go - Rust - Perl - Python -- **Continuous Integration**: Gitlab-CI - Github Actions - Circle-CI - Woodpecker-CI - Drone-CI -- **Continuous Delivery**: ArgoCD - Flux - Tekton -- **Infrastructure as Code**: Ansible - Terraform - Opentofu - Cluster API -- **Cloud Providers**: Microsoft Azure - Google Cloud - AWS - Yandex Cloud - Hetzner -- **Observability**: Prometheus - Mimir - Grafana - Loki - Elasticsearch - Kibana - FluentBit - Promtail - Fluentd - Grafana Alloy - Faro - Tempo -- **Secret Management**: Sops - Age - Helm Secrets - Hashicorp Vault -- **Databases**: PostgreSQL - MySQL - Percona MySQL - Redis - Mongo - Dragonfly -- **Storages**: Minio - Ceph - Longhorn -- **Others**: Kafka - RabbitMQ - Selenium - Selenoid - Kyverno - K3s - Kubeadm +#### Grandcentrix - SRE [02.2023 - 11.2023] + - Streamlined database management using the [db-operator](https://github.com/db-operator/db-operator) + - Configured, maintained, and actively used **ArgoCD** + - Refactored a large **Terraform** codebase with zero downtime + +#### Klöckner.I - DevOps Engineer [01.2022 - 01.2022] + - Migrated multiple **Percona MySQL** clusters to **Kubernetes** using **Percona Operator** + - Replaced a custom CD solution with **ArgoCD** + - Managed **GitLab** and **GitLab CI/CD** installations + - Implemented a cross-cloud backup solution using **Restic** + - Operated **Elasticsearch**, **Kibana**, and **FluentBit** + - Maintained federated **Prometheus** clusters across **Kubernetes** and **Linux Servers** + - Deployed and maintained **Vaultwarden** for company-wide secret management + - Maintained and contributed to **db-operator** + +#### Itigris - DevOps Engineer [07.2019 - 12.2021] + - Built **preview environments** using **ArgoCD** + - Implemented data streaming from **~800 PostgreSQL databases** using **Kafka** running in **Kubernetes** + - Designed and rolled out company-wide **Gitlab-CI/CD** pipelines for **Java** and **JavaScript** projects + - Developed a [cli tool](https://github.com/allanger/gitlab-user-manager) to manage access to **Gitlab** repositories + - Designed, implemented, and maintained **CI** pipelines for **e2e-tests**. + +#### Etersoft - DevOps Engineer [03.2017 - 06.2019] + - Designed, implemented, and maintained **CI** pipelines for **e2e-tests**. + - Maintained **Linux Servers** --- diff --git a/fonts/fira_sans/FiraSans-Black.ttf b/fonts/fira_sans/FiraSans-Black.ttf new file mode 100644 index 0000000..113cd3b Binary files /dev/null and b/fonts/fira_sans/FiraSans-Black.ttf differ diff --git a/fonts/fira_sans/FiraSans-BlackItalic.ttf b/fonts/fira_sans/FiraSans-BlackItalic.ttf new file mode 100644 index 0000000..1c49fb2 Binary files /dev/null and b/fonts/fira_sans/FiraSans-BlackItalic.ttf differ diff --git a/fonts/fira_sans/FiraSans-Bold.ttf b/fonts/fira_sans/FiraSans-Bold.ttf new file mode 100644 index 0000000..e3593fb Binary files /dev/null and b/fonts/fira_sans/FiraSans-Bold.ttf differ diff --git a/fonts/fira_sans/FiraSans-BoldItalic.ttf b/fonts/fira_sans/FiraSans-BoldItalic.ttf new file mode 100644 index 0000000..305b0b8 Binary files /dev/null and b/fonts/fira_sans/FiraSans-BoldItalic.ttf differ diff --git a/fonts/fira_sans/FiraSans-ExtraBold.ttf b/fonts/fira_sans/FiraSans-ExtraBold.ttf new file mode 100644 index 0000000..83744c1 Binary files /dev/null and b/fonts/fira_sans/FiraSans-ExtraBold.ttf differ diff --git a/fonts/fira_sans/FiraSans-ExtraBoldItalic.ttf b/fonts/fira_sans/FiraSans-ExtraBoldItalic.ttf new file mode 100644 index 0000000..54bcaca Binary files /dev/null and b/fonts/fira_sans/FiraSans-ExtraBoldItalic.ttf differ diff --git a/fonts/fira_sans/FiraSans-ExtraLight.ttf b/fonts/fira_sans/FiraSans-ExtraLight.ttf new file mode 100644 index 0000000..2d4e331 Binary files /dev/null and b/fonts/fira_sans/FiraSans-ExtraLight.ttf differ diff --git a/fonts/fira_sans/FiraSans-ExtraLightItalic.ttf b/fonts/fira_sans/FiraSans-ExtraLightItalic.ttf new file mode 100644 index 0000000..ef666ad Binary files /dev/null and b/fonts/fira_sans/FiraSans-ExtraLightItalic.ttf differ diff --git a/fonts/fira_sans/FiraSans-Italic.ttf b/fonts/fira_sans/FiraSans-Italic.ttf new file mode 100644 index 0000000..27d32ed Binary files /dev/null and b/fonts/fira_sans/FiraSans-Italic.ttf differ diff --git a/fonts/fira_sans/FiraSans-Light.ttf b/fonts/fira_sans/FiraSans-Light.ttf new file mode 100644 index 0000000..663d1de Binary files /dev/null and b/fonts/fira_sans/FiraSans-Light.ttf differ diff --git a/fonts/fira_sans/FiraSans-LightItalic.ttf b/fonts/fira_sans/FiraSans-LightItalic.ttf new file mode 100644 index 0000000..d1b1fc5 Binary files /dev/null and b/fonts/fira_sans/FiraSans-LightItalic.ttf differ diff --git a/fonts/fira_sans/FiraSans-Medium.ttf b/fonts/fira_sans/FiraSans-Medium.ttf new file mode 100644 index 0000000..001ebe7 Binary files /dev/null and b/fonts/fira_sans/FiraSans-Medium.ttf differ diff --git a/fonts/fira_sans/FiraSans-MediumItalic.ttf b/fonts/fira_sans/FiraSans-MediumItalic.ttf new file mode 100644 index 0000000..b7640be Binary files /dev/null and b/fonts/fira_sans/FiraSans-MediumItalic.ttf differ diff --git a/fonts/fira_sans/FiraSans-Regular.ttf b/fonts/fira_sans/FiraSans-Regular.ttf new file mode 100644 index 0000000..6f80647 Binary files /dev/null and b/fonts/fira_sans/FiraSans-Regular.ttf differ diff --git a/fonts/fira_sans/FiraSans-SemiBold.ttf b/fonts/fira_sans/FiraSans-SemiBold.ttf new file mode 100644 index 0000000..0c93b7e Binary files /dev/null and b/fonts/fira_sans/FiraSans-SemiBold.ttf differ diff --git a/fonts/fira_sans/FiraSans-SemiBoldItalic.ttf b/fonts/fira_sans/FiraSans-SemiBoldItalic.ttf new file mode 100644 index 0000000..e1a2989 Binary files /dev/null and b/fonts/fira_sans/FiraSans-SemiBoldItalic.ttf differ diff --git a/fonts/fira_sans/FiraSans-Thin.ttf b/fonts/fira_sans/FiraSans-Thin.ttf new file mode 100644 index 0000000..c925f94 Binary files /dev/null and b/fonts/fira_sans/FiraSans-Thin.ttf differ diff --git a/fonts/fira_sans/FiraSans-ThinItalic.ttf b/fonts/fira_sans/FiraSans-ThinItalic.ttf new file mode 100644 index 0000000..dd39092 Binary files /dev/null and b/fonts/fira_sans/FiraSans-ThinItalic.ttf differ diff --git a/german/index.md b/german/index.md index 9060c75..ce8ba6f 100644 --- a/german/index.md +++ b/german/index.md @@ -1,10 +1,12 @@ --- pdf_options: format: a4 - margin: 20mm 10mm + margin: 0mm 0mm printBackground: true +trim_trailing_whitespace: false stylesheet: - - https://cdnjs.cloudflare.com/ajax/libs/github-markdown-css/5.5.1/github-markdown.css + - ./css/nord_dark.css + body_class: markdown-body css: |- .markdown-body { @@ -13,54 +15,74 @@ css: |- .page-break { page-break-after: always; } --- -## Nikolai Rodionov +photo +
-``` -> Standort: Hamburg, Deutschland -> E-mail: allanger@zohomail.com -> Github: https://github.com/allanger -``` +## Nikolai Rodionov +### Senior DevOps Ingenieur + +
+ +> **Standort:**  Hamburg, Deutschland +> **E-mail:**     allanger@zohomail.com +> **Telefon:**   4915223284008 +> **GitHub:**    https://github.com/allanger ### Über mich -Ich bin ein DevOps-Ingenieur mit fast 10 Jahren praktischer Erfahrung und einer breiten Palette an Tools. Mein Fokus lag hauptsächlich auf Kubernetes und CI/CD-Pipelines, das bedeutet jedoch nicht, dass ich andere Themenbereiche meide. +Senior-DevOps-Ingenieur konzentrierte sich auf **Kubernetes** und **CI/CD Pipelines**. Ich baue und betreibe **skalierbare Systeme**, schreibe **Go** und **Rust**, verwalte **Servern** und **Datenbanken**, und helfe Entwicklern, Höchstleistungen zu erbringen. -Ein paar interessante Aufgaben, an denen ich gearbeitet habe: +Außerdem bin ich ein Maintainer eines **Open-Source-Kubernetes-Operators**, der Benutzern bei der Verwaltung von Datenbanken über CRDs helfen soll: + -- Migration von Datadog zu einem self-managed Monitoring-Stack (Mimir/Loki/Tempo/Grafana) -- GCP-Kafka-Zugriffsverwaltung mit einem selbstgeschriebenen k8s Operator () -- Migration mehrerer MySQL Percona-Cluster zu Kubernetes mithilfe des Percona-Operators -- Implementierung eines downtime-freien Blue-Green-RabbitMQ-Deployments -- Automatisierung des Data-Streamings von ~800 PostgreSQL-Datenbanken inklusive struktureller Änderungen via Kafka in Kubernetes -- Implementierung eines Kubernetes-Backends für Selenoid, um E2E-Tests nativ in Kubernetes auszuführen +--- -Außerdem bin ich Maintainer eines Kubernetes-Operators, der die Verwaltung von Datenbanken über CRDs vereinfacht: +### Fähigkeiten + +**Linux** - **Docker** - **Kubernetes** - **CI/CD** - **Automatisierung und Skripting** - **Bash/Golang/Rust** - **GitOps** +**Datenbankverwaltung** - **Observability und Monitoring** - **Terraform/OpenTofu/Ansible** - **AWS/GCP/Azure** + +--- ### Erfahrung -| Firma | Position | Zeitraum | -|------------------|---------------------|---------------------| -| **Onpier** | DevOps Ingenieur | 06.2024 - Bis jetzt | -| **Giant Swarm** | Plattform Ingenieur | 12.2023 - 05.2024 | -| **Grandcentrix** | SRE | 02.2023 - 11.2023 | -| **Klöckner.I** | DevOps Ingenieur | 01.2022 - 01.2023 | -| **Itigris** | DevOps Ingenieur | 07.2019 - 12.2021 | -| **Etersoft** | DevOps Ingenieur | 03.2017 - 06.2019 | +#### Onpier - DevOps-Ingenieur [06.2024 - bis jetzt] + - Aufbau und Einführung von Deployment-Workflows und CI/CD-Pipelines für einen Monitoring-Stack mit **helmfile** und **GitHub Actions** + - Konfiguration und Betrieb eines selbstverwalteten Observability-Stacks (**Mimir**, **Loki**, **Tempo**, **Grafana Alloy**, **Grafana**) + - Betrieb und Support von **Tekton CD-** und **ArgoCD-**Instanzen für Entwicklungsteams + - Entwicklung und Wartung eines [Open-Source-Kubernetes-Operators](https://github.com/ONPIER-OSS/gcp-kafka-auth-operator) für Zugriffsmanagement in **GCP Kafka** + - Implementierung eines eigenen [Selenoid-Backends](https://github.com/ONPIER-OSS/selenoid) zur nativen Ausführung von **E2E-Tests** in **Kubernetes** -### Tools +#### Giant Swarm - Plattform-Ingenieur [12.2023 - 05.2024] + - Einführung und aktive Nutzung von **FluxCD** für **GitOps** Deployments + - Wartung einer größeren Anzahl kundenorientierter **Helm Charts** + - Mitarbeit an sowie Wartung mehrerer **Go-** und **Rust-**Projekte -- **Umgebungen**: Linux - Containers - Kubernetes - Proxmox -- **Kubernetes**: Helm - Kustomize - Kubebuilder - Helmfile -- **Skripting/Programmierung**: Bash - Go - Rust - Perl - Python -- **Continuous Integration**: Gitlab-CI - Github Actions - Circle-CI - Woodpecker-CI - Drone-CI -- **Continuous Delivery**: ArgoCD - Flux - Tekton -- **IaC**: Ansible - Terraform - Opentofu - Cluster API -- **Cloud Providers**: Microsoft Azure - Google Cloud - AWS - Yandex Cloud - Hetzner -- **Observability**: Prometheus - Mimir - Grafana - Loki - Elasticsearch - Kibana - FluentBit - Promtail - Fluentd - Grafana Alloy - Faro - Tempo -- **Secret-Management**: Sops - Age - Helm Secrets - Hashicorp Vault -- **Datenbanken**: PostgreSQL - MySQL - Percona MySQL - Redis - Mongo - Dragonfly -- **Storages**: Minio - Ceph - Longhorn -- **Sonstiges**: Kafka - RabbitMQ - Selenium - Selenoid - Kyverno - K3s - Kubeadm +#### Grandcentrix - SRE [02.2023 - 11.2023] + - Optimierung des Datenbank-Lifecycle-Managements mit dem [db-operator](https://github.com/db-operator/db-operator) + - Konfiguration, Wartung und aktive Nutzung von **ArgoCD** + - Refactoring einer umfangreichen Terraform-Codebasis ohne Downtime + +#### Klöckner.I - DevOps-Ingenieur [01.2022 - 01.2022] + - Migration mehrerer **Percona MySQL-Cluster** nach **Kubernetes** mithilfe des **Percona Operators** + - Ablösung einer selbst entwickelten CD-Lösung durch **ArgoCD** + - Betrieb und Wartung von **GitLab** und **GitLab CI/CD** + - Implementierung von Cross-Cloud-Backup-Strategien mit **Restic** + - Betrieb von **Elasticsearch**, **Kibana**, und **FluentBit** + - Wartung **Federated-Prometheus-Cluster** auf **Kubernetes** und **Linux-Servern** + - Einführung und Betrieb von **Vaultwarden** für unternehmensweites Secret-Management + - Wartung **db-operator** + +#### Itigris - DevOps-Ingenieur [07.2019 - 12.2021] + - Aufbau **Preview-Environments** mithilfe **ArgoCD** + - Umsetzung von Daten-Streaming aus ca. **800 PostgreSQL-Datenbanken** in einen auf **Kubernetes** betriebenen **Kafka-Cluster** + - Konzeption und Einführung unternehmensweiter **GitLab CI/CD-Pipelines** für **Java-** und **JavaScript-**Projekte + - Entwicklung eines [Cli-Tools](https://github.com/allanger/gitlab-user-manager) zur Verwaltung von Zugriffsrechten auf **GitLab**-Repositories + - Konzeption, Implementierung und Betrieb von **CI-Pipelines** für **E2E-Tests** + +#### Etersoft - DevOps-Ingenieur [03.2017 - 06.2019] + - Konzeption, Implementierung und Betrieb von **CI-Pipelines** für **E2E-Tests** + - Betrieb und Wartung von **Linux-Servern** --- diff --git a/package-lock.json b/package-lock.json index 4b9632d..1e3a139 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "license": "ISC", "dependencies": { "markdown-spellcheck": "^1.3.1", - "md-to-pdf": "^5.2.4" + "md-to-pdf": "^5.2.5" } }, "node_modules/@babel/code-frame": { @@ -37,9 +37,9 @@ } }, "node_modules/@puppeteer/browsers": { - "version": "2.11.2", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.11.2.tgz", - "integrity": "sha512-GBY0+2lI9fDrjgb5dFL9+enKXqyOPok9PXg/69NVkjW3bikbK9RQrNrI3qccQXmDNN7ln4j/yL89Qgvj/tfqrw==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.12.0.tgz", + "integrity": "sha512-Xuq42yxcQJ54ti8ZHNzF5snFvtpgXzNToJ1bXUGQRaiO8t+B6UM8sTUJfvV+AJnqtkJU/7hdy6nbKyA12aHtRw==", "license": "Apache-2.0", "dependencies": { "debug": "^4.4.3", @@ -84,9 +84,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "25.2.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.2.0.tgz", - "integrity": "sha512-DZ8VwRFUNzuqJ5khrvwMXHmvPe+zGayJhr2CDNiKB1WBE1ST8Djl00D0IC4vvNmHMdj6DlbYRIaFE7WHjlDl5w==", + "version": "25.2.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.2.3.tgz", + "integrity": "sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ==", "license": "MIT", "optional": true, "dependencies": { @@ -513,9 +513,9 @@ } }, "node_modules/chromium-bidi": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-13.0.1.tgz", - "integrity": "sha512-c+RLxH0Vg2x2syS9wPw378oJgiJNXtYXUvnVAldUlt5uaHekn0CCU7gPksNgHjrH1qFhmjVXQj4esvuthuC7OQ==", + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-13.1.1.tgz", + "integrity": "sha512-zB9MpoPd7VJwjowQqiW3FKOvQwffFMjQ8Iejp5ZW+sJaKLRhZX1sTxzl3Zt22TDB4zP0OOqs8lRoY7eAW5geyQ==", "license": "Apache-2.0", "dependencies": { "mitt": "^3.0.1", @@ -852,9 +852,9 @@ } }, "node_modules/devtools-protocol": { - "version": "0.0.1551306", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1551306.tgz", - "integrity": "sha512-CFx8QdSim8iIv+2ZcEOclBKTQY6BI1IEDa7Tm9YkwAXzEWFndTEzpTo5jAUhSnq24IC7xaDw0wvGcm96+Y3PEg==", + "version": "0.0.1566079", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1566079.tgz", + "integrity": "sha512-MJfAEA1UfVhSs7fbSQOG4czavUp1ajfg6prlAN0+cmfa2zNjaIbvq8VneP7do1WAQQIvgNJWSMeP6UyI90gIlQ==", "license": "BSD-3-Clause" }, "node_modules/dunder-proto": { @@ -2644,17 +2644,17 @@ } }, "node_modules/puppeteer": { - "version": "24.36.1", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.36.1.tgz", - "integrity": "sha512-uPiDUyf7gd7Il1KnqfNUtHqntL0w1LapEw5Zsuh8oCK8GsqdxySX1PzdIHKB2Dw273gWY4MW0zC5gy3Re9XlqQ==", + "version": "24.37.2", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.37.2.tgz", + "integrity": "sha512-FV1W/919ve0y0oiS/3Rp5XY4MUNUokpZOH/5M4MMDfrrvh6T9VbdKvAHrAFHBuCxvluDxhjra20W7Iz6HJUcIQ==", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@puppeteer/browsers": "2.11.2", - "chromium-bidi": "13.0.1", + "@puppeteer/browsers": "2.12.0", + "chromium-bidi": "13.1.1", "cosmiconfig": "^9.0.0", - "devtools-protocol": "0.0.1551306", - "puppeteer-core": "24.36.1", + "devtools-protocol": "0.0.1566079", + "puppeteer-core": "24.37.2", "typed-query-selector": "^2.12.0" }, "bin": { @@ -2665,15 +2665,15 @@ } }, "node_modules/puppeteer-core": { - "version": "24.36.1", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.36.1.tgz", - "integrity": "sha512-L7ykMWc3lQf3HS7ME3PSjp7wMIjJeW6+bKfH/RSTz5l6VUDGubnrC2BKj3UvM28Y5PMDFW0xniJOZHBZPpW1dQ==", + "version": "24.37.2", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.37.2.tgz", + "integrity": "sha512-nN8qwE3TGF2vA/+xemPxbesntTuqD9vCGOiZL2uh8HES3pPzLX20MyQjB42dH2rhQ3W3TljZ4ZaKZ0yX/abQuw==", "license": "Apache-2.0", "dependencies": { - "@puppeteer/browsers": "2.11.2", - "chromium-bidi": "13.0.1", + "@puppeteer/browsers": "2.12.0", + "chromium-bidi": "13.1.1", "debug": "^4.4.3", - "devtools-protocol": "0.0.1551306", + "devtools-protocol": "0.0.1566079", "typed-query-selector": "^2.12.0", "webdriver-bidi-protocol": "0.4.0", "ws": "^8.19.0" @@ -2833,9 +2833,9 @@ } }, "node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "license": "ISC", "bin": { "semver": "bin/semver.js" diff --git a/package.json b/package.json index 44e4877..464c7e3 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,6 @@ "license": "ISC", "dependencies": { "markdown-spellcheck": "^1.3.1", - "md-to-pdf": "^5.2.4" + "md-to-pdf": "^5.2.5" } } diff --git a/resources/photo.jpeg b/resources/photo.jpeg new file mode 100644 index 0000000..da9dead Binary files /dev/null and b/resources/photo.jpeg differ diff --git a/resources/photo.jpg b/resources/photo.jpg new file mode 100644 index 0000000..508b0c1 Binary files /dev/null and b/resources/photo.jpg differ diff --git a/resources/photo.png b/resources/photo.png new file mode 100644 index 0000000..5d38102 Binary files /dev/null and b/resources/photo.png differ