Bus factor belongs in DevSecOps because software supply chain risk starts before deployment. This matters because CI/CD pipelines can move fragile dependencies into production faster than teams can assess them. The article closes on a practical theme: dependency risk is not only about licenses or vulnerability counts, but also the sustainability of the people behind the code. It points to auditing signals such as organizational diversity, labor investment, and documentation quality. Those are useful controls for operators because they help distinguish a widely used package from a resiliently maintained one. For Linux and platform teams, this affects build pipelines, base images, internal package mirrors, and release approvals. If a critical upstream dependency is maintained by too few people, weakly documented, or overly concentrated in one employer, the downstream effect can be slower fixes, weaker review, and harder incident response when something changes unexpectedly. That is especially relevant for packages embedded in containerized workloads and automated deployment paths. Many CI pipelines verify whether dependencies are current, but not whether the projects behind them are operationally durable. For Linux administrators and infrastructure teams, this has practical implications. In practical terms, it is a good time to review: - whether dependency gates include criticality and maintainer-health signals - SBOM coverage for build-time and runtime packages - provenance and signing checks for promoted artifacts - exception handling for unmaintained or thinly maintained dependencies - image rebuild frequency for inherited package updates - escalation paths when a core open-source component shows governance or maintainer stress Article: https://lnkd.in/g5i2HX9u #DevSecOps #LinuxSecurity #OpenSourceSecurity #SupplyChainSecurity
DevSecOps and Software Supply Chain Risk
More Relevant Posts
-
If you want to treat your OS as part of your infrastructure contract, immutability changes the game. Without it, you can describe the desired state—but you can’t reliably guarantee it over time. What Olivier describes is a very familiar failure mode. Good to see Kairos fitting naturally into a more disciplined pipeline.
Hello Monday, A few years ago my dedicated server died — 100+ containers, docker-compose, no GitOps, no recovery plan. I migrated what I could to a friend's VM and called it infrastructure. That experience stuck with me. Fast forward to #KubeCon Amsterdam 2026. I meet the Octopus Deploy team and one line stays with me: "𝗖𝗜 𝗶𝘀 𝗻𝗼𝘁 𝗖𝗗”. Simple. Obvious in hindsight. But it named something I'd been doing wrong for years — treating deployment as the last step of my build pipeline instead of a separate concern with its own lifecycle, environments, and promotion logic. So I went home and built something real. What hooked me on Octopus Deploy: 𝗘𝗻𝘃𝗶𝗿𝗼𝗻𝗺𝗲𝗻𝘁 𝗺𝗼𝗱𝗲𝗹𝗶𝗻𝗴. Structured promotion with gates, approvals, and ephemeral preview environments — not just dev/staging/prod labels. 𝗔𝗿𝗴𝗼𝗖𝗗 𝗶𝗻𝘁𝗲𝗴𝗿𝗮𝘁𝗶𝗼𝗻. Octopus acquired Codefresh in 2024 — the team behind ArgoCD. Promotion meets reconciliation. Each doing what it was designed for. 𝗧𝗵𝗲 𝗠𝗖𝗣 𝘀𝗲𝗿𝘃𝗲𝗿. Your AI assistant can query your Octopus instance directly — inspect deployments, trace failures. Agentic SRE is becoming real. What I wired together on a single Hetzner CPX42: ↳ Kairos · k3s · Cilium (eBPF, Gateway API, Hubble) ↳ cert-manager + OVH DNS-01 ↳ Gateway API · HTTPRoutes · TLS ↳ Gitea · PostgreSQL · Valkey · Actions runner ↳ Octopus Deploy 2025.4 · MSSQL · K8s agent ↳ Hugo + nginx Why? I never want to touch a Word CV again. My CV runs as a Hugo site at octy.calzi.eu — TLS managed, password protected, multiple profiles. git push → Gitea Actions: build + push to quay.io → Octopus: create release → ephemeral preview → review → promote → ArgoCD syncs → live. No Word files. No "wrong version" emails. Just a git push, a preview link, and a promote button. Moving parts break. That's where the Octopus Recovery Agent would shine. Not yet available on self-hosted Helm — I'd have loved to test it here. I'm confident it'll get there. How are you tracing failures in multi-step pipelines today? Check out the Octopus Recovery Agent 👉 https://lnkd.in/efPznupU From a crashed server to a production-grade GitOps pipeline on a single node. Same constraints. Completely different mindset. Sponsored by @Octopus Deploy #KubeCon #Kubernetes #GitOps #CICD #CloudNative #OctopusDeploy #PlatformEngineering #Ad #Sponsorised
To view or add a comment, sign in
-
-
The Kubernetes "--force" delete is a lie. Here is why. We’ve all been there: mashing kubectl delete --force hoping a stuck resource will magically disappear. A quick 5-minute debugging session across two different clusters today reminded me why --force isn't always the answer. The culprit? Finalizers. Think of a Finalizer as an NOC (No Objection Certificate). The Kubernetes API server refuses to delete a resource until every system on that checklist gives the green light. Usually, this is great for safety. But when things break, it causes deadlocks. Here is how I ran into it twice recently on two different clusters: Cluster 1: The "Ghost" Pod: A worker pod was stuck in "Error" state. I deleted the parent Deployment and ran a force delete with "--grace-period=0". The terminal said "deleted," but "kubectl get pods" showed the pod was still sitting there. Why? The pod had a finalizer waiting for a cleanup process that had crashed. The node killed the container, but the API server kept the record alive because the NOC was never signed. Cluster 2: The Hostage Storage (PVC): On another cluster, I was cleaning up a namespace and tried to delete a persistent volume. The command just hung. Running "kubectl describe pvc" revealed: Finalizers: [kubernetes. io/pvc-protection]. Why? This is K8s' built-in safety lock. It prevents you from deleting a disk while a pod might still be using it. If a previous pod deletion didn't finish gracefully, the API server thinks the storage is still needed, and the PVC controller refuses to let go. The Fix: When the system is stuck waiting on a ghost process, you have to manually bypass the NOC by patching the finalizers to null. # 1. Kill the ghost pod record kubectl patch pod <pod-name> -p '{"metadata":{"finalizers":null}}' --type=merge # 2. Release the stuck PVC kubectl patch pvc <pvc-name> -p '{"metadata":{"finalizers":null}}' --type=merge A quick warning: Only do this if you are 100% sure the resources are abandoned. Force-patching a PVC finalizer on a live production database is a great way to lose your data. But for stuck dev environments, it’s the exact fix you need. What is the most stubborn K8s issue you've debugged recently? 👇 #Kubernetes #DevOps #SRE #CloudNative #PlatformEngineering #TechTips
To view or add a comment, sign in
-
Have you ever spent hours debugging something that looks fine on the surface but refuses to work no matter what you try? That was me with a Nexus Repository setup on EC2 — everything was “successful”… until it wasn’t. I ran into a situation where Nexus would start and immediately shut down, Java errors kept pointing in different directions, and logs were either missing or misleading. For a while, it looked like: a Java issue a memory issue even a permissions problem But none of that was the real problem. What was actually going on? The Nexus tarball was being extracted into /tmp, which in this environment is a RAM-backed filesystem with limited space. The archive was ~400MB, and during extraction it silently got cut off halfway. So what I ended up with was: a partially installed, corrupted Nexus setup That’s why: Java failed instantly services kept stopping logs never properly generated everything felt “randomly broken” The fix Once I spotted the real issue, the solution was simple: Moved extraction from /tmp to /opt (actual disk storage) Cleaned up corrupted files and stale PID data Reinstalled Nexus properly Boom 💥 — everything came up clean on first run. Lesson learned In DevOps, not every complex-looking failure is actually complex. Sometimes the real issue is just: “Wrong place. Wrong assumption. Wrong storage.” Always validate: where your files are extracted available disk space (df -h) integrity of downloaded archives Small oversights can look like big system failures. If you’ve ever chased a “ghost bug” that turned out to be something simple in disguise, you know the feeling. #DevOps #Linux #AWS #Jenkins #Nexus #CloudComputing #SystemAdministration #CI_CD #Troubleshooting #DevOpsEngineer #LearningInPublic
To view or add a comment, sign in
-
-
The subject of "Shadow MCP" has been a consistent topic in almost every meeting over the last six months. This frequently leads to a key question: "What is the concrete advantage for developers to transition their existing local Model Context Protocol (MCP) servers to a centralized, governed deployment?" Here are a few developer-centric benefits that I’ve documented throughout these discussions: 1) The Death of "It Works on My Machine" When MCP servers are local, every developer on the team has to manage their own environment, dependencies, and secret keys. By moving to a remote hosted model, you create a single source of truth. ⌨️ The Dev Value: You can share a link to a hosted MCP server with a teammate, and it just works for them instantly. No more debugging a colleague's local Python environment or missing .env files. 2) Resource Liberation (Save the Laptop Fans) Local MCP servers, especially those doing heavy lifting like vector database lookups or complex data processing, eat up local RAM and CPU. ⌨️ The Dev Value: Offloading these processes to the edge keeps the developer's local machine snappy. It prevents the "IDE lag" that happens when your machine is trying to run a local LLM, an MCP server, and a massive Docker stack all at once. 3) Unified Access Across Every Client Developers rarely work on just one device anymore. They might use VS Code on a desktop, a browser-based IDE (like GitHub Codespaces) on a laptop, or even a tablet for quick fixes. ⌨️ The Dev Value: A hosted MCP server is client-agnostic. Once it’s deployed to a remote location, the developer can connect their AI assistant to it from any device or environment without re-configuring local tunnels or port forwarding every single time. 4) Built-in Observability & Debugging In a local setup, if an MCP tool fails, the developer is usually digging through terminal logs. ⌨️ The Dev Value: Hosted platforms typically provide centralized logging and trace views. It makes it much easier to see exactly where a prompt-to-tool call failed, what the payload looked like, and how long the execution took; without having to "print statement" their way through a local process. 5) Production-Ready "Side Projects" Developers love to build tools that solve their own problems. Moving from local to remote is the bridge between a "hack" and a "utility." ⌨️ The Dev Value: It allows a developer to turn a custom-built tool into a shared team asset with zero extra infrastructure work. They get to be the "hero" who provided the team with a new capability without having to become the "sysadmin" who supports it on everyone's individual laptops. While CISOs care about risk and CTOs care about cost, developers care about friction. Moving MCP servers to a hosted environment turns a fiddly local project into a production-grade tool without the extra overhead. Build and streamline secure access to a remote MCP server today! https://lnkd.in/guUHCkFe
To view or add a comment, sign in
-
-
"What k*lls the creative force is not age or a lack of talent, but our own spirit, our own altitude" - Robert Greene Good day, everyone😊 Day 9 of my #100DaysOfDevOps challenge was a reminder that in production, chaos is the only constant. But chaos is also where a DevOps engineer finds their value. The scenario: The Nautilus Application in the Stratos DC was hemorrhaging. Production support flagged a critical connection failure, the application couldn’t talk to the database. When the heartbeat of your app stops, every second counts. Here is how I resolved this problem, moving from a blind error to a surgical fix. First let me clear this out, we are troubleshooting the mariadb connection issue. So here's how I did it I always implement research Over reflex. Before touching the terminal or using commands, I went to the documentation. It’s very tempting to start throwing commands at a broken server, but I’ve learned that expertise is built on structured troubleshooting. I familiarized myself with MariaDB’s common failure modes before jumping into the heat, as well as possible solutions. So to solve this task, I first accessed the database server (`stdb01`) using the ssh command to leave the jump host. When that was done I tried to start it once more using: 'sudo systemctl start mariadb' The result? A failure. Then I used 'systemctl status' which showed Exit status: 1. This is the crossroads where most people get frustrated, but it’s where the real work begins. If the service won't start, the logs are the only map you have. I went straight to the MariaDB error logs using 'cat /var/log/mariadb/mariadb.log | tail -30' The log read as follows: Can't create/write to file '/run/mariadb/mariadb.pid' (Errcode: 13 "Permission denied") In the Linux, permissions are the silent killers of uptime. The /run/mariadb directory, essential for holding the Process ID (PID) file had lost its way. I had to re-assert control using the commands: 'chown -R mysql:mysql /run/mariadb`' (Returning the keys to the 'mysql' user). 'chmod 755 /run/mariadb' (Ensuring the owner can write while keeping the system secure). When that was done I used `systemctl start`, then checked the status to see if the issue is resolved. And boom success, mariadb was active and running which signaled my task is done. If you can't read the logs, you're just guessing. If you can't manage permissions, you're just a visitor in your own environment. Though of course there are many ways to resolve this, and this was one of them. #DevOps #100DaysOfDevOp #TechCommunity #LearningInPublic
To view or add a comment, sign in
-
Real Microservices Lesson: When One Service Goes Down, Everything Can Crash While working with microservices, I encountered an issue that many systems face but often only realize after it breaks things. Let’s say there are two microservices: MS1 and MS2. MS1 depends on MS2 for fetching some data. Everything works fine… until MS2 goes down. Now here’s where things get interesting 👇 Even after MS2 was stopped, MS1 kept sending requests to it. Those requests kept waiting for a response that would never come. 💥 Problem: The application’s thread pool started getting exhausted because threads were stuck waiting on a non-responsive service. 📉 Impact: Eventually, the entire application crashed with multiple 500 Internal Server Errors. 🛠️ Solution: Circuit Breaker To fix this, I implemented a Circuit Breaker pattern. Think of it as a safety switch for microservices: -> When a dependent service fails repeatedly, the circuit breaker trips (opens) -> It stops further calls to that failing service. ->Instead of waiting, the system returns a fallback response. ->This gives the downstream service time to recover and avoiding system to crash. ⚡ Why it matters: Prevents cascading failures Avoids thread exhaustion Enables graceful degradation Improves overall system resilience 💡 Key takeaway: In distributed systems, failure is inevitable. What matters is how gracefully your system handles it. 👉 In the next post, I’ll explain the states of a circuit breaker and share a code example where I’ve applied it. #Microservices #Java #SpringBoot #SystemDesign #BackendDevelopment #Resilience #CircuitBreaker
To view or add a comment, sign in
-
This week, I completely refactored the infrastructure architecture of my home lab and completed a massive DevSecOps migration. I recently transitioned my full-stack environment (Nebula Forge) off a heavy, monolithic Ubuntu VM—which had been natively hosting monitoring tools like Grafana and Prometheus alongside my applications—and re-engineered the entire pipeline to run on a highly optimized Proxmox LXC container acting as a centralized Docker Host. Moving from traditional package installations to an isolated, containerized microservice architecture brought several massive advantages to the environment: 📉 𝐑𝐞𝐬𝐨𝐮𝐫𝐜𝐞 𝐎𝐩𝐭𝐢𝐦𝐢𝐳𝐚𝐭𝐢𝐨𝐧: Swapping a thick Ubuntu VM for a minimalistic Debian LXC eliminated the resource contention between the hypervisor and the VM. The compute and memory footprint has been drastically reduced, freeing up valuable hardware resources for future scaling. 🔒 𝐙𝐞𝐫𝐨-𝐓𝐫𝐮𝐬𝐭 𝐒𝐞𝐜𝐮𝐫𝐢𝐭𝐲 & 𝐍𝐞𝐭𝐰𝐨𝐫𝐤 𝐒𝐞𝐠𝐦𝐞𝐧𝐭𝐚𝐭𝐢𝐨𝐧: By utilizing Docker networks and redirecting Cloudflare Zero Trust Tunnels, I completely bypassed traditional pfSense NAT port forwarding. The internal applications are deeply segmented, and the public perimeter is locked down. 🧩 𝐂𝐞𝐧𝐭𝐫𝐚𝐥𝐢𝐳𝐞𝐝 𝐎𝐫𝐜𝐡𝐞𝐬𝐭𝐫𝐚𝐭𝐢𝐨𝐧: Managing a multi-database environment (MySQL and MongoDB), a Spring Boot backend, a Go API Gateway, and high-availability frontends is now centralized through Portainer, providing distinct container isolation without the overhead. 💾 𝐒𝐭𝐫𝐞𝐚𝐦𝐥𝐢𝐧𝐞𝐝 𝐃𝐢𝐬𝐚𝐬𝐭𝐞𝐫 𝐑𝐞𝐜𝐨𝐯𝐞𝐫𝐲: The old VM setup was a massive data hog. Containerizing the apps and mapping persistent volumes allows for highly efficient snapshotting and makes adhering to strict 3-2-1 backup procedures significantly easier and faster. During the migration, I also successfully untangled hardcoded port conflicts, implemented a "cold standby" high-availability frontend, and navigated live database credential rotations via CLI to bring the Spring Boot environment fully online with zero data loss. There is nothing quite like the satisfaction of watching a complex transaction flow securely from the public internet, through a Cloudflare tunnel, into a containerized Java backend, and commit perfectly across both relational and NoSQL databases. On to the next challenge! #DevSecOps #DevOps #PlatformEngineering #CloudSecurity #SRE #SiteReliabilityEngineering #Proxmox #Docker #Cloudflare #InfrastructureAsCode #CyberSecurity #CI_CD #TechHomeLab
To view or add a comment, sign in
-
-
🔐 Implementing Enterprise-Grade Kubernetes RBAC & Cloud Automation I’m excited to share my latest project focused on Scalable Kubernetes Security and Cloud Identity Management. As I dive deeper into Cloud Infrastructure, my goal is to build environments that are not just automated, but inherently secure. In this project, I architected a multi-environment access strategy that balances developer agility with strict security protocols. Core Project Highlights: 🏗️ Identity Automation: Engineered an Ansible playbook to automate IAM user lifecycle management across Dev, Staging, UAT, and Production tiers. 🛡️ Granular RBAC Manifests: Implemented a "Least Privilege" model using Kubernetes ClusterRoles and RoleBindings, creating clear boundaries between Admin and Viewer permissions. 🌐 Secure Networking: Deployed Nginx Ingress with TLS offloading to ensure encrypted, professional-grade traffic routing. 📂 Modular Architecture: Structured the repository into clean, domain-specific modules (IAM, RBAC, Ingress) for easier auditing and team collaboration. Tech Stack: Orchestration: Kubernetes (EKS) Configuration: Ansible Networking: Nginx Ingress & TLS Environment: Ubuntu Linux & Docker By automating these security layers, I've reduced the risk of manual configuration errors while ensuring the infrastructure remains compliant and auditable. Check out the architecture and code here: 👉 https://lnkd.in/gy5trmrR #DevOps #Kubernetes #CloudEngineering #AWS #Ansible #Abhishek Veeramalla #CyberSecurity #CloudNative #InfrastructureAsCode #BengaluruTech
To view or add a comment, sign in
-
📂 Kubernetes Engineer ├─ 📂 Foundations (START HERE) │ ├─ 📂 Linux Fundamentals ⭐ FIRST │ │ ├─ Processes & PID │ │ ├─ Signals │ │ ├─ File systems & inodes │ │ ├─ Users, groups & permissions │ │ ├─ Networking basics (TCP/IP, ports, DNS) │ │ └─ cgroups & namespaces (conceptual) │ │ │ ├─ 📂 Containers │ │ ├─ What containers really are │ │ ├─ Containers vs VMs │ │ ├─ Docker architecture │ │ ├─ Images, layers & registries │ │ └─ Container networking basics │ │ │ ├─ 📂 YAML & CLI │ │ ├─ YAML structure & indentation │ │ ├─ kubectl basics │ │ ├─ Imperative vs Declarative │ │ └─ Reading manifests confidently │ │ │ └─ 📂 Why Kubernetes? │ ├─ Scheduling problem │ ├─ Scaling problem │ ├─ Self-healing systems │ └─ Desired state management │ ├─ 📂 Core Kubernetes │ ├─ 📂 Architecture │ │ ├─ Control Plane components │ │ ├─ Worker Nodes │ │ ├─ API Server │ │ ├─ Scheduler │ │ └─ etcd basics │ │ │ ├─ 📂 Core Workloads │ │ ├─ Pod │ │ ├─ ReplicaSet │ │ ├─ Deployment │ │ ├─ StatefulSet │ │ └─ DaemonSet │ │ │ ├─ 📂 Configuration │ │ ├─ ConfigMaps │ │ ├─ Secrets │ │ └─ Environment variables │ │ │ └─ 📂 Services & Networking │ ├─ ClusterIP │ ├─ NodePort │ ├─ LoadBalancer │ ├─ Ingress basics │ └─ DNS inside cluster │ ├─ 📂 Storage & Scheduling │ ├─ 📂 Storage │ │ ├─ Volumes │ │ ├─ PersistentVolume (PV) │ │ ├─ PersistentVolumeClaim (PVC) │ │ └─ StorageClasses │ │ │ ├─ 📂 Resource Management │ │ ├─ Requests & Limits │ │ ├─ Resource Quotas │ │ └─ LimitRanges │ │ │ └─ 📂 Advanced Scheduling │ ├─ Node Selectors │ ├─ Node Affinity │ ├─ Taints & Tolerations │ └─ Pod Anti-Affinity │ ├─ 📂 Security (NON-NEGOTIABLE) │ ├─ 📂 Access Control │ │ ├─ RBAC │ │ ├─ Roles vs ClusterRoles │ │ ├─ Service Accounts │ │ └─ Principle of Least Privilege │ │ │ ├─ 📂 Pod Security │ │ ├─ Security Context │ │ ├─ Pod Security Standards │ │ └─ Image security basics │ │ │ └─ 📂 Network Security │ ├─ Network Policies │ ├─ Internal-only services │ └─ mTLS concepts 𝐂𝐡𝐞𝐜𝐤 𝐭𝐡𝐞 𝐜𝐨𝐦𝐦𝐞𝐧𝐭 𝐬𝐞𝐜𝐭𝐢𝐨𝐧 🔁 Feel free to repost if you find this helpful. ♻️ Share so others can learn as well! _________________________________________ 𝐃𝐞𝐯𝐎𝐩𝐬 𝐓𝐫𝐚𝐢𝐧𝐢𝐧𝐠 𝐂𝐨𝐡𝐨𝐫𝐭 𝟒 𝐢𝐬 𝐧𝐨𝐰 𝐨𝐩𝐞𝐧. Job-Readiness. We don't just teach tools; we build the skill sets required to solve real-world architectural challenges. Career Opportunities: Our graduates are equipped to lead digital transformations in Finance, Healthcare, and Tech as: ✓ DevOps Engineer ✓ Automation Engineer ✓ CI/CD Specialist 𝐒𝐞𝐜𝐮𝐫𝐞 your spot today 👉https://lnkd.in/egAyQvGC
To view or add a comment, sign in
-
-
Port forwarding in Kubernetes creates a secure tunnel between your local machine and cluster resources through the API server. It's useful for debugging, database access, and testing services without modifying network configurations or setting up load balancers. The kubectl port-forward command establishes a temporary TCP connection that works for pods, services, or deployments. Common scenarios include local development with remote services, accessing internal dashboards, and connecting database clients. If you're developing with Kubernetes you will almost certainly use port forwarding. Flavius Dinu wrote this great guide covering syntax, real-world use cases, and alternatives like LoadBalancers and Ingress controllers. Check it out! https://lnkd.in/deWS_YJn
To view or add a comment, sign in
More from this author
Explore related topics
Explore content categories
- Career
- Productivity
- Finance
- Soft Skills & Emotional Intelligence
- Project Management
- Education
- Technology
- Leadership
- Ecommerce
- User Experience
- Recruitment & HR
- Customer Experience
- Real Estate
- Marketing
- Sales
- Retail & Merchandising
- Science
- Supply Chain Management
- Future Of Work
- Consulting
- Writing
- Economics
- Artificial Intelligence
- Employee Experience
- Workplace Trends
- Fundraising
- Networking
- Corporate Social Responsibility
- Negotiation
- Communication
- Engineering
- Hospitality & Tourism
- Business Strategy
- Change Management
- Organizational Culture
- Design
- Innovation
- Event Planning
- Training & Development