<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Datacenter &#8211; Best DevOps</title>
	<atom:link href="https://www.bestdevops.com/tag/datacenter/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.bestdevops.com</link>
	<description>Lets Learn, Do it &#38; Share! Thats a Best DevOps!!!</description>
	<lastBuildDate>Wed, 14 Oct 2026 13:52:11 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.3</generator>
	<item>
		<title>Docker in the Datacenter: Enterprise Orchestration + Security (What I Actually Do in Production)</title>
		<link>https://www.bestdevops.com/docker-datacenter-adds-enterprise-orchestration-security-policy-and-refreshed-ui/</link>
					<comments>https://www.bestdevops.com/docker-datacenter-adds-enterprise-orchestration-security-policy-and-refreshed-ui/#respond</comments>
		
		<dc:creator><![CDATA[Rajesh Kumar]]></dc:creator>
		<pubDate>Sat, 07 Feb 2026 19:55:19 +0000</pubDate>
				<category><![CDATA[IT Training]]></category>
		<category><![CDATA[Datacenter]]></category>
		<category><![CDATA[DDC]]></category>
		<category><![CDATA[Docker]]></category>
		<category><![CDATA[Docker Datacenter]]></category>
		<category><![CDATA[Docker Engine]]></category>
		<category><![CDATA[Docker Security]]></category>
		<guid isPermaLink="false">http://www.bestdevops.com/?p=55</guid>

					<description><![CDATA[I’ll be blunt from 20+ years of shipping systems: Docker is not “the platform” in an enterprise datacenter. Docker is [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h1 class="wp-block-heading"></h1>



<p class="wp-block-paragraph">I’ll be blunt from 20+ years of shipping systems: <strong>Docker is not “the platform” in an enterprise datacenter</strong>. Docker is the <em>developer experience + image packaging standard</em> that feeds an orchestration platform (usually Kubernetes or OpenShift) and a security program (supply chain + runtime controls). If you treat Docker like the whole story, you end up with snowflake hosts, unpatchable images, and “it worked on my laptop” outages.</p>



<p class="wp-block-paragraph">Below is how I design, implement, and operate Docker-based container platforms <strong>end-to-end</strong> in real datacenters—small setups to regulated enterprises—focusing on orchestration and security with practical gates and failure modes.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">1) What / Why / When / Where / How</h2>



<h3 class="wp-block-heading">What “Docker at the Datacenter” really means</h3>



<p class="wp-block-paragraph">In enterprise terms, Docker typically shows up in four places:</p>



<ol class="wp-block-list">
<li><strong>Build &amp; packaging</strong>: Dockerfiles, BuildKit/buildx, image tagging, multi-arch builds.</li>



<li><strong>Developer runtime</strong>: Docker Desktop / Linux Docker Engine for local dev.</li>



<li><strong>Distribution</strong>: Pushing images to a registry (Harbor / Artifactory / ECR / ACR / GCR, etc.).</li>



<li><strong>Security controls</strong>: SBOMs, vulnerability scanning, policy evaluation, signing/attestations.</li>
</ol>



<p class="wp-block-paragraph">And in production orchestration:</p>



<ul class="wp-block-list">
<li><strong>Kubernetes does <em>not</em> use Docker Engine as its runtime anymore</strong> (dockershim is gone). Production clusters run <strong>containerd / CRI-O</strong> and pull <strong>OCI images</strong> built by Docker tooling. ()</li>
</ul>



<h3 class="wp-block-heading">Why enterprises standardize on Docker images</h3>



<p class="wp-block-paragraph">Because images give you:</p>



<ul class="wp-block-list">
<li>Consistent deployment units (app + deps)</li>



<li>Faster environment parity</li>



<li>Repeatable CI/CD</li>



<li>A base for supply-chain security (SBOM/provenance/signing)</li>
</ul>



<h3 class="wp-block-heading">When containers (and Docker images) are the right choice</h3>



<p class="wp-block-paragraph"><strong>Good fit</strong></p>



<ul class="wp-block-list">
<li>Stateless microservices, APIs, batch jobs</li>



<li>CI runners/build agents</li>



<li>Standardized packaging for polyglot stacks</li>



<li>Repeatable, immutable deployments</li>
</ul>



<p class="wp-block-paragraph"><strong>Be careful / not ideal</strong></p>



<ul class="wp-block-list">
<li>Stateful systems without a mature storage strategy</li>



<li>Ultra-low-latency workloads where kernel noise matters</li>



<li>Legacy apps that assume mutable hosts and in-place upgrades</li>
</ul>



<h3 class="wp-block-heading">Where this runs in a datacenter</h3>



<ul class="wp-block-list">
<li>Bare metal (best performance, best isolation control)</li>



<li>VMware / private cloud (common, operationally familiar)</li>



<li>Hybrid (on-prem + public cloud)</li>



<li>Air-gapped segments for regulated workloads</li>
</ul>



<h3 class="wp-block-heading">How you make it work</h3>



<p class="wp-block-paragraph">You need an end-to-end method:</p>



<ul class="wp-block-list">
<li><strong>Build discipline</strong> (repeatable, minimal, signed)</li>



<li><strong>Registry discipline</strong> (private, governed, replicated)</li>



<li><strong>Orchestrator discipline</strong> (K8s/OpenShift + policies)</li>



<li><strong>Security discipline</strong> (supply chain + runtime + incident response)</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">2) Core Concepts &amp; Mental Models (How I Teach Senior Engineers)</h2>



<h3 class="wp-block-heading">Mental Model A: “Image Supply Chain = Software Factory”</h3>



<p class="wp-block-paragraph">Think of every image as a manufactured artifact:</p>



<ul class="wp-block-list">
<li><strong>Inputs</strong>: base image + source code + dependencies</li>



<li><strong>Process</strong>: build steps, tests, scanners, SBOM/provenance generation</li>



<li><strong>Outputs</strong>: immutable image + metadata + signatures</li>



<li><strong>Quality gates</strong>: policy checks, vulnerability thresholds, provenance requirements</li>
</ul>



<p class="wp-block-paragraph">Modern Docker-native tooling increasingly bakes this in (SBOM + policies). For example, <strong>Docker Scout Policy Evaluation</strong> adds explicit rules for artifact quality and supply-chain requirements. ()</p>



<h3 class="wp-block-heading">Mental Model B: “Orchestration is about intent, not containers”</h3>



<p class="wp-block-paragraph">In enterprise, we don’t “run containers”—we run <strong>desired state</strong>:</p>



<ul class="wp-block-list">
<li>replicas, rollout strategy, health checks</li>



<li>resource guarantees/limits</li>



<li>network identity and access</li>



<li>secrets and config injection</li>



<li>policy enforcement</li>
</ul>



<p class="wp-block-paragraph">Docker helps you package. <strong>Orchestrators</strong> help you operate.</p>



<h3 class="wp-block-heading">Mental Model C: “Security has layers—if one layer fails, another catches it”</h3>



<p class="wp-block-paragraph">Container security is never a single tool. I always split it into:</p>



<ol class="wp-block-list">
<li><strong>Build-time security</strong> (SBOM, scanning, provenance, signing)</li>



<li><strong>Registry security</strong> (admission rules, immutability, replication)</li>



<li><strong>Deploy-time security</strong> (admission controls, pod standards)</li>



<li><strong>Runtime security</strong> (behavior detection, syscall policies, eBPF)</li>



<li><strong>Host &amp; network security</strong> (kernel hardening, segmentation)</li>
</ol>



<p class="wp-block-paragraph">NIST’s container security guidance still frames the risk areas well (image, registry, orchestrator, host, runtime). ()</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">3) Orchestration Choices in Enterprise (Decision Matrix I Actually Use)</h2>



<h3 class="wp-block-heading">The short version</h3>



<ul class="wp-block-list">
<li><strong>Compose</strong>: single-host, dev/test, small internal tooling</li>



<li><strong>Swarm</strong>: simple clustering, smaller ops teams, but fewer enterprise patterns</li>



<li><strong>Kubernetes</strong>: default for serious enterprise orchestration</li>



<li><strong>OpenShift</strong>: enterprise Kubernetes with strong governance &amp; platform features</li>



<li><strong>Nomad</strong>: viable in some orgs (Hashi ecosystem), fewer K8s-native tools</li>
</ul>



<p class="wp-block-paragraph">Docker still documents <strong>Swarm mode</strong> as a clustering/orchestration option. </p>



<h3 class="wp-block-heading">Decision matrix</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Option</th><th>Where I use it</th><th>Strengths</th><th>Weaknesses / hidden costs</th></tr></thead><tbody><tr><td>Docker Compose</td><td>Single-node apps, dev, PoCs</td><td>Simple, fast</td><td>Not a platform; no multi-node HA</td></tr><tr><td>Docker Swarm</td><td>Small/medium internal platforms</td><td>Easy to operate vs K8s</td><td>Smaller ecosystem; fewer policy/security primitives</td></tr><tr><td>Kubernetes</td><td>Most enterprise platforms</td><td>Best ecosystem, policy, observability</td><td>Steeper learning curve; platform engineering required</td></tr><tr><td>OpenShift</td><td>Regulated/large enterprise</td><td>Built-in governance + enterprise workflows</td><td>Cost + platform complexity</td></tr><tr><td>Nomad</td><td>Mixed workloads, Hashi shops</td><td>Simpler than K8s for some</td><td>Smaller cloud-native ecosystem</td></tr></tbody></table></figure>



<p class="wp-block-paragraph"><strong>My rule:</strong> if you expect multi-team scale, multi-tenancy, strong policy enforcement, or regulated controls, you almost always land on <strong>Kubernetes/OpenShift</strong>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">4) Security: What I Enforce (and Why)</h2>



<h3 class="wp-block-heading">4.1 Build-time: reduce risk before runtime</h3>



<p class="wp-block-paragraph">What I enforce as “non-negotiable” gates:</p>



<ul class="wp-block-list">
<li><strong>Pin base images by digest</strong> (not mutable tags like <code>latest</code>)</li>



<li><strong>Generate SBOM</strong> for every build</li>



<li><strong>Sign images</strong> (keyless or key-based)</li>



<li><strong>Attach provenance/attestations</strong> (SLSA-style)</li>



<li><strong>Fail builds</strong> on critical issues (policy-driven)</li>
</ul>



<p class="wp-block-paragraph">Docker is pushing hard on hardened bases and supply-chain metadata. Their <strong>Docker Hardened Images</strong> emphasize reduced vulnerabilities plus SBOMs and provenance signals. ()</p>



<p class="wp-block-paragraph">For image signing, I use Sigstore <strong>cosign</strong> in many pipelines because it’s practical and widely supported. ()</p>



<h3 class="wp-block-heading">4.2 Deploy-time: stop bad workloads from entering the cluster</h3>



<p class="wp-block-paragraph">In Kubernetes, I align workloads to <strong>Pod Security Standards</strong> (Privileged / Baseline / Restricted) and enforce with admission. ()</p>



<p class="wp-block-paragraph"><strong>What I’ve learned the hard way:</strong><br>If you don’t enforce at admission time, you’ll end up trying to “hunt and fix” risky workloads later—painful, political, and slow.</p>



<h3 class="wp-block-heading">4.3 Runtime: detect what slipped through</h3>



<p class="wp-block-paragraph">Even with strong build gates, you need runtime coverage:</p>



<ul class="wp-block-list">
<li>syscall monitoring (Falco / eBPF-based tools)</li>



<li>container escapes and suspicious child processes</li>



<li>unexpected network egress</li>



<li>crypto-mining behaviors</li>



<li>privilege escalation patterns</li>
</ul>



<h3 class="wp-block-heading">4.4 Desktop/Dev environment security matters too</h3>



<p class="wp-block-paragraph">Enterprises often forget dev endpoints are part of the attack surface. Docker provides <strong>Enhanced Container Isolation</strong> for Docker Desktop to harden isolation on developer machines. ()</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">5) Reference Architecture (Enterprise Datacenter)</h2>



<p class="wp-block-paragraph">Here’s the reference architecture I use (conceptually) for most enterprises:</p>


<pre class="wp-block-code"><span><code class="hljs language-xml">Dev Workstations
  - Docker Desktop / Docker Engine
  - Local policies + ECI (where applicable)

        | (git push / PR)
        v

CI System (Jenkins/GitLab/GitHub Actions)
  - BuildKit/buildx
  - Unit/integration tests
  - SBOM generation
  - Vulnerability scan
  - Policy evaluation
  - Sign + attest

        | (push OCI image + metadata)
        v

Enterprise Registry (Harbor/Artifactory/ECR/ACR)
  - Immutable tags / retention
  - Replication (DC1 <span class="hljs-tag">&lt;<span class="hljs-name">-</span>&gt;</span> DC2)
  - Access control (RBAC)
  - Admission policies (only signed images)

        | (pull)
        v

Orchestrator (Kubernetes / OpenShift)
  - containerd/CRI-O runtime
  - Admission (PSS + OPA/Kyverno)
  - Network policies (CNI like Cilium/Calico)
  - Secrets (Vault / external secrets)
  - Observability (Prometheus + logs + traces)

        | (telemetry)
        v

Security + Operations
  - SIEM/SOAR integration
  - Runtime detection
  - Incident response playbooks
  - SLOs + DORA + cost KPIs
</code></span></pre>


<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">6) End-to-End Methodology (Phases, Gates, Decision Points)</h2>



<h3 class="wp-block-heading">Phase 0 — Platform decision gate (don’t skip this)</h3>



<p class="wp-block-paragraph"><strong>Decisions I force early:</strong></p>



<ul class="wp-block-list">
<li>Orchestrator: K8s vs OpenShift vs Swarm</li>



<li>Tenant model: single-tenant vs multi-tenant clusters</li>



<li>Registry: on-prem vs managed vs hybrid replication</li>



<li>Compliance: air-gap requirements? audit trails? retention?</li>
</ul>



<p class="wp-block-paragraph"><strong>Gate:</strong> You don’t start migrating apps until you can answer:<br>“How do I patch base images and roll changes fleet-wide in &lt;30 days?”</p>



<h3 class="wp-block-heading">Phase 1 — Build standardization</h3>



<ul class="wp-block-list">
<li>Standard Dockerfile patterns</li>



<li>Base image policy (approved bases only)</li>



<li>Tagging standard: <code>app:semver</code>, <code>app:gitsha</code>, plus digests</li>



<li>Multi-arch builds if needed</li>
</ul>



<p class="wp-block-paragraph"><strong>Gate:</strong> every image must be reproducible and traceable to a commit.</p>



<h3 class="wp-block-heading">Phase 2 — Supply-chain security pipeline</h3>



<ul class="wp-block-list">
<li>SBOM generation and storage</li>



<li>Vulnerability scanning</li>



<li>Policy evaluation (fail builds on policy)</li>



<li>Signing + provenance</li>
</ul>



<p class="wp-block-paragraph">This is where tooling like <strong>Docker Scout policy evaluation</strong> can fit if your org is Docker-centric. ()</p>



<p class="wp-block-paragraph"><strong>Gate:</strong> cluster only pulls images that pass policy + are signed.</p>



<h3 class="wp-block-heading">Phase 3 — Registry hardening</h3>



<ul class="wp-block-list">
<li>Private registry + RBAC</li>



<li>Immutable tags for releases</li>



<li>Replication across datacenters</li>



<li>Garbage collection + retention (avoid registry turning into a trash heap)</li>
</ul>



<p class="wp-block-paragraph"><strong>Gate:</strong> image availability survives a datacenter outage (DR tested).</p>



<h3 class="wp-block-heading">Phase 4 — Orchestrator foundation</h3>



<ul class="wp-block-list">
<li>Cluster lifecycle management</li>



<li>Ingress/LB patterns</li>



<li>Storage classes &amp; backup</li>



<li>Node hardening + runtime choice (containerd/CRI-O)</li>
</ul>



<p class="wp-block-paragraph"><strong>Gate:</strong> you can do a safe canary rollout + rollback under load.</p>



<h3 class="wp-block-heading">Phase 5 — Workload onboarding</h3>



<p class="wp-block-paragraph">Start with:</p>



<ul class="wp-block-list">
<li>stateless, low-risk services</li>



<li>clear health checks</li>



<li>clear resource envelopes (requests/limits)</li>
</ul>



<p class="wp-block-paragraph">Then move to:</p>



<ul class="wp-block-list">
<li>stateful workloads with well-tested storage and backup</li>
</ul>



<p class="wp-block-paragraph"><strong>Gate:</strong> app teams must meet operational SLO definitions before production cutover.</p>



<h3 class="wp-block-heading">Phase 6 — Operations + incident response</h3>



<ul class="wp-block-list">
<li>golden signals + SLOs</li>



<li>runtime security playbooks</li>



<li>CVE patch SLAs</li>



<li>disaster recovery exercises</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">7) Best Practices vs Anti-Patterns (Stuff I’ve Seen Blow Up)</h2>



<h3 class="wp-block-heading">Best practices I insist on</h3>



<ul class="wp-block-list">
<li><strong>Rootless where possible</strong> (or at least non-root containers)</li>



<li><strong>Distroless/minimal images</strong> for runtime</li>



<li><strong>Multi-stage builds</strong> (builder image ≠ runtime image)</li>



<li><strong>No shell in production images</strong> unless justified</li>



<li><strong>Read-only root filesystem</strong> where feasible</li>



<li><strong>Explicit egress controls</strong> (deny-by-default in regulated zones)</li>



<li><strong>Admission control</strong> is mandatory for enterprise scale (PSS + policy-as-code)</li>
</ul>



<h3 class="wp-block-heading">Anti-patterns I block in reviews</h3>



<ul class="wp-block-list">
<li><code>latest</code> tags in production</li>



<li>Mounting <code>/var/run/docker.sock</code> into containers (instant privilege escalations)</li>



<li>Running privileged containers “because it’s easier”</li>



<li>Baking secrets into images</li>



<li>Treating the registry like a dumping ground (no retention/GC)</li>



<li>“Scan once, deploy forever” (no rebuild cadence)</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">8) Tooling Map (What to Use, and When)</h2>



<h3 class="wp-block-heading">Build &amp; packaging</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Need</th><th>Tools I pick</th><th>Notes</th></tr></thead><tbody><tr><td>Fast, modern Docker builds</td><td>BuildKit / buildx</td><td>Default choice in most Docker-based shops</td></tr><tr><td>Rootless builds in CI</td><td>buildah / kaniko</td><td>Useful in restricted CI environments</td></tr><tr><td>Multi-arch builds</td><td>buildx</td><td>Standard approach for AMD64/ARM64</td></tr></tbody></table></figure>



<h3 class="wp-block-heading">Registry</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Need</th><th>Tools</th></tr></thead><tbody><tr><td>On-prem governed registry</td><td>Harbor</td></tr><tr><td>Artifact + repo ecosystem</td><td>JFrog Artifactory / Sonatype Nexus</td></tr><tr><td>Cloud-native</td><td>ECR / ACR / GCR</td></tr></tbody></table></figure>



<h3 class="wp-block-heading">Scanning &amp; SBOM</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Need</th><th>Tools</th></tr></thead><tbody><tr><td>Quick vuln scanning</td><td>Trivy / Grype</td></tr><tr><td>SBOM generation</td><td>Syft / CycloneDX tools</td></tr><tr><td>Policy-driven posture</td><td>Docker Scout policies, OPA-based checks</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">(Docker Scout has explicit policy evaluation support you can build gates around. ())</p>



<h3 class="wp-block-heading">Signing &amp; provenance</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Need</th><th>Tools</th></tr></thead><tbody><tr><td>Keyless signing</td><td>cosign (Sigstore) ()</td></tr><tr><td>Attestations/provenance</td><td>cosign attest / SLSA-aligned provenance</td></tr><tr><td>Enterprise trust distribution</td><td>integrate with registry + admission policies</td></tr></tbody></table></figure>



<h3 class="wp-block-heading">Kubernetes policy &amp; governance</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Need</th><th>Tools</th></tr></thead><tbody><tr><td>Enforce Pod Security Standards</td><td>Pod Security Admission ()</td></tr><tr><td>Policy as code</td><td>OPA Gatekeeper / Kyverno</td></tr><tr><td>Compliance checks</td><td>kube-bench, CIS benchmarks ()</td></tr></tbody></table></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">9) Real-world Use Cases (Small → Enterprise; Regulated vs Non)</h2>



<h3 class="wp-block-heading">Small (1–10 services)</h3>



<ul class="wp-block-list">
<li>Docker Compose or a small K8s distro</li>



<li>Simple private registry</li>



<li>Basic scanning + rebuild cadence<br><strong>Main risk:</strong> no discipline → images drift, secrets leak, patching never happens.</li>
</ul>



<h3 class="wp-block-heading">Medium (10–100 services)</h3>



<ul class="wp-block-list">
<li>Kubernetes with a strong platform baseline</li>



<li>Central CI templates for Docker builds</li>



<li>Standard observability stack<br><strong>Main risk:</strong> platform becomes “DIY PaaS” with no ownership model.</li>
</ul>



<h3 class="wp-block-heading">Enterprise (100+ services, many teams)</h3>



<ul class="wp-block-list">
<li>Kubernetes/OpenShift with multi-tenancy controls</li>



<li>Strong admission control</li>



<li>Artifact governance + signing required</li>



<li>Runtime detection integrated into SOC/SIEM<br><strong>Main risk:</strong> governance fights (“security slows us down”) unless you automate gates and provide paved roads.</li>
</ul>



<h3 class="wp-block-heading">Regulated environments (finance/health/gov)</h3>



<p class="wp-block-paragraph">What changes:</p>



<ul class="wp-block-list">
<li>Air-gapped or controlled connectivity</li>



<li>Private registry replication + strict retention/audit</li>



<li>Mandatory SBOM + provenance + signing</li>



<li>Strong egress restrictions + audit logging</li>



<li>Formal exception process (time-boxed)</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">10) Pros, Cons, Hidden Costs, Failure Modes</h2>



<h3 class="wp-block-heading">Pros</h3>



<ul class="wp-block-list">
<li>Faster deploy cycles with immutable artifacts</li>



<li>Better reproducibility than “golden VM images”</li>



<li>Strong foundation for DevSecOps automation</li>
</ul>



<h3 class="wp-block-heading">Cons / hidden costs</h3>



<ul class="wp-block-list">
<li><strong>Image sprawl</strong> (storage and retention pain)</li>



<li><strong>Patch pressure</strong>: you must rebuild often</li>



<li><strong>Policy complexity</strong>: misconfigured admission breaks deployments</li>



<li><strong>Skills cost</strong>: platform engineering is real engineering</li>



<li><strong>Observability noise</strong>: you need good signal design</li>
</ul>



<h3 class="wp-block-heading">Failure modes I see repeatedly</h3>



<ul class="wp-block-list">
<li>Registry outage blocks deploys (no replication, no caching strategy)</li>



<li>Base image CVE storms (no rebuild cadence)</li>



<li>Over-permissive policies (easy now, breach later)</li>



<li>Over-restrictive policies (breaks prod, teams bypass controls)</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">11) Checklists (My go/no-go lists)</h2>



<h3 class="wp-block-heading">Pre-implementation checklist</h3>



<ul class="wp-block-list">
<li>Orchestrator decision finalized (K8s/OpenShift/other)</li>



<li>Registry selected + replication plan defined</li>



<li>Base image policy defined (allowed images, pinned digests)</li>



<li>CI templates agreed (build, scan, SBOM, sign)</li>



<li>Incident ownership model agreed (who is on-call for platform?)</li>
</ul>



<h3 class="wp-block-heading">Implementation checklist</h3>



<ul class="wp-block-list">
<li>SBOM generated and stored per build</li>



<li>Vulnerability scanning enforced with thresholds</li>



<li>Signing + provenance in place</li>



<li>Admission policies active (PSS + org policies)</li>



<li>Namespace tenancy model implemented</li>



<li>Network policies baseline applied</li>



<li>Secrets management integrated (no plaintext secrets in manifests)</li>
</ul>



<h3 class="wp-block-heading">Rollout checklist</h3>



<ul class="wp-block-list">
<li>Canary strategy proven under load</li>



<li>Rollback tested and timed</li>



<li>Runbooks written (deploy, rollback, incident triage)</li>



<li>DR test: registry + cluster restore</li>



<li>Exception process defined (time-boxed)</li>
</ul>



<h3 class="wp-block-heading">Operations checklist</h3>



<ul class="wp-block-list">
<li>CVE patch SLA defined (e.g., critical within X days)</li>



<li>Image rebuild cadence implemented</li>



<li>Policy drift monitoring (who changed what?)</li>



<li>DORA metrics tracked per team/service</li>



<li>Runtime alerts wired into SOC/on-call</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">12) Metrics &amp; Success Criteria (KPIs I Track)</h2>



<h3 class="wp-block-heading">Delivery (DORA)</h3>



<ul class="wp-block-list">
<li>Deployment frequency</li>



<li>Lead time for changes</li>



<li>Change failure rate</li>



<li>MTTR</li>
</ul>



<h3 class="wp-block-heading">Reliability/SLOs</h3>



<ul class="wp-block-list">
<li>Availability SLO per service</li>



<li>Error rate + latency (p95/p99)</li>



<li>Saturation (CPU/mem throttling, disk IO, network)</li>
</ul>



<h3 class="wp-block-heading">Security</h3>



<ul class="wp-block-list">
<li>Mean time to remediate critical CVEs in base images</li>



<li>% of workloads running as non-root</li>



<li>% images signed + with provenance</li>



<li>Admission denials trend (are teams fighting policies?)</li>
</ul>



<h3 class="wp-block-heading">ROI indicators</h3>



<ul class="wp-block-list">
<li>Reduced outage hours from configuration drift</li>



<li>Reduced mean deploy time</li>



<li>Fewer “hotfix-in-prod” events</li>



<li>Lower audit effort due to automated evidence (SBOM/provenance)</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">13) Common Challenges + Fix Patterns (How I Troubleshoot)</h2>



<h3 class="wp-block-heading">“Works locally, fails in cluster”</h3>



<p class="wp-block-paragraph"><strong>Patterns I check:</strong></p>



<ul class="wp-block-list">
<li>missing env vars/config maps</li>



<li>filesystem assumptions (read-only rootfs)</li>



<li>wrong CPU arch (multi-arch build issue)</li>



<li>DNS/service discovery differences</li>
</ul>



<h3 class="wp-block-heading">Container crash loops</h3>



<p class="wp-block-paragraph">I look for:</p>



<ul class="wp-block-list">
<li>bad health checks (too strict, too soon)</li>



<li>OOMKilled → fix requests/limits + memory leaks</li>



<li>dependency readiness (DB not ready; add init containers or backoff)</li>
</ul>



<h3 class="wp-block-heading">Registry pain</h3>



<ul class="wp-block-list">
<li>Pull throttling / slow pulls → add caching proxies, tune concurrency</li>



<li>Tag chaos → enforce immutability for release tags, promote via digest</li>
</ul>



<h3 class="wp-block-heading">Security policies blocking teams</h3>



<ul class="wp-block-list">
<li>Start with <strong>baseline</strong>, then ratchet to <strong>restricted</strong></li>



<li>Provide “paved road” templates so teams don’t write YAML from scratch<br>Pod Security Standards give you clear policy levels to graduate through. ()</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">14) Future Trends (Next 12–24 Months, and AI Impact)</h2>



<p class="wp-block-paragraph">Here’s what I expect to matter most soon:</p>



<ol class="wp-block-list">
<li><strong>Stronger supply-chain enforcement becomes normal</strong><br>SBOM + provenance + signing won’t be “nice to have”; it’ll be procurement and audit baseline. Docker’s push toward hardened images and policy-driven evaluation is aligned with this direction. ()</li>



<li><strong>“Hardened by default” base images grow</strong><br>More teams adopt curated minimal bases to cut CVE noise and reduce attack surface. ()</li>



<li><strong>Runtime isolation options expand</strong><br>gVisor/Kata/Confidential Containers will be used more for multi-tenant and regulated workloads (especially where “container escape” risk is unacceptable).</li>



<li><strong>Policy-as-code becomes productized</strong><br>Instead of tribal knowledge, orgs codify deployment rules and compliance evidence.</li>



<li><strong>AI/AIOps helps with triage, not with responsibility</strong><br>AI will accelerate: log summarization, anomaly detection, “why did rollout fail?” clustering, and CVE prioritization. But <strong>ownership still matters</strong>—AI doesn’t fix broken SLOs or messy governance.</li>
</ol>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">A final practitioner note (how I keep this from becoming bureaucracy)</h2>



<p class="wp-block-paragraph">If you want this to succeed enterprise-wide: <strong>make the secure path the easiest path</strong>.</p>



<ul class="wp-block-list">
<li>Provide build templates</li>



<li>Provide approved base images</li>



<li>Provide golden Helm charts/manifests</li>



<li>Automate evidence collection</li>



<li>Keep exceptions rare, time-boxed, and visible</li>
</ul>



<p class="wp-block-paragraph">If you want, I can also provide:</p>



<ul class="wp-block-list">
<li>a <strong>sample enterprise policy set</strong> (build gates + admission rules) in human-readable form, and</li>



<li>a <strong>rollout plan</strong> tailored to your environment (VMware/on-prem, air-gapped, regulated, etc.).</li>
</ul>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bestdevops.com/docker-datacenter-adds-enterprise-orchestration-security-policy-and-refreshed-ui/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>How to Avoid a Kubernetes Food Fight: Governance Strategies for Enterprise IT</title>
		<link>https://www.bestdevops.com/how-to-avoid-a-kubernetes-food-fight/</link>
					<comments>https://www.bestdevops.com/how-to-avoid-a-kubernetes-food-fight/#respond</comments>
		
		<dc:creator><![CDATA[anil]]></dc:creator>
		<pubDate>Sat, 01 Aug 2020 05:26:46 +0000</pubDate>
				<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[Azure]]></category>
		<category><![CDATA[Datacenter]]></category>
		<category><![CDATA[DevOps]]></category>
		<category><![CDATA[OPENSHIFT]]></category>
		<category><![CDATA[Software-Market]]></category>
		<guid isPermaLink="false">http://www.bestdevops.com/?p=13081</guid>

					<description><![CDATA[Uncontrolled Kubernetes adoption is the new shadow IT. Learn why enterprise Kubernetes sprawl creates security, cost, and consistency problems—and how to build a control plane to manage it.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">When developers discovered public cloud services years ago, CIOs faced a governance crisis known as shadow IT. Resources were spun up without central oversight, security gaps multiplied, and costs ballooned. Today, Kubernetes is triggering the same pattern—and for the same fundamental reason: it is free and open source, so anyone can install it anywhere, at any time, without asking IT.</p>



<h2 class="wp-block-heading">Why Kubernetes Sprawl Happens</h2>



<p class="wp-block-paragraph">Kubernetes is the dominant open source container orchestration platform. It lets teams package workloads into containers, schedule them across nodes, and manage their lifecycle at scale. Because the software carries no licensing cost, individual teams and business units install it independently—on AWS, on Azure, on on-premises hardware, or on bare metal—often without informing central IT. The result is an uncoordinated proliferation of clusters, configurations, and tooling choices across the enterprise.</p>



<h2 class="wp-block-heading">Three Core Problems Created by Uncontrolled Kubernetes</h2>



<h3 class="wp-block-heading">1. Security Vulnerabilities from Configuration Errors</h3>



<p class="wp-block-paragraph">Misconfiguration is consistently cited as a leading security risk in Kubernetes environments. When clusters proliferate without central oversight, each team applies its own (often incomplete) security settings. Role-based access control (RBAC) policies, network policies, pod security standards, and secrets management are all configured differently—or skipped entirely. The more uncontrolled instances you have, the higher the probability that at least one will be seriously misconfigured.</p>



<h3 class="wp-block-heading">2. Hidden and Escalating Costs</h3>



<p class="wp-block-paragraph">The Kubernetes software itself is free, but the infrastructure it runs on is not. Cloud-hosted clusters incur compute, storage, and networking charges from the cloud provider. On-premises clusters require hardware, power, and operations staff. Without central visibility, these costs accumulate in silos, making it nearly impossible to optimize or even accurately report total Kubernetes spending across the organization.</p>



<h3 class="wp-block-heading">3. Inconsistency Across Teams and Platforms</h3>



<p class="wp-block-paragraph">Kubernetes is intentionally flexible about the tooling stacked on top of it—networking plugins (CNI), storage drivers (CSI), operators, service meshes, and monitoring agents are all choices left to the operator. In practice, different teams pick different vendors. One group uses one CNI plugin; another uses a competing storage driver. Applications can develop implicit dependencies on these vendor-specific behaviors, making it risky to change or standardize later. The operational outcome is an enterprise-wide patchwork of incompatible stacks that no single team fully understands.</p>



<h2 class="wp-block-heading">Accept Four Realities Before Trying to Regain Control</h2>



<p class="wp-block-paragraph">Regaining control does not mean preventing teams from using Kubernetes. It means creating visibility and governance while still giving teams the flexibility they need. Before any governance initiative can succeed, leadership must honestly accept the following realities:</p>



<ul class="wp-block-list">
<li><strong>Reality 1 – You will manage multiple Kubernetes versions.</strong> Different teams will legitimately need different versions of Kubernetes running concurrently. Forcing a single version on everyone is impractical and likely to slow delivery.</li>
<li><strong>Reality 2 – You will manage Kubernetes across multiple platforms.</strong> Some groups will run workloads in public cloud environments (AWS, Azure, GCP); others will run them in private datacenters. A governance model that only covers one platform will fail.</li>
<li><strong>Reality 3 – Versions must be upgradeable independently.</strong> Upgrading all clusters in lockstep is rarely feasible. Each cluster or group of clusters must be upgradeable on its own schedule without disrupting others.</li>
<li><strong>Reality 4 – Data access must be consistent despite platform differences.</strong> Even across different versions, platforms, and vendor stacks, applications and users need a consistent, predictable way to access data. Inconsistent data access patterns multiply integration costs and reliability risks.</li>
</ul>



<p class="wp-block-paragraph">Attempting to govern Kubernetes while denying any of these realities wastes time and generates internal conflict. Acknowledge them first, then design governance around them.</p>



<h2 class="wp-block-heading">Building a Kubernetes Control Plane for the Enterprise</h2>



<p class="wp-block-paragraph">In networking, a control plane is responsible for routing decisions and managing the state of the network, separate from the data plane that actually forwards packets. The same concept applies to enterprise Kubernetes governance: you need a management layer that provides visibility and policy enforcement across all clusters, regardless of where or how they run.</p>



<p class="wp-block-paragraph">Building this control plane starts with discovery and structured questioning. You cannot govern what you cannot see. A practical starting checklist includes:</p>



<ul class="wp-block-list">
<li><strong>Cluster inventory:</strong> How many Kubernetes clusters exist across the enterprise, and where are they running?</li>
<li><strong>Identity and access management:</strong> How is IAM enforced consistently across clusters from different vendors and on different platforms?</li>
<li><strong>Namespace and data fabric management:</strong> How is a consistent global namespace maintained for shared data across clusters in different geographies?</li>
<li><strong>Application security:</strong> How are applications secured when they span different Kubernetes versions and infrastructure types?</li>
<li><strong>Observability:</strong> How is logging and monitoring unified across dissimilar platforms and Kubernetes distributions so that operations teams have a single coherent view?</li>
<li><strong>Policy enforcement:</strong> How are network policies, pod security standards, and resource quotas applied uniformly, and who is responsible for auditing them?</li>
<li><strong>Upgrade planning:</strong> What is the process for tracking end-of-life Kubernetes versions and coordinating upgrades without breaking dependent applications?</li>
</ul>



<p class="wp-block-paragraph">This list is a starting point. A structured workshop between central IT and the business units that own clusters will surface additional gaps specific to your organization.</p>



<h2 class="wp-block-heading">Practical Governance Approaches</h2>



<h3 class="wp-block-heading">Standardize on a Kubernetes Distribution Catalog</h3>



<p class="wp-block-paragraph">Rather than banning non-standard distributions, publish an approved catalog of distributions and versions. Teams pick from the catalog; central IT supports what is on it. This limits sprawl without blocking autonomy.</p>



<h3 class="wp-block-heading">Enforce Policy Through GitOps</h3>



<p class="wp-block-paragraph">Tools such as Flux or Argo CD enable policy-as-code, storing cluster configuration in version-controlled repositories. Security policies, RBAC rules, and approved operators can be applied consistently to every cluster through a shared Git repository, making deviations visible and auditable.</p>



<h3 class="wp-block-heading">Use a Multi-Cluster Management Layer</h3>



<p class="wp-block-paragraph">Several platforms—both commercial and open source—provide centralized dashboards and policy engines for fleets of Kubernetes clusters. These tools address the observability gap by aggregating cluster health, workload status, and policy compliance into a single view without requiring all clusters to run identical configurations.</p>



<h3 class="wp-block-heading">Introduce Showback and Chargeback</h3>



<p class="wp-block-paragraph">Visibility into cost by team and cluster creates natural incentives for responsible resource use. Even before a formal chargeback model is in place, a showback report—showing each team what its clusters cost—tends to prompt self-governance.</p>



<h2 class="wp-block-heading">The Goal: Enabling Speed Without Chaos</h2>



<p class="wp-block-paragraph">Shadow IT emerged because central IT was too slow. Kubernetes sprawl is emerging for the same reason. Governance frameworks that are too restrictive will simply push teams further underground. The objective is to make the governed path faster and easier than the ungoverned one: provide approved distributions, pre-configured security baselines, and self-service cluster provisioning through an internal platform. When teams can get a compliant cluster in minutes through official channels, there is little incentive to go rogue.</p>



<p class="wp-block-paragraph">Stopping the Kubernetes food fight is not about authority—it is about providing a better alternative to chaos.</p>



<hr class="wp-block-separator"/>



<p class="wp-block-paragraph"><em>This article is an independent editorial expansion of a post originally sourced from cio.com (published 2020). The original post referenced HPE Ezmeral as a commercial solution; readers should evaluate current multi-cluster management offerings against their specific requirements.</em></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bestdevops.com/how-to-avoid-a-kubernetes-food-fight/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>AWS Revenue Growth Slowdown in India: What It Means for the Cloud Market</title>
		<link>https://www.bestdevops.com/will-aws-slump-in-revenue-affect-its-growth-in-india/</link>
					<comments>https://www.bestdevops.com/will-aws-slump-in-revenue-affect-its-growth-in-india/#respond</comments>
		
		<dc:creator><![CDATA[anil]]></dc:creator>
		<pubDate>Sat, 05 Oct 2019 05:25:59 +0000</pubDate>
				<category><![CDATA[AWS]]></category>
		<category><![CDATA[Datacenter]]></category>
		<category><![CDATA[growth strategy]]></category>
		<category><![CDATA[Microsoft]]></category>
		<guid isPermaLink="false">http://www.bestdevops.com/?p=8380</guid>

					<description><![CDATA[AWS reported slower revenue growth in India for FY2019 despite overall gains. We examine the financial figures, competitive pressures from Google Cloud and Alibaba Cloud, and what the slowdown means for AWS's long-term dominance in the Indian market.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><em>Source: analyticsindiamag.com (original reporting, October 2019)</em></p>



<h2 class="wp-block-heading">AWS in India: Strong Revenue, Slower Growth</h2>



<p class="wp-block-paragraph">India has become one of the most contested battlegrounds in cloud computing, with Amazon Web Services (AWS), Google Cloud, Microsoft Azure, and Alibaba Cloud all aggressively expanding their presence. As of the financial year ending March 2019, AWS and its sister entity Amazon Data Services together recorded combined India revenue of approximately ₹4,131 crore — a significant figure that nonetheless raised concerns because the growth rate had decelerated compared to the previous year.</p>



<p class="wp-block-paragraph">According to financial filings cited by Analytics India Magazine, Amazon Data Services India posted revenue of ₹1,504 crore with a profit of ₹117.9 crore, while AWS India reported revenue of ₹2,627 crore and a profit of ₹71.2 crore for the same period. The previous year had seen close to a threefold jump in combined revenue, making FY2019&#8217;s more modest increase a notable shift in trajectory.</p>



<p class="wp-block-paragraph">Amazon has also invested heavily in Indian infrastructure. Reports at the time indicated the company had committed more than ₹1,300 crore into its data centre operations in India, partly in anticipation of India&#8217;s data localisation requirements.</p>



<h2 class="wp-block-heading">Should AWS Be Worried?</h2>



<p class="wp-block-paragraph">Despite the slower growth rate, AWS retained a commanding position in the Indian cloud market as of late 2019. Launched globally in 2006, AWS had years of head-start over most rivals, and its depth of services — spanning compute, storage, databases, machine learning, and analytics — remained unmatched in breadth.</p>



<p class="wp-block-paragraph">AWS had also made notable inroads into India&#8217;s public sector, supporting initiatives such as Digital India, Skill India, and the Smart Cities Mission. Services like Amazon Textract (document analysis) and Amazon SageMaker (managed machine learning) were being deployed to help government bodies extract value from large datasets. Public sector engagements of this scale provide long-term contract stability and are difficult for newer entrants to displace quickly.</p>



<p class="wp-block-paragraph">Industry analysts at the time believed AWS was on a trajectory toward $1 billion in annual web services revenue from India, suggesting the long-term outlook remained strong even as near-term growth moderated.</p>



<p class="wp-block-paragraph">For context, in FY2018 Amazon&#8217;s cloud business in India had already demonstrated rapid adoption, with revenue from operations rising from ₹397 crore to ₹1,206 crore in a single year — a signal that enterprise and government cloud adoption was accelerating.</p>



<h2 class="wp-block-heading">Competitive Pressures: Google Cloud and Alibaba Cloud</h2>



<p class="wp-block-paragraph">Two developments in particular were cited as factors that may have contributed to a slowdown in AWS&#8217;s growth rate in India:</p>



<h3 class="wp-block-heading">Google Cloud Under Thomas Kurian</h3>



<p class="wp-block-paragraph">The appointment of Thomas Kurian as Google Cloud CEO in late 2018 marked a strategic pivot for the division. Kurian, who came from Oracle, brought an enterprise-focused sales approach that had been widely seen as a weakness for Google Cloud relative to AWS and Azure. Under his leadership, Google Cloud began expanding its portfolio of enterprise services and investing more heavily in its direct sales organisation — a model that resonates well with large Indian enterprises and system integrators.</p>



<p class="wp-block-paragraph">Google also introduced Anthos — a hybrid and multi-cloud management platform built on Kubernetes and Istio — which allowed enterprises to run workloads across on-premises infrastructure and multiple public clouds. For Indian enterprises with significant on-premises investments or data sovereignty concerns, Anthos represented a credible migration path that didn&#8217;t require full commitment to a single cloud vendor.</p>



<h3 class="wp-block-heading">Alibaba Cloud&#8217;s India Expansion</h3>



<p class="wp-block-paragraph">Alibaba Cloud opened its first India data centre in 2018 and subsequently expanded with a second facility, explicitly targeting small and medium-sized businesses (SMBs). This segment had historically been underserved by hyperscalers whose pricing and complexity could be a barrier for smaller organisations. By competing aggressively on price and offering localised support, Alibaba Cloud introduced an additional competitive variable in a segment that AWS had been developing.</p>



<h2 class="wp-block-heading">AWS&#8217;s Broader India Ambitions</h2>



<p class="wp-block-paragraph">Beyond cloud infrastructure, Amazon signalled ambitions to support India&#8217;s space programme. The company stated it was prepared to assist with satellite command and data processing, including high-speed downloading of large datasets, with claimed cost savings of over 80% compared to traditional approaches. While still at an early stage at the time of writing, this pointed to Amazon&#8217;s intent to position AWS as critical infrastructure across multiple sectors of the Indian economy — not just enterprise IT.</p>



<h2 class="wp-block-heading">Key Takeaways for DevOps and Cloud Practitioners</h2>



<ul class="wp-block-list">
<li><strong>Revenue growth deceleration ≠ decline.</strong> AWS India continued to grow revenues in FY2019; the concern was the rate of growth, not a contraction. DevOps teams evaluating long-term cloud vendor relationships should distinguish between these signals.</li>
<li><strong>Multi-cloud is a real force.</strong> The rise of Google Cloud&#8217;s Anthos and Alibaba Cloud&#8217;s SMB push means Indian organisations now have credible alternatives for hybrid and multi-cloud deployments. Vendor lock-in risk is worth evaluating in any cloud architecture decision.</li>
<li><strong>Public sector alignment matters.</strong> AWS&#8217;s deep integration with Indian government initiatives (Digital India, Skill India) provides it with durable revenue streams that are less sensitive to enterprise switching cycles.</li>
<li><strong>Data localisation shapes infrastructure decisions.</strong> India&#8217;s evolving data localisation regulations continue to influence where organisations store and process data, making local data centre presence a key differentiator for all major cloud providers.</li>
</ul>



<p class="wp-block-paragraph">As of late 2019, AWS remained the dominant hyperscaler in India. The revenue growth slowdown reflected a maturing, increasingly competitive market — a natural evolution as Google Cloud, Azure, and Alibaba Cloud all invested heavily in Indian infrastructure and sales capacity. For engineering teams, this competitive environment is broadly positive: it drives down pricing, improves service breadth, and accelerates support for India-specific compliance and sovereignty requirements.</p>



<hr class="wp-block-separator"/>



<p class="wp-block-paragraph"><em>This article is based on reporting originally published by Analytics India Magazine in October 2019. Financial figures are drawn from Indian regulatory filings available at that time and reflect the fiscal year ending March 2019.</em></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bestdevops.com/will-aws-slump-in-revenue-affect-its-growth-in-india/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>4 Reasons You Should Use Kubernetes for Container Orchestration</title>
		<link>https://www.bestdevops.com/4-reasons-you-should-use-kubernetes/</link>
					<comments>https://www.bestdevops.com/4-reasons-you-should-use-kubernetes/#respond</comments>
		
		<dc:creator><![CDATA[anil]]></dc:creator>
		<pubDate>Fri, 24 Feb 2017 08:57:43 +0000</pubDate>
				<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[DevOps]]></category>
		<category><![CDATA[DevOps Tools]]></category>
		<category><![CDATA[Cloud computing]]></category>
		<category><![CDATA[Containers]]></category>
		<category><![CDATA[Datacenter]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[Kubernetes Advantages]]></category>
		<category><![CDATA[Kubernetes Benefits]]></category>
		<category><![CDATA[Why Use Kubernetes]]></category>
		<guid isPermaLink="false">http://www.bestdevops.com/?p=776</guid>

					<description><![CDATA[Containers changed how we build and ship software, but managing hundreds of them across multiple hosts requires more than a container runtime. Here are four compelling reasons Kubernetes has become the go-to orchestration platform for DevOps teams.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Containers have fundamentally changed how modern applications are built and deployed. By packaging services into portable, lightweight units, containers make it straightforward to run workloads consistently across development, test, and production environments. They start quickly, consume fewer resources than virtual machines, and scale efficiently to meet demand spikes.</p>



<p class="wp-block-paragraph">However, container runtimes are designed to manage individual containers, not distributed applications composed of hundreds of containers spread across many hosts. The moment you need scheduling, load balancing, health management, and cross-host networking, a container runtime alone falls short. That gap is exactly where a container orchestration platform like <strong>Kubernetes</strong> earns its place.</p>



<p class="wp-block-paragraph">Kubernetes is an open source system for deploying, scaling, and managing containerized applications. Originally built by Google based on internal experience running production container workloads at massive scale, it uses declarative, infrastructure-agnostic configuration to describe how applications are composed, how they interact, and how they should be managed. The result is a platform that brings development and operations together by design rather than as an afterthought.</p>



<p class="wp-block-paragraph">Below are four concrete reasons DevOps teams should consider adopting Kubernetes.</p>



<h2 class="wp-block-heading">1. An Infrastructure Framework That Avoids Vendor Lock-In</h2>



<p class="wp-block-paragraph">Modern applications routinely need to run across multiple environments: on-premises servers, private virtualized clouds, and public clouds such as AWS or Azure. Historically, applications and their supporting tooling became tightly coupled to the underlying infrastructure, making it expensive and risky to switch deployment models. Teams ended up locked in by cloud-provider-specific orchestration APIs, proprietary networking assumptions, or back-end storage dependencies.</p>



<p class="wp-block-paragraph">Platform-as-a-Service (PaaS) offerings attempted to solve portability but often enforced strict requirements around programming languages and application frameworks, putting them out of reach for many teams.</p>



<p class="wp-block-paragraph">Kubernetes takes a different approach. Its core abstractions — Pods, Services, Deployments, and ConfigMaps, among others — are infrastructure-agnostic. The same manifests that describe an application on a local cluster can, with minimal changes, describe the same application on a managed cloud service or a bare-metal data center. Kubernetes delivers orchestration capabilities without dictating the runtime environment, eliminating infrastructure lock-in without imposing framework restrictions.</p>



<h2 class="wp-block-heading">2. Better Application Management Through Modularity</h2>



<p class="wp-block-paragraph">Containers encourage decomposing applications into smaller, focused components with clear separation of concerns. This modular approach accelerates development because smaller teams can own specific components independently, isolate dependencies, and iterate quickly. However, modularity creates a coordination problem: how do you integrate, network, and manage dozens or hundreds of independent pieces?</p>



<p class="wp-block-paragraph">Kubernetes addresses this through two foundational constructs:</p>



<ul class="wp-block-list">
<li><strong>Pods.</strong> A Pod is typically a tightly coupled group of containers that are scheduled and managed together as a single unit. Containers within a Pod share network namespaces, an IP address, and can share storage volumes. This co-location model allows closely related processes to communicate efficiently without forcing unrelated functionality into a single container image.</li>
<li><strong>Services.</strong> A Service groups a set of Pods that perform the same logical function and exposes them under a stable network endpoint. Services handle discoverability, load balancing, and horizontal scaling automatically, so application components can find and communicate with each other reliably even as individual Pods come and go.</li>
</ul>



<p class="wp-block-paragraph">Together, Pods and Services give teams the primitives they need to build large, modular systems that are easier to reason about and operate than monolithic alternatives.</p>



<h2 class="wp-block-heading">3. Safe, Scalable Software Deployment and Updates</h2>



<p class="wp-block-paragraph">DevOps is fundamentally about accelerating the cycle of building, testing, and releasing software. That goal demands an infrastructure layer that supports controlled, repeatable deployments at scale — something most traditional infrastructure frameworks were never designed to provide.</p>



<p class="wp-block-paragraph">Kubernetes addresses this through <strong>Controllers</strong>, especially the Deployment Controller, which manages the lifecycle of application workloads and enables the following capabilities:</p>



<ul class="wp-block-list">
<li><strong>Scalability.</strong> Deployments can be scaled out across multiple Pods at creation time and rescaled at any point in response to demand.</li>
<li><strong>Visibility.</strong> Status queries surface which deployments are running, progressing, or failing, giving operators clear insight into the system state.</li>
<li><strong>Pause and resume.</strong> A deployment can be paused mid-rollout to investigate issues and resumed when ready, reducing the blast radius of problematic releases.</li>
<li><strong>Version control and rollback.</strong> Kubernetes tracks deployment history, allowing teams to roll back to a previous stable version if a new release proves unstable.</li>
</ul>



<p class="wp-block-paragraph">Beyond the Deployment Controller, Kubernetes supports several advanced deployment patterns critical to modern operations:</p>



<ul class="wp-block-list">
<li><strong>Horizontal Pod Autoscaling.</strong> Kubernetes can automatically adjust the number of running Pods based on observed resource utilization metrics, within operator-defined minimum and maximum bounds.</li>
<li><strong>Rolling updates.</strong> New versions of an application are rolled out incrementally across Pods, with configurable limits on the maximum number of unavailable Pods and the maximum number of surge Pods at any given time. This minimizes downtime and risk.</li>
<li><strong>Canary deployments.</strong> A new version can be introduced to production alongside the existing version, handling a small slice of traffic initially. The new version is scaled up — and the old version scaled down — only after the new release proves stable under real traffic.</li>
</ul>



<p class="wp-block-paragraph">Critically, Kubernetes imposes none of the application restrictions common to PaaS platforms. It does not mandate a specific language runtime, application framework, or architectural pattern. Stateless web services, stateful databases, and batch data-processing jobs can all run on the same cluster. If a workload can run in a container, it is a valid Kubernetes workload.</p>



<h2 class="wp-block-heading">4. A Strong Foundation for Cloud-Native Applications</h2>



<p class="wp-block-paragraph">Kubernetes is not the only container orchestration platform available. Alternatives include Apache Mesos with Marathon, Docker Swarm, AWS Elastic Container Service (ECS), and HashiCorp Nomad. Each has genuine strengths: Docker Swarm integrates tightly with the Docker toolchain; Mesos supports non-containerized workloads; AWS ECS offers a lower barrier to entry for teams already invested in AWS.</p>



<p class="wp-block-paragraph">Kubernetes nevertheless remains the dominant choice for several reasons:</p>



<ul class="wp-block-list">
<li><strong>Architecture.</strong> Kubernetes was designed from the start around declarative configuration and a reconciliation loop, making it resilient and self-healing by default.</li>
<li><strong>Ecosystem.</strong> A large, active open source community has produced a rich ecosystem of tooling, operators, and integrations that extend Kubernetes for virtually every use case.</li>
<li><strong>Cloud portability.</strong> Kubernetes clusters can run on virtually any cloud provider or on-premises environment. Managed services such as Google GKE, AWS EKS, and Azure AKS reduce operational overhead while preserving portability of workloads between them.</li>
<li><strong>Innovation velocity.</strong> Regular releases introduce new capabilities, and the CNCF (Cloud Native Computing Foundation) ecosystem continuously extends what Kubernetes can do — from service meshes to GitOps tooling to observability stacks.</li>
</ul>



<h2 class="wp-block-heading">Why This Matters for DevOps Teams</h2>



<p class="wp-block-paragraph">Before Kubernetes, teams that needed sophisticated deployment automation typically wrote and maintained bespoke scripting to handle scaling, rolling updates, and failure recovery. That scripting was fragile, hard to test, and expensive to maintain. Some organizations dedicated entire teams solely to keeping that glue code running.</p>



<p class="wp-block-paragraph">Kubernetes replaces that bespoke work with a well-tested, community-maintained platform whose behavior is specified declaratively. DevOps engineers can focus on configuring system intent — what the desired state of the application should be — and let Kubernetes continuously reconcile actual state toward that goal. The result is more reliable deployments, faster release cycles, and infrastructure that scales with the organization rather than against it.</p>



<p class="wp-block-paragraph">For teams building cloud-native applications, Kubernetes provides the portable, operationally mature foundation needed to run workloads anywhere without reimplementing the same operational logic for each environment.</p>



<hr class="wp-block-separator"/>



<p class="wp-block-paragraph"><em>Original source reference: infoworld.com (2017). The core technical concepts described here reflect Kubernetes architecture as of the article&#8217;s publication; some implementation details may have evolved in later Kubernetes releases.</em></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bestdevops.com/4-reasons-you-should-use-kubernetes/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Docker Reference Architecture: Docker Datacenter Best Practices and Design Considerations</title>
		<link>https://www.bestdevops.com/docker-reference-architecture-docker-datacenter-best-practices-and-design-considerations/</link>
					<comments>https://www.bestdevops.com/docker-reference-architecture-docker-datacenter-best-practices-and-design-considerations/#respond</comments>
		
		<dc:creator><![CDATA[anil]]></dc:creator>
		<pubDate>Sat, 18 Feb 2017 09:10:51 +0000</pubDate>
				<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[DevOps]]></category>
		<category><![CDATA[DevOps Best Practices]]></category>
		<category><![CDATA[DevOps Tools]]></category>
		<category><![CDATA[Application Containers]]></category>
		<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Automation]]></category>
		<category><![CDATA[Best practices]]></category>
		<category><![CDATA[Datacenter]]></category>
		<category><![CDATA[DDC]]></category>
		<category><![CDATA[Deployment]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Docker]]></category>
		<category><![CDATA[Infrastructure]]></category>
		<guid isPermaLink="false">http://www.bestdevops.com/?p=698</guid>

					<description><![CDATA[Source:- docker.com Introduction Docker Datacenter (DDC) is the enterprise container platform from Docker to be used across the entire software [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Source:- docker.com</p>
<p><strong>Introduction</strong><br />
<a href="http://www.scmgalaxy.com/courses/agenda/virtulization-and-container-tools/docker-training.html">Docker </a>Datacenter (DDC) is the enterprise container platform from Docker to be used across the entire software supply chain. It is a fully-integrated solution for container-based application development, deployment, and management. With integrated end-to-end security, DDC enables application portability by abstracting your infrastructure so that applications can move seamlessly from development to production.</p>
<p><strong>What You Will Learn</strong><br />
This reference architecture describes a standard, production-grade, Docker Datacenter deployment. It also details the components of DDC, how they work, how to automate deployments, how to manage users and teams, how to provide high availability for the platform, and how to manage the infrastructure.</p>
<p>Some environment-specific configuration details are not be provided. For instance, load balancers vary greatly between cloud platforms and on-premises infrastructure platform. For these types of components, general guidelines to environment-specific resources are provided.</p>
<p><strong>Understanding Docker Datacenter Components</strong><br />
From development to production, Docker Datacenter provides a seamless platform for containerized applications both on-premises and on the Cloud. It includes three components:</p>
<ul>
<li>Docker CS Engine, the commercially supported Docker Engine</li>
<li>Docker Trusted Registry (DTR), a resilient and secure image management repository</li>
<li>Universal Control Plane (UCP), the web-based, unified cluster and application management solution</li>
</ul>
<p>Together they provide an integrated solution with the following design goals:</p>
<ul>
<li>Agility — the Docker API is used to interface with the platform so that operational features do not slow down application delivery</li>
<li>Portability — the platform abstracts details of the infrastructure for applications</li>
<li>Control — the environment is secure by default, provides robust access control, and logging of all operations</li>
</ul>
<p>To achieve these goals the platform must be resilient and highly available. This reference architecture demonstrates this robust configuration.</p>
<p><strong>Docker CS Engine</strong><br />
The building block of Docker Datacenter, the <a href="http://www.scmgalaxy.com/courses/agenda/virtulization-and-container-tools/docker-training.html">Docker </a>Commercially Supported Engine (CS Engine) is responsible for container-level operations, interaction with the OS, providing the Docker API, and running the Swarm cluster. The Engine is also the integration point for infrastructure, including the OS resources, networking, and storage.</p>
<p><strong>Universal Control Plane</strong><br />
UCP extends CS Engine by providing an integrated application management platform. It is both the main interaction point for users and the integration point for applications. UCP runs an agent on all nodes in the cluster to monitor them and a set of services on the controller nodes. This includes identity services to manage users, Certificate Authorities (CA) for user and cluster PKI, the main controller providing the Web UI and API, data stores for UCP state, and a Classic Swarm service for backward compatibility.</p>
<p><strong>Docker Trusted Registry</strong><br />
The DTR is an application managed by, and integrated with UCP, that provides Docker images distribution and security services. The DTR uses UCP&#8217;s identity services to provide Single Sign-On (SSO), and establish a mutual trust to integrate with its PKI. It runs as a set of services on one or several replicas: the registry to store and distribute images, an image signing service, a Web UI, an API, and data stores for image metadata and DTR state.</p>
<p><strong>Swarm Mode</strong><br />
To provide a seamless cluster based on a number of nodes, DDC relies on CS Engine&#8217;s Swarm-mode capability. Swarm-mode divides nodes between workers, nodes running application workloads defined as services, and managers, nodes in charge of maintaining desired state, managing the cluster&#8217;s internal PKI, and providing an API. Managers can also run workloads, in a DDC environment they run UCP controllers, and shouldn&#8217;t run anything else.</p>
<p>The Swarm-mode service model provides a declarative desired state for workloads, scalable to a number of tasks (the service&#8217;s containers), accessible through a stable resolvable name, and optionally exposing an end-point. Exposed services are accessible from any node on a cluster-wide reserved port, reaching tasks through the routing mesh, a fast routing layer using high-performance switching in the Linux Kernel. This set of features enable internal and external discoverability for services, UCP&#8217;s HTTP Routing Mesh (HRM) adding hostname-to-service mapping.</p>
<p><strong>A Standard Deployment Architecture</strong><br />
This section demonstrates a standard, production-level architecture for Docker Datacenter using 10 nodes: 3 UCP controllers, 3 nodes for the DTR, and 4 worker nodes for application workloads. The number of worker nodes is arbitrary, most environments will have more depending on applications needs, it doesn&#8217;t change the architecture or the cluster configuration.</p>
<p>Access to the environment is done through 3 Load Balancers (or 3 load balancer virtual hosts) with corresponding DNS entries for the UCP controllers, the DTR replicas, and the applications running in the cluster.</p>
<p>The DTR replicas use shared storage for images. S3-compatible object storage (the default) and NFS storage are both covered in this section</p>
<p><img fetchpriority="high" decoding="async" class="alignnone  wp-image-699" src="http://www.bestdevops.com/wp-content/uploads/2017/02/docker-api-ucp-300x151.png" alt="" width="483" height="243" srcset="https://www.bestdevops.com/wp-content/uploads/2017/02/docker-api-ucp-300x151.png 300w, https://www.bestdevops.com/wp-content/uploads/2017/02/docker-api-ucp-768x388.png 768w, https://www.bestdevops.com/wp-content/uploads/2017/02/docker-api-ucp-1024x517.png 1024w, https://www.bestdevops.com/wp-content/uploads/2017/02/docker-api-ucp.png 1625w" sizes="(max-width: 483px) 100vw, 483px" /></p>
<p><strong>Node Size</strong><br />
A node is a machine in the cluster (virtual or physical) with Docker Engine running on it. When provisioning each node, assign it a role: UCP Controller, DTR, or worker node so that they are protected from running application workloads.</p>
<p>To decide what size the node should be in terms of CPU, RAM, and storage resources, consider the following:</p>
<ol>
<li>All nodes should at least fulfil the minimal requirements, for UCP 2.0 2GB of RAM and 3GB of storage. More detailed requirements are in the UCP documentation.</li>
<li>UCP Controller nodes should be provided with more than the minimal requirements, but won&#8217;t need much more if nothing else runs on them.</li>
<li>Ideal Worker nodes size will vary based on your workloads, it is impossible to define a universal standard size.</li>
<li>Other considerations like target density (average number of container per node), wether one standard node type or several are preferred, and other operational considerations might also influence sizing.</li>
</ol>
<p>If possible, node size should be determined by experimentation and testing actual workloads, and they should be refined iteratively. A good starting point is to select a standard or default machine type in your environment and use this size only. If your standard machine type provides more resources than the UCP Controllers need, it makes sense to have a smaller node size for these. Whatever the starting choice, it&#8217;s important to monitoring resource usage and cost to improve the model.</p>
<p>Two example scenarios:</p>
<ul>
<li>One standard node size: 2VCPU, 8GB RAM, 20GB storage</li>
<li>Two node sizes: 2VCPU, 8GB RAM, 20GB storage for UCP Controllers and 4VCPU, 64GB RAM, 40GB storage for worker nodes</li>
</ul>
<p>Depending on your OS of choice, storage configuration for Docker Engine might require some planning. Refer to the Support Matrix to see what storage drivers are supported for your host OS. This is especially important if you are using RHEL or CentOS, which use device mapper with direct-lvm.</p>
<p class="editable"><strong>Load Balancers</strong></p>
<p>Load balancers configuration should be done before installation, including the creation of DNS entries. Most load balancers should work with DDC. The only requirements are TCP passthrough and the ability to do healthchecks on an HTTPS endpoint.</p>
<p>In our example architecture, UCP controllers ensure UCP resiliency in case of node failure or controller reconfiguration. Access to UCP through the GUI or API is always done using TLS. The load balancer is configured for simple TCP pass-through on port 443, using a custom HTTPS health check at <code>https://&lt;ucp_controller&gt;/_ping</code>.</p>
<p>Be sure to create a DNS entry for the UCP host such as <code>ucp.example.com</code> and point to the load balancer.</p>
<p>The setup for the three DTR replicas is similar to setting up the UCP controllers. Again, use TCP pass-through to port 443 on the nodes, except the health check is at <code>https://&lt;dtr_replica_node&gt;/health</code>.</p>
<p>Create a DNS entry for the DTR host such as <code>dtr.example.com</code> and point it to the load balancer. It&#8217;s important to keep it as concise as possible because it will be part of the full name of images. For example, <code>user_a</code>&#8216;s <code>webserver</code> image will be named <code>dtr.example.com/user_a/webserver</code>.</p>
<p>The application load balancer provides access to services HTTP endpoints exposed through UCP&#8217;s HTTP Routing Mesh (HRM). HRM provides a reverse-proxy to map domain names to services that expose ports and are attached to the <code>ucp-hrm</code> overlay network. As an example, the <code>voting</code> application exposes the <code>vote</code> service&#8217;s port <code>80</code>. The HRM maps <code>http://vote.apps.example.com</code> to this port on the <code>ucp-hrm</code> overlay network, and the application LB itself maps <code>*.apps.example.com</code> to nodes in the cluster.</p>
<p><strong>DTR Storage</strong><br />
The DTR usually needs to store a large number of images. It uses external storage (S3, NFS, etc.), not node storage so that it can be shared between DTR replicas. The DTR replicates metadata and configuration information between replicas, but not image layers themselves. To determine storage size, start with the size of the existing images used in the environment and evolve from there.</p>
<p>It&#8217;s best to use an existing storage solution in your environment so that image storage can benefit from existing operations experience. If you have to chose a new solution, consider using S3-compatible object storage, which maps more closely to registry operations.</p>
<p><strong>Recommendations for the Docker Datacenter Installation</strong><br />
This section will detail the installation process for the architecture and provide a checklist. It is not a substitute for the documentation, which provides more details and is authoritative in any case. The goal is to help you define a repeatable (and ideally automated) process to deploy, configure, upgrade and expand your DDC environment.</p>
<p>The three main stages of a DDC installation are:</p>
<ol>
<li>Deploying and configuring the infrastructure (hosts, network, storage).</li>
<li>Installing and configuring the Docker Engine, running as an application on the hosts.</li>
<li>Installing and configuring UCP and the DTR, delivered as containers running on the engine.</li>
</ol>
<p><strong>Infrastructure Considerations</strong><br />
The installation documentation details infrastructure requirements for DDC. It is recommended to use existing or platform specific tools in your environment to provide standardized and repeatable configuration for infrastructure components.</p>
<div id="section_12" class="mt-page-section">
<div id="section_13" class="mt-page-section">
<div id="section_15" class="mt-page-section">
<h4 class="editable">Firewall</h4>
<p>Access to DDC is done using port 443 only (ports 443 and 80 for DTR), whether it&#8217;s to access the Web UI or the remote API. This makes external firewall configuration simple. In most cases you only need to open ports 80, 443, and 22. Port 22 is for SSH access is is optional since DDC doesn&#8217;t require SSH access. Access to applications is through a load balancer using HTTPS. If you expose other TCP services to the outside world, open these ports on the firewall. As explained in the previous section, several ports need to be open for communication inside the cluster. If you have a firewall between some nodes in the cluster, for example, to separate controllers from worker nodes, open the relevant port there too.</p>
<p><img decoding="async" class="internal" src="https://success.docker.com/@api/deki/files/358/DDC_Ports.png?revision=1" alt="DDC Ports" /></p>
</div>
<div id="section_16" class="mt-page-section"><span id="Load_Balancers_2"></span></p>
<h4 class="editable">Load Balancers</h4>
<p>Load balancers are detailed in the previous section. They must be in place before installation and must be provisioned with the right hostnames. External (load balancer) hostnames are used for HA and also for TLS certificates. It&#8217;s easier not having to reconfigure them during or after installation.</p>
<p>Refer to the previous section DDC Components for details about load balancer configuration.</p>
</div>
<div id="section_17" class="mt-page-section"><span id="Shared_Storage"></span></p>
<h4 class="editable">Shared Storage</h4>
<p>DTR shared storage, used for images in the registry, must be ready and accessible from the DTR nodes. Test it works using an S3 or NFS command line client to avoid having to debug DTR storage configuration.</p>
</div>
<div id="section_18" class="mt-page-section"><span id="Host_Configuration"></span></p>
<h4 class="editable">Host Configuration</h4>
<p>Host configuration varies based on the OS used and existing configuration standards, but there are some important steps that must be followed after OS installation:</p>
<ol>
<li><strong>Clock synchronization</strong> using NTP or similar service. Clock skew can produce hard to debug errors, especially where the Raft algorithm is used (UCP and the DTR).</li>
<li><strong>Static IPs</strong> are required for UCP for all hosts.</li>
<li><strong>Hostnames</strong> are used for node identification in the cluster. The hostname must be set in an non-ephemeral way.</li>
<li><strong>Host firewalls</strong> must allow intra-cluster traffic on all the ports specified in the installation docs.</li>
<li><strong>Storage</strong> must be configured if needed. For example, the <code>devicemapper</code> driver need a logical volume configured before Docker Engine installation.</li>
</ol>
</div>
</div>
<div id="section_19" class="mt-page-section"><span id="Docker_CS_Engine_Installation_Considerations"></span></p>
<h3 class="editable">Docker CS Engine Installation Considerations</h3>
<p>Detailed installation instructions for CS Engine are provided by the documentation. To install on machines that don&#8217;t have Internet access, add these package to your own private repository. After installing the package, make sure the <code>docker</code> service is configured to start on system boot.</p>
<p>The best way to change parameters for CS Engine is to use the <code>/etc/docker/daemon.json</code> configuration file. This ensures that the configuration can be reused across different systems and OS in a consistent way. See the documentation for <a class="link-https" href="https://docs.docker.com/engine/reference/commandline/dockerd/#/daemon-configuration-file" target="_blank" rel="external nofollow noopener">the full list of options</a>.</p>
<p>Make sure Engine is configured correctly by starting the <code>docker</code> service and verifying the parameters with <code>docker info</code>.</p>
</div>
<div id="section_20" class="mt-page-section"><span id="UCP_Installation_Considerations"></span></p>
<h3 class="editable">UCP Installation Considerations</h3>
<p>The UCP installer creates a functional cluster from a set of machines running CS Engine. That includes creating a Swarm cluster and installing the UCP controllers. The default installation mode as described in the <a class="link-https" href="https://docs.docker.com/datacenter/ucp/2.0/guides/installation/#/step-4-install-ucp" target="_blank" rel="external nofollow noopener">Installation Guide</a> is interactive.</p>
<p>To perform fully-automated, repeatable deployments, provide more information to the installer:</p>
<pre><code>docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
  -v /tmp/docker_subscription.lic:/config/docker_subscription.lic \
  -e UCP_ADMIN_PASSWORD=password --name ucp docker/ucp install --host-address IP_or_interface \
  --san manager1.example.com --san ucp.example.com 
</code></pre>
<p>Each of these options are explained in the following sections.</p>
<div id="section_21" class="mt-page-section"><span id="External_Certificates"></span></p>
<h4 class="editable">External Certificates</h4>
<p>By default UCP uses self-signed TLS certificates. For production deployments, it is recommended to use certificates generated by a trusted CA. In most cases, this is your organization&#8217;s internal CA.</p>
<p>The certificates and keys needed as follows:</p>
<ol>
<li>The root CA&#8217;s public certificate <code>ca.pem</code>.</li>
<li>The TLS certificate <code>cert.pem</code>. It must also include the public certificates of any intermediate CA and have SANs for all addresses used to access UCP, including the load balancer&#8217;s hostname (e.g. <code>ucp.example.com</code>) and the individual controllers&#8217; hostnames (e.g. <code>ucp-controller1.example.com</code>) to access them directly.</li>
<li>The TLS private key, <code>key.pem</code>.</li>
</ol>
<p>To add these automatically during installation, add these files with the exact names to a volume named <code>ucp-controller-server-certs</code> on the machine where you install UCP, and use the <code>--external-server-cert</code> install parameter.</p>
<p>It is also possible to add the certificates through the Web UI after installation.</p>
</div>
<div id="section_22" class="mt-page-section"><span id="License_File"></span></p>
<h4 class="editable">License File</h4>
<p>The license file can be provided for installation via the command line as well using a bind-mount (volume) in <code>/config</code>. Specify its location with <code>-v /path/to/docker_subscription.lic:/config/docker_subscription.lic</code>.</p>
</div>
<div id="section_23" class="mt-page-section"><span id="Admin_Password"></span></p>
<h4 class="editable">Admin Password</h4>
<p>To make the installation entirely non-interactive, the admin password must be passed using the <code>--admin-password</code> install parameter. The admin username is <code>admin</code> by default. Use <code>--admin-username</code> to change it.</p>
</div>
<div id="section_24" class="mt-page-section"><span id="Adding_Nodes"></span></p>
<h4 class="editable">Adding Nodes</h4>
<p>Once the installation has finished for the first controller node, the two additional controllers must be installed by joining them to the cluster. UCP configures a full controller replica on the manager node in the cluster, so the only command needed on the two controllers is a <code>docker swarm join</code> with the right token. The exact command can be obtained by running <code>docker swarm join-token manager</code> on the first controller.</p>
<p>To join the worker nodes, the equivalent command can be obtained with <code>docker swarm join-token worker</code> on any controller:</p>
<pre><code>docker swarm join-token worker
</code></pre>
<p>To add a worker to this swarm, run the following command:</p>
<pre><code>docker swarm join \
--token SWMTKN-1-00gqkzjo07dxcxb53qs4brml51vm6ca2e8fjnd6dds8lyn9ng1-092vhgjxz3jixvjf081sdge3p \
192.168.65.2:2377
</code></pre>
<p>To make sure everything is running correctly, log into UCP at <code>https://ucp.example.com</code>.</p>
</div>
</div>
<div id="section_25" class="mt-page-section"><span id="DTR_Installation_Considerations"></span></p>
<h3 class="editable">DTR Installation Considerations</h3>
<p>Installation of the DTR is similar to that of UCP. Install and configure one node, and then join replicas to form a full, highly-available setup. For installation of the first instance as well as replicas, point the installer to the node in the cluster it will install on.</p>
<p>Certificates and image storage must be configured after installation. Once shared storage is configured, the two replicas can be added with the <code>join</code> command.</p>
</div>
<div id="section_26" class="mt-page-section"><span id="Validating_the_Deployment"></span></p>
<h3 class="editable">Validating the Deployment</h3>
<p>When installation of everything has finished, tests can be done to validate the deployment. Disable scheduling of workloads on UCP controllers and nodes running the DTR.</p>
<p>Basic tests to consider:</p>
<ol>
<li>Log in through <code>https://ucp.example.com</code> as well as directly to a manager node, eg. <code>https://manager1.example.com</code>. Make sure the cluster and all nodes are healthy.</li>
<li>Test that you can deploy an application following <a class="link-https" href="https://docs.docker.com/datacenter/ucp/2.0/guides/applications/" target="_blank" rel="external nofollow noopener">the example in the documentation</a>.</li>
<li>Test that users can download a bundle and connect to the cluster from the CLI. Test that they can use docker-compose.</li>
<li>Test DTR with a full image workflow. Make sure storage isn&#8217;t misconfigured and images are stored in the right place.</li>
</ol>
<p>Consider building a standard automated test suite to validate new environments and updates. Just testing standard functionality should hit most configuration issues. Make sure you run these tests with a non-admin user, the test user should have similar rights as users of the platform. Measuring time taken by each test can also pinpoint issues with underlying infrastructure configuration. Fully deploying an actual application from your organization should be part of this test suite.</p>
</div>
</div>
<div id="section_27" class="mt-page-section"><span id="High_Availability_in_DDC"></span></p>
<h2 class="editable">High Availability in DDC</h2>
<p>In a production environment, it is vital that critical services have minimal downtime. It is important to understand how high availability (HA) is achieved in UCP and the DTR, and what to do to when it fails. UCP and DTR use the same principles to provide HA, but UCP is more directly tied to Swarm&#8217;s features. The general principle is to have core services replicated in a cluster, which allows another node to take over when one fails. Load balancers make that transparent to the user by providing a stable hostname, independent of the actual node processing the request. It&#8217;s the underlying clustering mechanism that provides HA.</p>
<div id="section_28" class="mt-page-section"><span id="Swarm"></span></p>
<h3 class="editable">Swarm</h3>
<p>The foundation of UCP HA is provided by Swarm, the clustering functionality of Docker Engine. As detailed in the Docker Engine documentation, there are two algorithms involved in managing a Swarm cluster: a Gossip protocol for worker nodes and the Raft consensus algorithm for managers. Gossip protocols are <em>eventually consistent</em>, which means that different parts of the cluster might have different versions of a value while new information spreads in the cluster (they are also called <em>epidemic protocols</em> because information spreads like a virus). This allows for very large scale cluster because it&#8217;s not necessary to wait for the whole cluster to agree on a value, while still allowing fast propagation of information to reach consistency in an acceptable time. Managers handle tasks that need to be based on highly consistent information because they need to make decisions based on global cluster and services state.</p>
<p>In practice, <em>high consistency</em> can be difficult to achieve without impeding availability because each write needs to be acknowledged by all participants, and a participant being unavailable or slow to respond will impact the whole cluster. This is explained by the CAP Theorem, which (to simplify) states that in the presence of partitions (P) in a distributed system, we have to chose between consistency (C) or availability (A). Consensus algorithms like Raft address this trade-off using a <em>quorum</em>: if a majority of participant agree on a value, it is good enough, the minority participant eventually get the new value. That means that a write needs only acknowledgement from 2 out of 3, 3 out of 5, or 4 out of 7 nodes.</p>
<p>Because of the way consensus works, an odd number of nodes is recommended when configuring Swarm. With 3 manager nodes in Swarm, the cluster can temporarily lose 1 and still have a functional cluster, with 5 you can lose 2, and so on. Conversely, you need 2 managers to acknowledge a write in a 3 manager cluster, but 3 with 5 managers, so more managers don&#8217;t provide more performance or scalability — you are actually replicating more data. Having 4 managers doesn&#8217;t add any benefits since you still can only lose 1 (majority is 3), and more data is replicated than with just 3. In practice, it is more fragile.</p>
<p>If you have 3 managers and lose 2, your cluster is non-functional. Existing services and containers keep running, but new requests are not processed. <strong>A single remaining manager in a cluster doesn&#8217;t &#8220;switch&#8221; to single manager mode. It is just a minority node.</strong> You also cannot just promote worker nodes to manager to regain quorum. The failed nodes are still members of the consensus group and need to come back online.</p>
</div>
<div id="section_29" class="mt-page-section"><span id="UCP"></span></p>
<h3 class="editable">UCP</h3>
<p>UCP runs a global service across all cluster nodes called <code>ucp-agent</code>. This agent installs a UCP controller on all Swarm manager nodes. There is a one-to-one correspondence between Swarm managers and UCP controllers, but they have different roles. Using its agent, UCP relies on Swarm for HA, but it also includes replicated data stores that rely on their own raft consensus groups that are distinct from Swarm: ucp-auth-store, a replicated database for identity management data, and ucp-kv, a replicated key-value store for UCP configuration data.</p>
</div>
<div id="section_30" class="mt-page-section"><span id="DTR"></span></p>
<h3 class="editable">DTR</h3>
<p>The DTR has a replication model that is similar to how UCP works, but it doesn&#8217;t synchronize with Swarm. It has one replicated component, its datastore, which might also have a lot of state to replicate at one time. It relies on raft consensus.</p>
<p>Both UCP controllers and DTR replicas may have a lot more state to replicate when (re)joining the cluster. Some reconfiguration operations can make a cluster member temporary unavailable. With 3 members, it&#8217;s good practice to wait for the one you reconfigured to get back in sync before reconfiguring a second one, or they could lose quorum. Temporary losses in quorum are easily recoverable, but it still means the cluster is in an unhealthy state. Monitoring the state of controllers to ensure the cluster doesn&#8217;t stay in that state is critical.</p>
</div>
</div>
<div id="section_31" class="mt-page-section"><span id="Backup_and_Restore"></span></p>
<h2 class="editable">Backup and Restore</h2>
<p>The HA setup using multiple nodes works well to provide continuous availability in the case of temporary failure, including planned node downtime for maintenance. For other cases, including the loss of the full cluster, permanent loss of quorum, and data loss due to storage faults, restoring from backup is necessary.</p>
<div id="section_32" class="mt-page-section"><span id="UCP_Backup"></span></p>
<h3 class="editable">UCP Backup</h3>
<p>UCP backup is done using the <code>docker/ucp backup</code> command on a controller node. It stops the UCP containers on the node and perform a full backup of the configuration and state of UCP. Some of this information is sensitive, so you should always use the <code>--passphrase</code> option to encrypt the backup. The backup also includes the orgs, teams, and users used by DTR as well as UCP. Regular backups should be scheduled. Here is an example showing how to run the command without user input:</p>
<pre><code>UCPID=$(docker run --rm -i --name ucp -v /var/run/docker.sock:/var/run/docker.sock docker/ucp id)
docker run --rm -i --name ucp -v /var/run/docker.sock:/var/run/docker.sock docker/ucp backup --id $UCPID --passphrase "secret" &gt; /tmp/backup.tar
</code></pre>
<p>There are two ways to use the backup:</p>
<ul>
<li>To restore a controller using the <code>docker/ucp restore</code> command (only the backup from that controller can be used)</li>
<li>To install a new cluster using the <code>docker/ucp install --from-backup</code> command (preserves users and configuration)</li>
</ul>
</div>
<div id="section_33" class="mt-page-section"><span id="DTR_Backup"></span></p>
<h3 class="editable">DTR Backup</h3>
<p>A DTR backup includes configuration information, images metadata, and certificates. Images themselves need to be backed up separately directly from storage. Remember that users and organizations are managed and backed up by UCP.</p>
<p>The backup can only be used to create a new DTR, using the <code>docker/dtr restore</code> command.</p>
</div>
</div>
<div id="section_34" class="mt-page-section"><span id="Identity_Management"></span></p>
<h2 class="editable">Identity Management</h2>
<p>Accessing resources (images, containers, volumes, networks etc) and functionality within the components of DDC (UCP &amp; DTR) require at a minimum, an account and a corresponding password to be accessed. Accounts within DDC are identities stored within an internal database, but the source of creating those accounts and the associated access control can be manual (managed or internal) or external through a connection to a directory server (LDAP) or Active Directory (AD). Managing the authorization for these accounts is an extension of coarse and fine grained permissions that are described in the sections below.</p>
<div id="section_35" class="mt-page-section"><span id="Managed_(Internal)_Authentication"></span></p>
<h3 class="editable">Managed (Internal) Authentication</h3>
<p>Managed mode of authentication and authorization is the default mode in DDC. In this mode, accounts are directly created using the DDC API. User accounts can be created manually by accessing the <strong>User Management —&gt; Create User</strong> form in the UCP US. Accounts can also be created and managed in an automated fashion by making HTTP requests to the authentication and authorization RESTful service known as eNZi.</p>
<p>User management using the &#8220;Managed&#8221; mode is recommended only for demo purposes or where the number of users needing to access DDC is very small.</p>
<p>Pros:</p>
<ul>
<li>Easy and quick to setup &#8211; Simple to troubleshoot</li>
<li>Appropriate for a small set of users with static roles</li>
<li>Managed without leaving the UCP interface</li>
</ul>
<p>Cons:</p>
<ul>
<li>User Account management gets cumbersome for larger numbers or when roles need to be managed for several applications.</li>
<li>All lifecycle changes such as adding / removing permissions of users need to be accomplished manually user by user.</li>
<li>Users must be deleted manually, meaning access may not get cleaned up quickly, making the system less secure.</li>
<li>Sophisticated setups of integrating application creation and deployment through LDAP or external systems is not possible.</li>
</ul>
</div>
<div id="section_36" class="mt-page-section"><span id="LDAP_.2F_AD_Integration"></span></p>
<h3 class="editable">LDAP / AD Integration</h3>
<p>The LDAP method of user account authentication can be turned on to manage user access. As the name suggests, this mode enables automatically synchronization of user accounts from a directory server such as Active Directory or OpenLDAP.</p>
<p>This method is particularly applicable for enterprise use cases where organizations have a large set of users, typically maintained in a centralized identity store that manages both authentication and authorization. Most of these stores are based on a directory server such as Microsoft&#8217;s Active Directory or a system that supports the LDAP protocol. Additionally, such enterprises already have mature processes for on-boarding, off-boarding, and managing the lifecycle of changes to user and system accounts. All these can be leveraged to provide a seamless and efficient process of access control within DDC.</p>
<p>Pros:</p>
<ul>
<li>Ability to leverage already established access control processes to grant and revoke permissions.</li>
<li>Ability to continue managing users and permissions from a centralized system based on LDAP.</li>
<li>Increased security due to self-cleaning nature of this mode, where non-existent LDAP users are automatically removed from DDC on the next sync.</li>
<li>Ability to configure complex upstream systems such as flat files, database tables using an LDAP proxy, and the automatic time-based de-provisioning of access through AD/LDAP groups.</li>
</ul>
<p>Cons:</p>
<ul>
<li>Increased complexity compared to Managed mode</li>
<li>Higher admin requirements since knowledge on an external system (LDAP) is needed</li>
<li>Greater time needed to troubleshoot issues with an extra components (LDAP) in the mix</li>
<li>Unexpected changes to DDC due to changes made to upstream LDAP/AD systems, which can have unexpected effects on DDC</li>
</ul>
<p>A recommended best practice is to use group membership to control access of users accounts to resources. Ideally, the management of such group membership is achieved through a centralized Identity Management or a Role Based Access Control system. This provides a standard, flexible, and scalable model to control the authentication and authorization rules within DDC through a centralized directory server. Through the Identity Management system, this directory server is kept in sync with user on-boarding, off-boarding, and changes in roles and responsibilities.</p>
<p>To change the mode of authentication, use the form at <strong>Admin Settings —&gt; Auth</strong> in the UCP UI. In this form, change the <strong>METHOD</strong> field under <strong>Authentication</strong> from the default value of <strong>Managed</strong> to <strong>LDAP</strong>.</p>
<p>Accounts that are discovered and subsequently synced from the directory server can be automatically assigned default permissions. It is recommended to leave the option for default permission to <strong>No Access</strong> Any necessary additional access can be granted based on group memberships.</p>
<p><img decoding="async" class="internal" src="https://success.docker.com/@api/deki/files/359/LDAP-configuration.png?revision=2" alt="Auth Configuration - LDAP" /></p>
<p>For details about the LDAP configuration options, read the Integrate with LDAP documentation.</p>
<p>This section highlights important configuration options to consider when setting up LDAP authentication.</p>
<p>In LDAP auth mode, when accounts are discovered and subsequently imported, all previously created accounts in a Managed mode including the admin accounts are deleted. A new admin account is created when authentication is switched to LDAP. This admin account is a local account and is intended to be useable independent of the LDAP settings (for example, in a situation when there is a loss of connectivity to the directory server). The details of this admin account can be set during the sync using <strong>RECOVERY ADMIN USERNAME</strong> and <strong>RECOVERY ADMIN PASSWORD</strong>.</p>
<p>A user account on the directory server has to be configured to discover and import accounts from the directory server. This user account need not be a very powerful account. In fact, it is recommended that it is a read-only account that can view the necessary organizationalUnits (<code>ou</code>) and query for group memberships. The details for this account are configured using the fields <strong>READER DN</strong> and <strong>READER PASSWORD</strong>. The <strong>READER DN</strong> must be in the distinguishedName format.</p>
<p>Use secure LDAP if at all possible.</p>
<p>Use the Test LDAP Connection section to make sure you can connect before switching to LDAP authentication.</p>
<p>Once the form is filled out and the test connection succeeds, the sync button provides an option to run a sync immediately without waiting for the next interval. Doing so initiates an LDAP connection and runs the filters to import the users. Any previously logged in user is logged out due to the disablement of all pre-existing accounts.</p>
<p><img decoding="async" class="internal" src="https://success.docker.com/@api/deki/files/360/LDAP-mode-deactivate-accounts.png?revision=2" alt="LDAP mode - Deactivate all existing accounts" /></p>
<p>After the sync is complete, it should be possible to log in using the recovery account and password. Be sure to test this recovery account. It should also be possible to log in using a sync-ed LDAP/AD account (the only supported attributes are <code>uid</code> and <code>sAMAccountName</code>) and its corresponding LDAP/AD password. The sync-ed account should be in good standing within the LDAP/AD system for the login to be successful within DDC.</p>
<p>The progress / status of the sync and any errors that occur can be viewed and analyzed on the controllers by running:</p>
<pre><code>docker logs ucp-controller
</code></pre>
</div>
<div id="section_37" class="mt-page-section"><span id="Teams"></span></p>
<h3 class="editable">Teams</h3>
<p>User accounts that exist within DDC, either through an LDAP sync or manually managed, can be organized into teams. Each team created can be assigned customized permissions and managed as a group of users as opposed to granting permissions to each user account on an individual basis.</p>
<p>Teams can be created in the UCP UI using the <strong>TEAMS +Create</strong> interface under <strong>User Management</strong>. The same can be accomplished by using the eNZi API that is described in a later section. Members can be added to the team one-by-one. An alternative method of adding members to a team can be employed if using the LDAP Auth mode. This is based on an automatic sync of discovered accounts from the directory server that was configured to enable the LDAP Auth mode. Finer filters can be applied here which determine which discovered accounts are placed into which teams. A team can have multiple users, and a user can be a member of zero to multiple teams.</p>
</div>
<div id="section_38" class="mt-page-section"><span id="RBAC_and_Managing_Team_Level_Access_to_Resources"></span></p>
<h3 class="editable">RBAC and Managing Team Level Access to Resources</h3>
<p>Permissions to resources through UCP are managed through default access levels. The default access permissions are <code>No Access</code>, <code>View Only</code>, <code>Restricted Control</code> and <code>Full Control</code>. Description about these permissions and how they relate to each other are detailed in the Reference Architecture Securing Docker Datacenter and Security Best Practices. These permissions can be further extended by adding the user accounts to specific teams. In other words, the default permissions assigned directly to a user provide a coarse-grained access control. The user should then be added to teams to attain higher granularity in what a user account can do on specific containers, images, and other resources. The teams are assigned attributes in the form of labels that provide additional flexibility through a fine-grained access control. In some ways this mimics a traditional Role Based Access Control (RBAC), where the teams are the roles assigned to user accounts, but there are specks of the finer Attribute Based Access Control (ABAC) through the assignment of one of more labels to each team, which ultimately define the level of access of the account to UCP resources.</p>
<p>While teams can be associated with as many labels as necessary, the resources within UCP like <code>services</code>, <code>images</code>, <code>volumes</code>, <code>networks</code>, and <code>secrets</code> can also be associated with any one of these labels to tie the two together. It should be noted that any labels assigned to a service are automatically inherited by the tasks which currently are container workloads. So this behaves in just the same way as assigning meta information in the form of labels to containers (or any other resource for that matter). Internally, the resources are assigned a label with the key <code>com.docker.ucp.access.label</code> with the value as specified.</p>
<p>It would be easier to understand with a concrete example as described in the following section.</p>
</div>
<div id="section_39" class="mt-page-section"><span id="Strategy_for_Using_LDAP_Filters"></span></p>
<h3 class="editable">Strategy for Using LDAP Filters</h3>
<p>This section demonstrates a typical use case that uses the principles of &#8220;least privilege / permission&#8221; as well as &#8220;separation of duties.&#8221;</p>
<p>Suppose you have a simple application called <code>www</code>, which is a web server based on the <code>nginx</code> official image. Say there are three teams that need access to this application — <code>developers</code>, <code>testers</code>, and <code>operations</code>. Typically, <code>testers</code> need <code>View Only</code> access and nothing further, while the <code>operations</code> team usually needs <code>Full Control</code>. The <code>developers</code> team needs access to troubleshoot, restart, and control the lifecycle of the application but should be forbidden from any other activity involving the need to access the host file systems, or starting up privileged containers. This type of special access is termed <code>Restricted Control</code>.</p>
<p>The users needing to access UCP are all sourced from the corporate Directory Server system. These users are the admin users needed to manage DDC infrastructure as well as all members of each of the teams configured within UCP. Also assume that the total universe of users needing access to DDC (includes admins, developers, testers and operations) is a subset of the gamut of users within the Directory Server.</p>
<p>A recommended strategy to use when organizing the DDC users is to create an overarching membership group that identifies all users of DDC irrespective of which team they are a part of. Let us call this group <code>DDC_Users</code>. No user should be made a member of this group directly. Instead, the <code>DDC_Users</code> group should have other groups in it and only groups as its members. Per our example, let us call these groups <code>dev</code>, <code>test</code>, and <code>ops</code>. In our example, these groups are part of what is known as a <em>nested group</em> structure within the directory server. Nested groups allow the inheritance of permissions from one group to each of its sub-groups.</p>
<blockquote><p>**NOTE:** Some directory servers do not support the feature of nested groups or even the `memberOf` attribute by default. If so, then they would need to be enabled. If the choice of directory server does not support these features at all, then alternate means of organizing users and querying them should be used. Microsoft Active Directory supports both these features out of the box.</p></blockquote>
<p>User accounts should be added as members of these sub-groups in the directory server. This should not impact any existing layout in the organization units or pre-existing group membership for these users.</p>
<p>Within UCP, the first step is to enable the LDAP Auth mode. Under <strong>User Search Configurations</strong>, for the <strong>FILTER</strong> field, the value based on our example above should be <code>(&amp;(objectClass=person)(memberOf=cn=DDC_Users,ou=groups,dc=example,dc=com))</code>.</p>
<p>Performing a sync with this setting discovers and import all users that are members of the group <code>DDC_Users</code> (through the nested sub-groups).</p>
<p>Next, using the <strong>TEAMS +Create</strong> link under <strong>User Management</strong>, the individual teams can be created. An example of creating the <code>developers</code> team is shown below. The value of the <strong>Group DN</strong> field reflects the sub-group created under <code>DDC_Users</code> called <code>dev</code>.</p>
<p><img decoding="async" class="internal" src="https://success.docker.com/@api/deki/files/361/developer-team-creation.png?revision=2" alt="Developers team creation" /></p>
<p>After the team is created, bring up the <strong>Add Label</strong> form by clicking on the <strong>PERMISSIONS</strong> link. Here, as many permissions as needed can be added. In the image below, two labels are added to denote that members of the <code>developers</code> team have <code>View Only</code> access to any resource labeled as <code>production</code>. An additional label grants the members of the <code>developers</code> team <code>Full Control</code> on resources labeled as <code>development</code>.</p>
<p><img decoding="async" class="internal" src="https://success.docker.com/@api/deki/files/362/developer-team-permissions.png?revision=2" alt="Developers permissions" /></p>
<p>Similarly, the <code>testers</code> and <code>operations</code> teams are created and assigned permissions per the table below:</p>
<table>
<thead>
<tr>
<th>Team</th>
<th>Group</th>
<th>Permissions</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>testers</code></td>
<td><code>cn=test,ou=groups,dc=example,dc=com</code></td>
<td><code>production</code>: <code>No Access</code></td>
</tr>
<tr>
<td></td>
<td></td>
<td><code>development</code>: <code>View Only</code></td>
</tr>
<tr>
<td><code>operations</code></td>
<td><code>cn=ops,ou=groups,dc=example,dc=com</code></td>
<td><code>production</code>: <code>Full Control</code></td>
</tr>
<tr>
<td></td>
<td></td>
<td><code>development</code>: <code>Full Control</code></td>
</tr>
</tbody>
</table>
<p>Now, you can create the service <code>www</code> and assign it the appropriate <code>access label</code> to allow only specific users access to the resource using a command like below:</p>
<pre><code>docker service create --name www -p 80:80 --label com.docker.ucp.access.label=development nginx
</code></pre>
<p>The same can be done in the UCP UI while creating a service by selecting an appropriate label (<code>development</code> in this example) from the <strong>PERMISSIONS LABEL</strong> dropdown as shown below. The label is applied to the service for enforcing role-based access control.</p>
<p><img decoding="async" class="internal" src="https://success.docker.com/@api/deki/files/363/service-create-permissions-label.png?revision=2" alt="Service create - Permissions Labels" /></p>
<p>Only those labels that the logged in user has access to shows up in the dropdown. An admin user or a user assigned <code>Full Control</code> permission is shown all available labels regardless of the labels assigned to the team of which the user is a member of.</p>
<p>Now, create another service <code>www-prod</code> similarly based on the <code>nginx</code> image but with the <strong>Permission Label</strong> of <code>production</code> applied to it while logged in as a user <code>boyle</code> who is a member of the developers team. His permissions look as follows:</p>
<p><img decoding="async" class="internal" src="https://success.docker.com/@api/deki/files/364/developers-member-profile.png?revision=3" alt="Developers - boyle profile" /></p>
<p>The account <code>boyle</code> can see both services, <code>www</code> and <code>www-prod</code>, but only the <code>www</code> service allows edits and other control because the permission label of <code>development</code> matches with the team&#8217;s resource label of <code>development</code> granted with <code>Full Control</code> permissions. The <code>www-prod</code> service forbids any edits using the account <code>boyle</code> because it has a permission label of <code>production</code>, which has been marked as <code>View Only</code> in the team <code>developers'</code> resource label. For example, if the account <code>boyle</code> was used to scale up the number of replicas of each service, from 1 to 2 (for instance), an error of <code>Access Denied</code> would be thrown for the <code>www-prod</code> service, while the same would work for <code>www</code> service.</p>
<p>Further, as evident in the profile image, <code>boyle</code> has <code>Default Permissions</code> of <code>No Access</code>. This prevents the <code>boyle</code> account from accessing any other resource unless the permission label and team resource label match and provide explicit permissions that override the <code>No Access</code> default permission.</p>
<p>Finally, if and when it becomes necessary to terminate all access for any user account, removing the group membership of the account from just the one group <code>DDC_Users</code> would remove all access for the user. Due to the nature of how nested groups work, all additional access within DDC is automatically cleaned — the user account is removed from any and all team memberships at the time of the next sync without need for manual intervention or additional steps. This step can be integrated into a standard on-boarding / off-boarding automated provisioning step within a corporate Identity Management system.</p>
</div>
<div id="section_40" class="mt-page-section"><span id="Authentication_API_(eNZi)"></span></p>
<h3 class="editable">Authentication API (eNZi)</h3>
<p>The AuthN API or eNZi (as it is known internally and pronounced N-Z) is a centralized authentication and authorization service and framework for DDC. This API is completely integrated and configured into DDC and works seamlessly with UCP as well as DTR. This is the component and service under the hood that manages accounts, teams and organizations, user sessions, permissions and access control through labels, Single-Sign-On (Web SSO) through OpenID Connect, and synchronization of account details from an external LDAP-based system into DDC.</p>
<p>For regular day-to-day activities, users and operators need not be concerned with the AuthN API and how it works, however its features can be leveraged to automate many common functions and/or bypass the DDC UI altogether to manage and manipulate the data directly.</p>
<p>The RESTFul AuthN API endpoints are documented in the AuthN API.</p>
<p>Interaction with AuthN can be accomplished in two ways: via the exposed RESTful AuthN API over HTTP or via the <code>enzi</code> command.</p>
<p>For example, the command below uses <code>curl</code> and <code>jq</code> to fetch all user accounts in <a href="http://www.scmgalaxy.com/courses/agenda/virtulization-and-container-tools/docker-training.html">DDC</a> via the AuthN API over HTTP:</p>
<pre><code>curl --silent --insecure --header "Authorization: Bearer $(curl --silent --insecure \
     --data '{"username":"&lt;admin-username&gt;","password":"&lt;admin-password&gt;"}' \
    https://&lt;UCP-domain-name&gt;/auth/login | jq --raw-output .auth_token)" \
    https://&lt;UCP-domain-name&gt;/enzi/v0/accounts | jq .
</code></pre>
<p>The AuthN service can also be invoked on the CLI on a UCP controller. To connect into it, run the following on a UCP controller:</p>
<pre><code>docker exec -it ucp-auth-api sh
</code></pre>
<p>At the resulting prompt (<code>#</code>), type the <code>enzi</code> command with a sub-command such as the one below to list the database table status:</p>
<pre><code>enzi db-status
</code></pre>
</div>
</div>
<h3 class="editable"></h3>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bestdevops.com/docker-reference-architecture-docker-datacenter-best-practices-and-design-considerations/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Docker Introduces Secrets Management for Enterprise Container Deployments</title>
		<link>https://www.bestdevops.com/docker-introduces-secrets-management/</link>
					<comments>https://www.bestdevops.com/docker-introduces-secrets-management/#respond</comments>
		
		<dc:creator><![CDATA[anil]]></dc:creator>
		<pubDate>Fri, 10 Feb 2017 05:01:46 +0000</pubDate>
				<category><![CDATA[DevOps Tools]]></category>
		<category><![CDATA[DevOps Updates]]></category>
		<category><![CDATA[Container]]></category>
		<category><![CDATA[Datacenter]]></category>
		<category><![CDATA[Docker]]></category>
		<category><![CDATA[Docker Updates]]></category>
		<category><![CDATA[Secrets Management]]></category>
		<category><![CDATA[Secure applications]]></category>
		<category><![CDATA[Security]]></category>
		<guid isPermaLink="false">http://www.bestdevops.com/?p=602</guid>

					<description><![CDATA[Docker Datacenter added a native secrets management framework to securely deliver sensitive credentials—API keys, passwords, and encryption keys—to authorized containers in a Swarm cluster, eliminating the need for third-party workarounds.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><em>This article is based on reporting originally published by CRN in February 2017, covering a Docker Datacenter release that introduced native secrets management and image security scanning.</em></p>



<h2 class="wp-block-heading">Overview</h2>



<p class="wp-block-paragraph">Docker released an update to Docker Datacenter—its enterprise Containers-as-a-Service platform—that introduced two significant security capabilities: a container-native secrets management framework and a Docker image security scanning feature. Together, these addressed long-standing concerns from enterprise customers about securely handling sensitive credentials in containerized environments.</p>



<h2 class="wp-block-heading">The Problem: Secrets in Plain Sight</h2>



<p class="wp-block-paragraph">Before Docker built secrets management into the platform, teams running containers at scale had no native, secure way to pass sensitive information—passwords, API keys, private keys, database credentials—to the containers that needed them. Common workarounds included embedding credentials in environment variables, baking them into Docker images, or relying on third-party secrets stores that added operational complexity and potential exposure points.</p>



<p class="wp-block-paragraph">Will Kinard, CTO of BoxBoat (a Docker partner based in Washington, D.C.), described the situation plainly in comments to CRN:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>&#8220;This was a challenge before it was built into the platform. We had to pass in passwords in the clear without encryption.&#8221;</p><cite>Will Kinard, CTO, BoxBoat</cite></blockquote>



<h2 class="wp-block-heading">How Docker Secrets Management Works</h2>



<p class="wp-block-paragraph">The secrets management feature is integrated directly into <strong>Docker Swarm</strong>, the built-in cluster orchestration layer. Key characteristics of the implementation include:</p>



<ul class="wp-block-list">
<li><strong>Encrypted storage:</strong> Secrets are stored as encrypted key-value pairs within the Swarm cluster&#8217;s distributed store (backed by Raft consensus).</li>
<li><strong>Granular access control:</strong> Only explicitly authorized services within the cluster can access a given secret. Containers that do not need a secret cannot retrieve it.</li>
<li><strong>Supported secret types:</strong> Login credentials, database passwords, TLS/private keys, API tokens, and other sensitive strings.</li>
<li><strong>Runtime delivery:</strong> Secrets are delivered to authorized containers at runtime, mounted as files in an in-memory tmpfs filesystem inside the container, so they are never written to disk on the host or baked into an image layer.</li>
</ul>



<p class="wp-block-paragraph">Kinard summarized the intent of the feature: <em>&#8220;This is providing access to secrets to the containers that need it, and depriving it to containers that don&#8217;t.&#8221;</em></p>



<h2 class="wp-block-heading">Image Security Scanning</h2>



<p class="wp-block-paragraph">Alongside secrets management, the Docker Datacenter update also shipped a <strong>security scanning feature</strong> for Docker images. This capability:</p>



<ul class="wp-block-list">
<li>Scans Docker images layer by layer and cross-references their contents against known vulnerability databases.</li>
<li>Identifies both security vulnerabilities (CVEs) and non-security bugs in packages and libraries bundled inside images.</li>
<li>Helps teams catch problematic dependencies before images are deployed to production.</li>
</ul>



<p class="wp-block-paragraph">According to Kinard, even organizations new to Docker were already asking about security scanning capabilities, underscoring its importance as an enterprise requirement.</p>



<h2 class="wp-block-heading">Why This Mattered for DevOps Teams</h2>



<p class="wp-block-paragraph">Managing secrets securely is a cross-cutting concern that affects every team in the DevOps lifecycle—developers writing application code, operators managing cluster infrastructure, and security teams enforcing compliance policies. By building secrets management natively into the orchestration layer rather than relying on bolt-on tooling, Docker aimed to:</p>



<ul class="wp-block-list">
<li>Reduce the attack surface by eliminating cleartext credential passing.</li>
<li>Simplify the developer experience—services declare what secrets they need; Swarm handles secure delivery.</li>
<li>Enable partners and enterprises to build end-to-end secure container solutions without mandatory third-party integrations.</li>
<li>Improve auditability and access control at the orchestration layer.</li>
</ul>



<h2 class="wp-block-heading">Context: Docker Datacenter and the Enterprise Market</h2>



<p class="wp-block-paragraph">Docker Datacenter was Docker&#8217;s first commercial product, positioning the company in the enterprise market with a Containers-as-a-Service offering. Docker had also launched its first formal channel partner program around Datacenter, making enterprise security features like secrets management and image scanning important selling points for partners and system integrators.</p>



<p class="wp-block-paragraph">The secrets management and scanning features represented Docker&#8217;s move toward making security a first-class platform capability rather than an afterthought, directly responding to feedback from enterprise customers evaluating container adoption at scale.</p>



<h2 class="wp-block-heading">Legacy and Current State</h2>



<p class="wp-block-paragraph">Docker Secrets (introduced in Docker 1.13 / Docker Swarm) remains available in Docker Swarm deployments today. For teams using Kubernetes, the equivalent mechanism is <strong>Kubernetes Secrets</strong>, though both Kubernetes and Docker ecosystems now commonly integrate with dedicated secrets management solutions such as HashiCorp Vault, AWS Secrets Manager, or Azure Key Vault for more advanced use cases like secret rotation and fine-grained audit logging.</p>



<p class="wp-block-paragraph">Image scanning has similarly evolved, with tools such as Docker Scout, Trivy, Grype, Snyk, and cloud-provider native scanners now offering more comprehensive vulnerability detection pipelines.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bestdevops.com/docker-introduces-secrets-management/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>From Yawn-Driven Deployment to DevOps Tipping Point</title>
		<link>https://www.bestdevops.com/from-yawn-driven-deployment-to-devops-tipping-point/</link>
					<comments>https://www.bestdevops.com/from-yawn-driven-deployment-to-devops-tipping-point/#respond</comments>
		
		<dc:creator><![CDATA[anil]]></dc:creator>
		<pubDate>Tue, 07 Feb 2017 07:34:55 +0000</pubDate>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[DevOps Best Practices]]></category>
		<category><![CDATA[Cloud]]></category>
		<category><![CDATA[Datacenter]]></category>
		<category><![CDATA[Deployment]]></category>
		<category><![CDATA[DevOps]]></category>
		<category><![CDATA[Yawn-Driven Deployment]]></category>
		<guid isPermaLink="false">http://www.bestdevops.com/?p=540</guid>

					<description><![CDATA[Source:- linux.com GS Shop is one of the largest TV shopping networks in Asia, and one of the largest e-commerce [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Source:- linux.com</p>
<p>GS Shop is one of the largest TV shopping networks in Asia, and one of the largest e-commerce sites in Korea with more than 1000 employees and 1.5 million users daily. Vivek Juneja of GS Shop&#8217;s Container Platform Team, at MesosCon Asia 2016, shares how he and his team moved this behemoth to the new agile way of running the datacenter.</p>
<p>We know that change is not easy, and Juneja shares many valuable insights in how to successfully manage completely revamping your IT department. Progress is hard even when the old way is difficult. Juneja describes their old practice of &#8220;yawn-driven deployment&#8221;: &#8220;We practice something called Yawn-Driven Deployment, deploying at 3:00 a.m. That&#8217;s what we were doing for a long time. Everybody gets together at 3:00 a.m. It&#8217;s a party. We deploy, and we have a lot of yawns, and that code goes to production.&#8221; Nobody really like working this way, but it&#8217;s what they are used to.</p>
<p>&#8220;When we look at any deployments or adoption of DevOps practices,&#8221; says Juneja, &#8220;We try to follow this adoption graph, which means, at the beginning, you&#8217;re in Evaluation Stage. And then you&#8217;ll start putting something in production so that you get some feedback, and teams get some confidence that this thing works. And once you reach a confidence in a production environment, you will likely see a tipping point.&#8221;</p>
<p>Juneja&#8217;s team deployed their new DevOps methodologies on both new and old services, running new and old side-by-side. &#8220;Which shows them the difference between the old style and the new style,&#8221; says Juneja, &#8220;Doing a compare-and-contrast node for that technology&#8230; we move traffic between them so that a particular percentage of traffic moves to the old environment and the rest goes to the containerized environment. This has trade-offs, but it also provides us the basis for proving the technology. So everything becomes mainstream. Everything becomes stable. That&#8217;s the time where we move everything to our new environment which uses Mesos.&#8221;</p>
<p>This process of introducing and proving changes systematically and in small steps worked so well that staffers went overboard and overloaded the new systems. &#8220;Our teams started creating more environments. They loved it so much, they would have environments for every new deployment that they were creating too much of it. Making it easy for our teams to deploy a service means there are too many of these environments laying around.&#8221; This is a common problem, users not understanding the true cost of their resource usage. Juneja&#8217;s team&#8217;s solution was to set automatic timeouts on dev-and-test environments. The infrastructure team learned about resource utilitization and developed good resource-management habits.</p>
<p><a href="https://youtu.be/6DfXROnvq10?list=PLbzoR-pLrL6pLSHrXSg7IYgzSlkOh132K">Watch Juneja&#8217;s full talk</a> to learn more excellent insights into progressing from yawn-driven development to a more comfortable schedule, and to learn about bringing all of your diverse and sometimes competing teams together and working towards common goals.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bestdevops.com/from-yawn-driven-deployment-to-devops-tipping-point/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
