{"id":49168,"date":"2025-04-25T14:58:34","date_gmt":"2025-04-25T14:58:34","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=49168"},"modified":"2025-07-12T05:56:26","modified_gmt":"2025-07-12T05:56:26","slug":"openshift-difference-between-deploymentconfig-and-deployment","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/openshift-difference-between-deploymentconfig-and-deployment\/","title":{"rendered":"Openshift: Difference Between DeploymentConfig and Deployment"},"content":{"rendered":"\n<p><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Feature<\/th><th>DeploymentConfig (DC)<\/th><th>Deployment (K8s Deployment)<\/th><\/tr><\/thead><tbody><tr><td>Belongs to<\/td><td>OpenShift-only (legacy)<\/td><td>Kubernetes-native (standard)<\/td><\/tr><tr><td>API Group<\/td><td><code>apps.openshift.io\/v1<\/code><\/td><td><code>apps\/v1<\/code><\/td><\/tr><tr><td>First Introduced<\/td><td>OpenShift 3.x<\/td><td>Kubernetes 1.x<\/td><\/tr><tr><td>Purpose<\/td><td>Deploy\/manage pods <strong>with extra OpenShift features<\/strong> like automatic image rebuilds.<\/td><td>Deploy\/manage pods in a <strong>standard Kubernetes way<\/strong>.<\/td><\/tr><tr><td>Triggers (auto-update)<\/td><td>Supports <strong>ImageChangeTrigger<\/strong>, <strong>ConfigChangeTrigger<\/strong> easily.<\/td><td>No built-in ImageTrigger (needs webhooks, GitOps, Tekton).<\/td><\/tr><tr><td>Build Integration<\/td><td>Tight integration with OpenShift <strong>BuildConfig<\/strong> (S2I) + <strong>ImageStreams<\/strong>.<\/td><td>No native build integration \u2014 CI\/CD pipelines needed separately.<\/td><\/tr><tr><td>Rollback &amp; Rollout<\/td><td>Managed by OpenShift internally (easy CLI commands).<\/td><td>Kubernetes-native rollback\/rollout (<code>kubectl rollout<\/code>).<\/td><\/tr><tr><td>Strategy Options<\/td><td>Rolling, Recreate, Custom, and Hooks (pre\/post hooks).<\/td><td>RollingUpdate, Recreate (no custom hooks by default).<\/td><\/tr><tr><td>UI Support<\/td><td>Fully available in OpenShift 3.x\/4.x console until 4.13.<\/td><td>Now the <strong>recommended<\/strong> method in OpenShift 4.14+.<\/td><\/tr><tr><td>Lifecycle<\/td><td>\ud83d\udd25 Deprecated for feature development (4.14 onward).<\/td><td>\ud83d\ude80 Active, recommended standard.<\/td><\/tr><tr><td>Portability<\/td><td>\u274c Works only on OpenShift.<\/td><td>\u2705 Works on any Kubernetes (EKS, AKS, GKE, OpenShift, etc.).<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">\ud83d\udee0 Example Differences<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">\u2705 1. DeploymentConfig Example (Old way)<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">apiVersion: apps.openshift.io\/v1\nkind: DeploymentConfig\nmetadata:\n  name: myapp\nspec:\n  replicas: 2\n  selector:\n    app: myapp\n  triggers:\n    - type: ConfigChange\n    - type: ImageChange\n  template:\n    metadata:\n      labels:\n        app: myapp\n    spec:\n      containers:\n      - name: myapp\n        image: myapp:latest\n<\/code><\/span><\/pre>\n\n\n<ul class=\"wp-block-list\">\n<li>ImageChangeTrigger automatically pulls new images!<\/li>\n\n\n\n<li>Used with BuildConfigs and ImageStreams.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u2705 2. Deployment Example (Modern way)<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">apiVersion: apps\/v1\nkind: Deployment\nmetadata:\n  name: myapp\nspec:\n  replicas: 2\n  selector:\n    matchLabels:\n      app: myapp\n  strategy:\n    type: RollingUpdate\n  template:\n    metadata:\n      labels:\n        app: myapp\n    spec:\n      containers:\n      - name: myapp\n        image: myapp:latest\n<\/code><\/span><\/pre>\n\n\n<ul class=\"wp-block-list\">\n<li>Pure Kubernetes Deployment.<\/li>\n\n\n\n<li>No automatic ImageStream trigger \u2014 you must manually update, use GitOps, webhook, or Tekton.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">\ud83d\udd25 Key Functional Differences<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Aspect<\/th><th>DeploymentConfig<\/th><th>Deployment<\/th><\/tr><\/thead><tbody><tr><td>Auto image update from ImageStream<\/td><td>\u2705 Built-in (<code>ImageChangeTrigger<\/code>)<\/td><td>\u274c Must build manually (e.g., webhook triggers)<\/td><\/tr><tr><td>Build integration (BuildConfig)<\/td><td>\u2705 Tight coupling<\/td><td>\u274c No coupling; CI\/CD external<\/td><\/tr><tr><td>OpenShift-only<\/td><td>\u2705<\/td><td>\u274c<\/td><\/tr><tr><td>Kubernetes standard<\/td><td>\u274c<\/td><td>\u2705<\/td><\/tr><tr><td>Future use (post-OpenShift 4.14)<\/td><td>\u274c Legacy<\/td><td>\u2705 Standard<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">\ud83c\udfaf In Short<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>If you are using&#8230;<\/th><th>Then&#8230;<\/th><\/tr><\/thead><tbody><tr><td>OpenShift 3.x or old 4.x apps<\/td><td>You might still find\/use DeploymentConfigs.<\/td><\/tr><tr><td>OpenShift 4.14+ and new apps<\/td><td>\u2705 Use Kubernetes-native Deployments only.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">\ud83d\udccb Quick Real World Examples:<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Use case<\/th><th>Best choice now<\/th><\/tr><\/thead><tbody><tr><td>Building a new microservice app<\/td><td>Deployment<\/td><\/tr><tr><td>Moving an app across clusters (OpenShift \u2192 EKS \u2192 AKS)<\/td><td>Deployment<\/td><\/tr><tr><td>Legacy OpenShift S2I project with ImageStream auto-rebuilds<\/td><td>DeploymentConfig (until migrated)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">\ud83d\udce2 Final Message:<\/h1>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>DeploymentConfig<\/strong> = OpenShift-specific, powerful in OpenShift pipelines, but <strong>deprecated<\/strong> for new feature development in 4.14+.<\/li>\n\n\n\n<li><strong>Deployment<\/strong> = Kubernetes standard object, <strong>recommended for all new apps<\/strong> moving forward.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">\ud83c\udf1f Bonus Tip:<\/h1>\n\n\n\n<p>\u2705 You can <strong>still use ImageStreams + Deployment<\/strong> together \u2014<br>but instead of using &#8220;ImageChangeTriggers,&#8221;<br>you need to use external CI\/CD pipelines (like Jenkins, Tekton, GitHub Actions) to <strong>update the Deployment<\/strong> automatically.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">\ud83c\udfaf Quick One-Liner:<\/h1>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong>DeploymentConfig = OpenShift magic for older CI\/CD,<br>Deployment = Kubernetes standard for modern apps.<\/strong><\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Feature DeploymentConfig (DC) Deployment (K8s Deployment) Belongs to OpenShift-only (legacy) Kubernetes-native (standard) API Group apps.openshift.io\/v1 apps\/v1 First Introduced OpenShift 3.x Kubernetes 1.x Purpose Deploy\/manage pods with extra OpenShift features like&#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[5153],"tags":[],"class_list":["post-49168","post","type-post","status-publish","format-standard","hentry","category-openshift"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/49168","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=49168"}],"version-history":[{"count":1,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/49168\/revisions"}],"predecessor-version":[{"id":49169,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/49168\/revisions\/49169"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=49168"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=49168"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=49168"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}