{
  "version": 3,
  "sources": ["ssg:https://framerusercontent.com/modules/NEd4VmDdsxM3StIUbddO/DDzyuYPF56TuI0bfUu2z/YouTube.js", "ssg:https://framerusercontent.com/modules/PveCBvwrjn3AansfeeVF/OZCxtkYoeMhhaRSNBXe2/NOV9lZaAr-3.js"],
  "sourcesContent": ["import{jsx as _jsx,jsxs as _jsxs,Fragment as _Fragment}from\"react/jsx-runtime\";import{useReducer,useState}from\"react\";import{ControlType,addPropertyControls}from\"framer\";import{useIsOnCanvas,emptyStateStyle,containerStyles,defaultEvents,useRadius,borderRadiusControl}from\"https://framer.com/m/framer/default-utils.js@^0.45.0\";var PlayOptions;(function(PlayOptions){PlayOptions[\"Normal\"]=\"Off\";PlayOptions[\"Auto\"]=\"On\";PlayOptions[\"Loop\"]=\"Loop\";})(PlayOptions||(PlayOptions={}));var ThumbnailOptions;(function(ThumbnailOptions){ThumbnailOptions[\"High\"]=\"High Quality\";ThumbnailOptions[\"Medium\"]=\"Medium Quality\";ThumbnailOptions[\"Low\"]=\"Low Quality\";ThumbnailOptions[\"Off\"]=\"Off\";})(ThumbnailOptions||(ThumbnailOptions={}));/**\n * @framerIntrinsicWidth 560\n * @framerIntrinsicHeight 315\n *\n * @framerSupportedLayoutWidth fixed\n * @framerSupportedLayoutHeight fixed\n *\n * @framerComponentPresetProps isRed, borderRadius\n */export function Youtube({url,play,shouldMute,thumbnail,isRed,onClick,onMouseEnter,onMouseLeave,onMouseDown,onMouseUp,title,...props}){const onCanvas=useIsOnCanvas();const isAutoplay=play!==\"Off\";const showThumbnail=onCanvas||thumbnail!==\"Off\"&&!isAutoplay;const[isPreloading,preloadVideo]=useReducer(()=>true,false);const[showVideo,startVideo]=useReducer(()=>true,!showThumbnail);const[isHovered,setHovered]=useState(false);const borderRadius=useRadius(props);const hasBorderRadius=borderRadius!==\"0px 0px 0px 0px\"&&borderRadius!==\"0px\";if(url===\"\"){return /*#__PURE__*/_jsx(Instructions,{});}const parsedURL=parseVideoURL(url);if(parsedURL===undefined){return /*#__PURE__*/_jsx(ErrorMessage,{message:\"Invalid Youtube URL.\"});}const[videoId,embedURL,originalSearchParams]=parsedURL;const searchParams=embedURL.searchParams;if(originalSearchParams){for(const[param,value]of originalSearchParams){searchParams.set(param,value);}}// https://developers.google.com/youtube/player_parameters\nsearchParams.set(\"iv_load_policy\",\"3\");searchParams.set(\"rel\",\"0\");searchParams.set(\"modestbranding\",\"1\");searchParams.set(\"playsinline\",\"1\");if(!showVideo){// if a browser does not support `loading=lazy`, make sure the video doesn't start playing in the background\nsearchParams.set(\"autoplay\",\"0\");}else if(isAutoplay||// when there is no thumbnail, we don't want to autoplay, unless video is started\nshowThumbnail&&showVideo){searchParams.set(\"autoplay\",\"1\");}if(isAutoplay&&shouldMute){searchParams.set(\"mute\",\"1\");}if(play===\"Loop\"){searchParams.set(\"loop\",\"1\");searchParams.set(\"playlist\",videoId);}if(!isRed){searchParams.set(\"color\",\"white\");}const iframeProps={title:title||\"Youtube Video\",allow:\"presentation; fullscreen; accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\",src:embedURL.href,frameBorder:\"0\",onClick,onMouseEnter,onMouseLeave,onMouseDown,onMouseUp};return /*#__PURE__*/_jsxs(\"article\",{onPointerEnter:()=>setHovered(true),onPointerLeave:()=>setHovered(false),onPointerOver:preloadVideo,onKeyDown:startVideo,onClick:startVideo,style:{...wrapperStyle,borderRadius,transform:// Safari sometimes struggles to render border-radius:\n// - on the canvas when changing from 0 to any other value\n// - or when rendering an iframe\nhasBorderRadius&&(showVideo||onCanvas)?\"translateZ(0.000001px)\":\"unset\",cursor:\"pointer\",overflow:\"hidden\"},role:\"presentation\",children:[isPreloading&&/*#__PURE__*/_jsx(\"link\",{rel:\"preconnect\",href:\"https://www.youtube.com\"}),isPreloading&&/*#__PURE__*/_jsx(\"link\",{rel:\"preconnect\",href:\"https://www.google.com\"}),showThumbnail&&/*#__PURE__*/_jsxs(_Fragment,{children:[/*#__PURE__*/_jsx(\"link\",{rel:\"preconnect\",href:\"https://i.ytimg.com\"}),/*#__PURE__*/_jsx(\"img\",{decoding:\"async\",src:getThumbnailURL(videoId,thumbnail),style:{...videoStyle,objectFit:\"cover\"}})]}),!onCanvas?/*#__PURE__*/_jsx(\"iframe\",{loading:!showVideo?\"lazy\":undefined,style:!showVideo?{...videoStyle,display:\"none\"}:videoStyle,...iframeProps}):null,showVideo?null:/*#__PURE__*/_jsx(PlayButton,{onClick:startVideo,isHovered:isHovered,isRed:isRed})]});}Youtube.displayName=\"YouTube\";addPropertyControls(Youtube,{url:{type:ControlType.String,title:\"Video\"},play:{type:ControlType.Enum,title:\"Autoplay\",options:Object.values(PlayOptions)},shouldMute:{title:\"Mute\",type:ControlType.Boolean,enabledTitle:\"Yes\",disabledTitle:\"No\",hidden(props){return props.play===\"Off\";}},thumbnail:{title:\"Thumbnail\",description:\"Showing a thumbnail improves performance.\",type:ControlType.Enum,options:Object.values(ThumbnailOptions),hidden(props){return props.play!==\"Off\";}},isRed:{title:\"Color\",type:ControlType.Boolean,enabledTitle:\"Red\",disabledTitle:\"White\"},...borderRadiusControl,...defaultEvents});const defaultProps={url:\"https://youtu.be/smPos0mJvh8\",play:\"Off\",shouldMute:true,thumbnail:\"Medium Quality\",isRed:true};Youtube.defaultProps=defaultProps;function parseVideoURL(urlString){let url;try{url=new URL(urlString);}catch{const embedURL=getEmbedURL(urlString);return[urlString,embedURL,null];}const searchParams=url.searchParams;if(url.hostname===\"youtube.com\"||url.hostname===\"www.youtube.com\"||url.hostname===\"youtube-nocookie.com\"||url.hostname===\"www.youtube-nocookie.com\"){const pathSegments=url.pathname.slice(1).split(\"/\");const page=pathSegments[0];// https://www.youtube.com/watch?v=Fop2oskTug8\nif(page===\"watch\"){const videoId=url.searchParams.get(\"v\");const embedURL=getEmbedURL(videoId);return[videoId,embedURL,searchParams];}// https://www.youtube.com/embed/Fop2oskTug8\nif(page===\"embed\"){const videoId=pathSegments[1];return[videoId,url,searchParams];}// https://www.youtube.com/shorts/zwMEhBq4kYM / https://www.youtube.com/live/XlWSzaluBKk\nif(page===\"shorts\"||page===\"live\"){const videoId=pathSegments[1];const embedURL=getEmbedURL(videoId);return[videoId,embedURL,searchParams];}}// https://youtu.be/Fop2oskTug8\nif(url.hostname===\"youtu.be\"){const videoId=url.pathname.slice(1);const embedURL=getEmbedURL(videoId);return[videoId,embedURL,searchParams];}}function getEmbedURL(videoId){return new URL(`https://www.youtube.com/embed/${videoId}`);}function getThumbnailURL(videoId,res){// https://gist.github.com/a1ip/be4514c1fd392a8c13b05e082c4da363\nconst pre=\"https://i.ytimg.com/vi_webp/\";const ext=\"webp\";switch(res){case\"Low Quality\":return`${pre}${videoId}/hqdefault.${ext}`;case\"Medium Quality\":return`${pre}${videoId}/sddefault.${ext}`;case\"High Quality\":return`${pre}${videoId}/maxresdefault.${ext}`;default:return`${pre}${videoId}/0.${ext}`;}}// Helper components\nfunction Instructions(){return /*#__PURE__*/_jsx(\"div\",{style:{...emptyStateStyle,overflow:\"hidden\"},children:/*#__PURE__*/_jsx(\"div\",{style:centerTextStyle,children:\"To embed a Youtube video, add the URL to the properties\\xa0panel.\"})});}function ErrorMessage({message}){return /*#__PURE__*/_jsx(\"div\",{className:\"framerInternalUI-errorPlaceholder\",style:{...containerStyles,overflow:\"hidden\"},children:/*#__PURE__*/_jsxs(\"div\",{style:centerTextStyle,children:[\"Error: \",message]})});}function PlayButton({onClick,isHovered,isRed}){return /*#__PURE__*/_jsx(\"button\",{onClick:onClick,\"aria-label\":\"Play\",style:buttonStyle,children:/*#__PURE__*/_jsxs(\"svg\",{height:\"100%\",version:\"1.1\",viewBox:\"0 0 68 48\",width:\"100%\",children:[/*#__PURE__*/_jsx(\"path\",{d:\"M66.52,7.74c-0.78-2.93-2.49-5.41-5.42-6.19C55.79,.13,34,0,34,0S12.21,.13,6.9,1.55 C3.97,2.33,2.27,4.81,1.48,7.74C0.06,13.05,0,24,0,24s0.06,10.95,1.48,16.26c0.78,2.93,2.49,5.41,5.42,6.19 C12.21,47.87,34,48,34,48s21.79-0.13,27.1-1.55c2.93-0.78,4.64-3.26,5.42-6.19C67.94,34.95,68,24,68,24S67.94,13.05,66.52,7.74z\",fill:isHovered?isRed?\"#f00\":\"#000\":\"#212121\",fillOpacity:isHovered?isRed?1:.8:.8,style:{transition:\"fill .1s cubic-bezier(0.4, 0, 1, 1), fill-opacity .1s cubic-bezier(0.4, 0, 1, 1)\"}}),/*#__PURE__*/_jsx(\"path\",{d:\"M 45,24 27,14 27,34\",fill:\"#fff\"})]})});}const buttonStyle={position:\"absolute\",top:\"50%\",left:\"50%\",transform:\"translate(-50%, -50%)\",width:68,height:48,padding:0,border:\"none\",background:\"transparent\",cursor:\"pointer\"};const wrapperStyle={position:\"relative\",width:\"100%\",height:\"100%\"};const centerTextStyle={textAlign:\"center\",minWidth:140};const videoStyle={position:\"absolute\",top:0,left:0,height:\"100%\",width:\"100%\"};\nexport const __FramerMetadata__ = {\"exports\":{\"Youtube\":{\"type\":\"reactComponent\",\"name\":\"Youtube\",\"slots\":[],\"annotations\":{\"framerComponentPresetProps\":\"isRed, borderRadius\",\"framerSupportedLayoutHeight\":\"fixed\",\"framerContractVersion\":\"1\",\"framerIntrinsicHeight\":\"315\",\"framerSupportedLayoutWidth\":\"fixed\",\"framerIntrinsicWidth\":\"560\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./YouTube.map", "import{jsx as e,jsxs as t}from\"react/jsx-runtime\";import{ComponentPresetsConsumer as n,Link as o}from\"framer\";import{motion as a}from\"framer-motion\";import*as r from\"react\";import{Youtube as i}from\"https://framerusercontent.com/modules/NEd4VmDdsxM3StIUbddO/DDzyuYPF56TuI0bfUu2z/YouTube.js\";import s from\"https://framerusercontent.com/modules/pVk4QsoHxASnVtUBp6jr/HTBsNkEMAb7TUGaO3DBy/CodeBlock.js\";export const richText=/*#__PURE__*/t(r.Fragment,{children:[/*#__PURE__*/t(\"p\",{children:[\"Argo CD is a Continuous Delivery (CD) tool that has gained popularity in DevOps for performing application delivery onto Kubernetes. It relies on a deployment method known as \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/what-is-gitops\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"GitOps\"})}),\". GitOps is a mechanism that can pull the latest code and application configuration from the last known Git commit version and deploy it directly into Kubernetes resources. Its wide adoption and popularity are due to Argo CD helping developers manage infrastructure and application lifecycles in one platform.\\xa0 \"]}),/*#__PURE__*/t(\"p\",{children:[\"To understand Argo CD in-depth, we must first understand how \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/simplifying-kubernetes-ci-cd-pipelines/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Continuous Delivery\"})}),\" works for most application teams and how it differs from GitOps.\"]}),/*#__PURE__*/e(\"h2\",{children:\"What is Continuous Delivery?\"}),/*#__PURE__*/e(\"p\",{children:\"Continuous Delivery (CD) is a software delivery process/ framework that enables developers to continuously push their code changes into the production servers without accessing the infrastructure through a push-based pipeline. This process reduces the time a code takes to reach its end users and improves release velocity. It is a repeatable process that enables scaling your application to address the growing demands of end users.\"}),/*#__PURE__*/e(\"h2\",{children:\"How does Continuous delivery work?\"}),/*#__PURE__*/t(\"p\",{children:[\"Continuous delivery is a part of the application delivery lifecycle that deploys the application post-build into a resource. In this context, our infrastructure will be Kubernetes without the use of ArgoCD. Alternatively, if we use \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/what-is-jenkins-a-quick-guide-for-ci-cd-with-jenkins/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Jenkins\"})}),\", the process will be as follows.\"]}),/*#__PURE__*/t(\"ol\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"To release a feature upgrade or a bug fix to the end users, a pre-configured Continuous Integration (CI) pipeline will build a docker image as per the docker file.\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Then, a script will push it to the configured docker repository.\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"To move this image into Kubernetes, the \u201Cdeployment.YAML\u201D file will be updated with the new image tag and name for fetching the latest image from the Docker registry.\"})})]}),/*#__PURE__*/e(\"h2\",{children:\"Challenges with CD into Kubernetes?\"}),/*#__PURE__*/t(\"p\",{children:[\"Before the rise of Kubernetes, CD most applications teams enabled CD with tools like Jenkins and Spinnaker. The \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/kubernetes-architecture-the-ultimate-guide/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"architecture of Kubernetes\"})}),\" is complex, and these tools could not efficiently deploy into Kubernetes and deploy without errors due to the complexity of Kubernetes architecture. These issues made using tools like Jenkins challenging to work with Kubernetes.\"]}),/*#__PURE__*/e(\"p\",{children:\"Challenges with traditional CD while deploying into Kubernetes:\"}),/*#__PURE__*/t(\"ol\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"Tools installation and management: \"}),\"One needs to install tools like \u201CKubectl\u201D and \u201CHelm.\u201D These add to the operational activities.\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"Accessing Kubernetes Clusters:\"}),\" One must configure access management in the CD tool to enable authorization to Kubernetes clusters and execute changes. If Kubernetes clusters run on a cloud provider, those credentials must be configured and shared outside the cluster.\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"Security & Operational Challenges:\"}),\" The configurations will rise in proportion with the increase in clusters which increases operational overhead. While increased operational overheads may not be challenging, it risks the system's security when cluster credentials get shared with external services and tools.\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"Issues while scaling infrastructure:\"}),\" \u200DEach team needs its own set of Kubernetes cluster credentials so that the users can access that specific application resources in a cluster. While operating Kubernetes at scale with a CD tool like Jenkins deploying into multiple clusters needs reconfiguration again for each new cluster.\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"Lack of Visibility:\"}),\" \u200DWhen a CD tool deploys an application into Kubernetes without GitOps or a Kubernetes-native CICD pipeline, the tool loses visibility into the deployment post applying the configuration to the deployment.YAML files. Once the kubectl command has been executed team must wait until someone reports an incident. Also, the status of execution remains unclear.\"]})})]}),/*#__PURE__*/e(\"p\",{children:\"The continuous delivery into Kubenbrtes can be made efficient with Argo CD, which works on the principle of GitOps. Before understanding GitOps, let us understand Push vs. Pull based CI/CD in the upcoming section on GitOps.\"}),/*#__PURE__*/e(\"h2\",{children:\"What is GitOps and how is it different from traditional CD?\"}),/*#__PURE__*/e(\"p\",{children:\"Traditional CD and GitOps differ on the core principles of push and pull-based deployments. Most CI/CD processes work on a push mechanism, which means things move to their respective destination at the trigger of an event. For example, when a developer has finished writing his code, he must execute a set of commands to move his code into the server for deployment. In a Kubernetes environment, the developer has to configure the clusters using tools like Kubectl and Helm in the pipeline to apply changes.\"}),/*#__PURE__*/e(\"p\",{children:\"Argo is a CD tool that uses a pull-based mechanism. A pull-based CD mechanism means the destination triggers an event to pull the data from the source(git)\\xa0 to deploy at the destination. Argo CD, which resided inside the cluster for reasons explained later on the blog, pulls the most recent verified version of code into the cluster for deployment. There are a lot of benefits to this model, like improved security and ease of use.\"}),/*#__PURE__*/t(\"p\",{children:[\"This pull-based mechanism is called \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/an-introduction-to-gitops/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"GitOps\"})}),\", where source code management systems like Git are treated as the only source of truth for application and configuration data.GitO\"]}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"411\",src:\"https://framerusercontent.com/images/9H0fUbmjanT9a6a7l8xXEPwhsg.png\",srcSet:\"https://framerusercontent.com/images/9H0fUbmjanT9a6a7l8xXEPwhsg.png?scale-down-to=512 512w,https://framerusercontent.com/images/9H0fUbmjanT9a6a7l8xXEPwhsg.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/9H0fUbmjanT9a6a7l8xXEPwhsg.png 1600w\",style:{aspectRatio:\"1600 / 823\"},width:\"800\"}),/*#__PURE__*/e(\"h2\",{children:\"How does Argo CD work?\"}),/*#__PURE__*/t(\"p\",{children:[\"Argo CD works in a reversed flow mechanism as compared to push-style deployments. The new mechanism enables ArgoCD to run from inside a Kubernetes cluster. Kubernetes faces challenges with the traditional\\xa0 CD mechanism because CI/CD tools, like Jenkins, sit outside the cluster, whereas Argo CD sits inside the cluster. While inside the cluster, Argo CD pulls changes from git and applies them to the residing cluster. Instead of pushing changes like older generation tools by being inside the cluster, ArgoCD prevents sensitive information from being exposed to other tools outside the Kubernetes cluster and environment. ArgoCD can be combined with a \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/kubernetes-ci-cd-pipelines-with-jenkins-and-argocd/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"CI tool such as Jenkins\"})}),\".\"]}),/*#__PURE__*/e(\"p\",{children:\"Argo CD can be set up in two simple steps.\"}),/*#__PURE__*/t(\"ol\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Deploy the ArgoCD agent to the cluster.\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Configure Argo CD to track a Git repository for changes.\"})})]}),/*#__PURE__*/t(\"p\",{children:[\"When \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/deploy-apps-across-clusters-using-argo-cd/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Argo CD\"})}),\" monitors change, it automatically applies them to the Kubernetes cluster. When developers commit the new code updates to the Git repository, automated CI pipelines will auto-start the build process and build the container image. Then as per the configurations, the CI pipeline will push and update the Kubernetes manifest files. The pipelines will update the new image version name and details on the `deployment.yaml` file. Argo CD can track this new update, pull the image, and deploy it onto the target cluster.\"]}),/*#__PURE__*/e(\"p\",{children:\"When the Kubernetes cluster is ready, Argo CD sends a report about the status of the application and that the synchronization is complete and correct. ArgoCD also works in the other direction, monitoring changes in the Kubernetes cluster and discarding them if they don\u2019t match the current configuration in Git.\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"444\",src:\"https://framerusercontent.com/images/feKL5kECSDNgqjJQQOYUxaJcLYQ.png\",srcSet:\"https://framerusercontent.com/images/feKL5kECSDNgqjJQQOYUxaJcLYQ.png?scale-down-to=512 512w,https://framerusercontent.com/images/feKL5kECSDNgqjJQQOYUxaJcLYQ.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/feKL5kECSDNgqjJQQOYUxaJcLYQ.png 1600w\",style:{aspectRatio:\"1600 / 889\"},width:\"800\"}),/*#__PURE__*/e(\"h2\",{children:\"Best Practices to follow while using Argo CD\"}),/*#__PURE__*/t(\"ol\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Separate git repositories for application source code and apps configuration\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Separate git repo for system configurations.\"})})]}),/*#__PURE__*/e(\"h2\",{children:\"Why separate repositories?\"}),/*#__PURE__*/e(\"p\",{children:\"The main reason for having separate repositories for application source code and app configurations is because app config code is not only present in the deployment file but also in the configmaps, secrets, storage, svc, etc. Kubernetes uses. These files change independently from the source code.\"}),/*#__PURE__*/e(\"p\",{children:\"When a Developer or DevOps wants to change a `service.yaml` file, which is an application configuration and not a part of the software code, he has to run the whole CI pipeline to sync those changes into production. The CI pipeline will run only when a code change is updated. Clubbing the app configurations and software code together makes the setup complex and inefficient.\"}),/*#__PURE__*/e(\"p\",{children:\"So as soon as DevOps changes the config on the git repository, Argo CD will become aware of the changes and update the destination cluster as it constantly monitors the repo as soon as config files change in the Git repository.\"}),/*#__PURE__*/e(\"h2\",{children:\"Benefits of using Argo CD\"}),/*#__PURE__*/t(\"ul\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"K8s configurations can be defined as code in the git repository\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Config files are not applied for individual laptops of developers / DevOps\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Updates are traceable as tags, branches, or pinned specific manifest versions at Git commits.\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Same and only interface for updating the cluster.\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Git as the single source of truth\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Avoid untrackable kubectl command applications\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Version-controlled changes with audit trail\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Single sign-on (SSO) with providers such as GitLab, GitHub, Microsoft, OAuth2, OIDC, LinkedIn, LDAP, and SAML 2.0\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Support for webhooks triggering actions in GitLab, GitHub, and BitBucket.\"})})]}),/*#__PURE__*/e(\"h3\",{children:\"Easy rollbacks\"}),/*#__PURE__*/e(\"p\",{children:\"If a new code commit is pushed into the git repository and the changes are applied to the cluster with Arog CD auto sync, the cluster fails. DevOps can revert to the previous working state from the list of the last known best repository versions, just like a Windows restore point. Also, one need not process the laborious process of manually riveting every cluster and doing a clean-up, as Argo CD will do that all by itself.\"}),/*#__PURE__*/e(\"h3\",{children:\"Avoid snowflake clusters with Argo CD\"}),/*#__PURE__*/e(\"p\",{children:\"Argo CD is watching the git repository and changes in the cluster. Anytime a change happens in the git repository or the cluster, Argo CD will compare the two states to check for any misconfigurations or differences. If they don't match the desired state defined in the git repo with the actual state of the cluster, Argo CD will become active and quickly sync the cluster as described in the cluster. So, in that case, if someone goes and makes manual changes in the cluster, Argo CD will detect it and sync to the desired state. It overrides the manual changes.\"}),/*#__PURE__*/e(\"p\",{children:\"The automatic override helps the system stay stable and guarantees that the git repository is the only source of truth at any point in time. It also provides full transparency of the cluster and lets it become a snowflake cluster.\"}),/*#__PURE__*/e(\"h3\",{children:\"Recreate clusters from scratch\"}),/*#__PURE__*/e(\"p\",{children:\"When a cluster completely crashes, and one has to build it from scratch, Argo CD can be pointed to the git repository, where the complete cluster configuration is defined. It will recreate the same state as the previous one. This is a fully autonomous process where developers and DevOps do not have to worry about disaster recovery post-clean-up processes. This is possible because Argo CD accepts the cluster configuration as code in a declarative way.\"}),/*#__PURE__*/e(\"h2\",{children:\"What does Argo CD provide over standard GitOps benefits?\"}),/*#__PURE__*/e(\"h3\",{children:\"Better team collaboration with easy access control\"}),/*#__PURE__*/e(\"p\",{children:\"Production clusters must have limited access, and only some of your team members should be allowed access. To configure different access rules to these clusters, Argo CD can enable approvals for pull requests for authorized developers and engineers. This helps in managing the cluster permissions. No need to create cluster role and user account on Kubernetes.\"}),/*#__PURE__*/e(\"h3\",{children:\"Better team collaboration with easy access control\"}),/*#__PURE__*/e(\"p\",{children:\"Non-human users like CICD tools or other peripheral tools in the DevOps ecosystem outside the cluster can be configured in Argo CD, which resides inside the cluster. This architecture of Argo CD ensures that those credentials remain inside the cluster making the system robust and secure.\"}),/*#__PURE__*/e(\"h2\",{children:\"Argo CD architecture overview\"}),/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/deploy-apps-across-clusters-using-argo-cd/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Argo CD is a Kubernetes native CD\"})}),\" tool that supports and reads various Kubenrtes manifest files such as YAML, Ksonnet, Jsonnet, Helm charts, and Kustomize. It can follow updates to branches, tags, or pinned to a specific version of manifests at a Git commit.\"]}),/*#__PURE__*/e(\"p\",{children:\"Argo CD control plane consists of three main components:\"}),/*#__PURE__*/t(\"ul\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Application Controller\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"API Server\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Repository Service\"})})]}),/*#__PURE__*/e(\"h3\",{children:\"Repository Service\"}),/*#__PURE__*/e(\"p\",{children:\"Accessing the Git repository is always time-consuming for Argo CD; accessing the git Repo every time will constitute a pull request. Hence, this internal Repository Service makes a local cache of the application manifest and Git repositories on the Kubernetes cluster a replica of the git repository. It is responsible for generating and returning Kubenrtees manifests on input data like repository URL, Git revisions( branch, tags), application path, and template-specific settings; the server generates Kubernetes manifests.\"}),/*#__PURE__*/e(\"h3\",{children:\"Application Controller\"}),/*#__PURE__*/e(\"p\",{children:\"Argo CD can detect changes in Git and sync with the repo due to the Application Controller component. This feature enables syncing out-of-date or modified destination configurations to the last approved git version. The application controller syncs between the local cache created by the Repo service and the git repository because it is a less resource-intensive process.\\xa0 The application controller can also be configured to accept direct changes in code and configuration at the destination without reverting back to the last known configuration on Git. This authority must be granted only to a selected team resource. When this direct change is made it notifies the DevOps and developers about the difference in the configuration to update the Git repositories.\"}),/*#__PURE__*/e(\"h3\",{children:\"API Server\"}),/*#__PURE__*/e(\"p\",{children:\"The API server, like a Kubernetes API server, is a service to expose the components of Kubernetes and ArgoCD to interfaces like a CLI or web GUI or other third-party tools. The APIs are primarily used to carry out functionalities like:\"}),/*#__PURE__*/t(\"ul\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Application deployment and management\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Executing rollback on user-defined actions\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Managing cluster credentials stored in K8s secrets\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Enforcing RBAC\"})})]}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"598\",src:\"https://framerusercontent.com/images/MtxGWMvyKwpHWJ051riypBuiRLE.png\",srcSet:\"https://framerusercontent.com/images/MtxGWMvyKwpHWJ051riypBuiRLE.png?scale-down-to=512 512w,https://framerusercontent.com/images/MtxGWMvyKwpHWJ051riypBuiRLE.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/MtxGWMvyKwpHWJ051riypBuiRLE.png 2000w\",style:{aspectRatio:\"2000 / 1196\"},width:\"1000\"})]});export const richText1=/*#__PURE__*/t(r.Fragment,{children:[/*#__PURE__*/e(\"p\",{children:\"GitOps is a software delivery philosophy that treats source code management systems like Git as the single source of truth for applications, application configuration, and infrastructure configurations. The idea is that all the changes to an application or infrastructure are stored in Git and synchronized with the target environment in real time through frequent reconciliation.\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"115\",src:\"https://framerusercontent.com/images/wgSYZJKc2aLl7zzAI76MaqLrwl4.png\",srcSet:\"https://framerusercontent.com/images/wgSYZJKc2aLl7zzAI76MaqLrwl4.png?scale-down-to=512 512w,https://framerusercontent.com/images/wgSYZJKc2aLl7zzAI76MaqLrwl4.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/wgSYZJKc2aLl7zzAI76MaqLrwl4.png 1080w\",style:{aspectRatio:\"1080 / 230\"},width:\"540\"}),/*#__PURE__*/e(\"h2\",{children:\"Difference between GitOps and DevOps?\"}),/*#__PURE__*/e(\"p\",{children:\"Very often IT folks get confused about the two terminologies and assume GitOps is perhaps an advanced version of DevOps. However, there are differences between the two and we will see how the industry needs both GitOps and DevOps to succeed in their software delivery.\"}),/*#__PURE__*/e(\"p\",{children:\"DevOps methodology is applied to bring more collaboration between software development and operations teams with the ultimate goal of reducing the time and cost of the software delivery life cycle (SDLC) process. The central idea of DevOps existed in the 1990s but the name was coined and the industry started using it in the late 2000s.\"}),/*#__PURE__*/t(\"p\",{children:[\"On the other hand, \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/an-introduction-to-gitops/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"GitOps was coined\"})}),\" in 2017 by Weaveworks along with the emergence of Docker, containers, Kubernetes, and the concept of Infrastructure as code (IAC). The goal of the GitOps philosophy is to reduce configuration drift and practice continuous deployments into multiple environments with less human intervention. \u200D\"]}),/*#__PURE__*/e(\"p\",{children:\"In a nutshell, DevOps aims to improve the whole SDLC process which would involve a lot of tools and software along with inculcating the culture through frequent training to developers and Ops team, while GitOps aims to fasten the deployment activity (a sub-process of SDLC) using a one or two tools.\"}),/*#__PURE__*/e(\"h2\",{children:\"Six golden principles to practice GitOps\"}),/*#__PURE__*/t(\"p\",{children:[\"If you want to start implementing the GitOps process for your Kubernetes application delivery then you need to follow the six major principles of GitOps and its \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/gitops-best-practices/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"best practices\"})}),\". Note, that we have extended four principles by Weaveworks to six principles based on our experience with large-scale implementation\"]}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"394\",src:\"https://framerusercontent.com/images/Y2iadFjsaxl7FwxgkEvO6yw1wCI.png\",srcSet:\"https://framerusercontent.com/images/Y2iadFjsaxl7FwxgkEvO6yw1wCI.png?scale-down-to=512 512w,https://framerusercontent.com/images/Y2iadFjsaxl7FwxgkEvO6yw1wCI.png 940w\",style:{aspectRatio:\"940 / 788\"},width:\"470\"}),/*#__PURE__*/e(\"ol\",{children:/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"h2\",children:/*#__PURE__*/e(\"h2\",{children:\"Declarative Configurations for Resources\"})})}),/*#__PURE__*/e(\"p\",{children:\"Every object in the tech stack i.e. apps and infrastructure should be described declaratively. Storing infrastructure configuration in a declarative state using YAML or JSON will help trace the list of items changed and their related impact on the production or customer experience. One can store deployments, load balancers, API gateway configurations, traffic management rules, and security policies in Git and maintain them. The benefit of using declarative configuration instead of scripts or commands is Ops team can avoid configuration drifts in their environments.\"}),/*#__PURE__*/e(\"ol\",{start:\"2\",children:/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"h2\",children:/*#__PURE__*/e(\"h2\",{children:\"Version Control\"})})}),/*#__PURE__*/e(\"p\",{children:\"The second principle of GitOps is to store all the declarative configurations in a version control management system such as Git. Apart from having a single source of truth for application and infrastructure configuration changes, using version control is also helpful for maintaining the version history of configuration changes of all resources across environments and projects. Another great benefit of keeping everything in a version control system is reverting your changes to previous versions, in case of issues, with a single click of a button.\"}),/*#__PURE__*/e(\"ol\",{start:\"3\",children:/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"h2\",children:/*#__PURE__*/e(\"h2\",{children:\"Continuous Deployments\"})})}),/*#__PURE__*/t(\"p\",{children:[\"It is essential to ensure that all the configuration changes that are merged with the master branch in your version control system i.e Git, are immediately automatically picked up and deployed into the target Kubernetes cluster. Tools such as \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/deploying-apps-with-argocd-and-cicd/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Devtron, and Argo CD\"})}),\" monitor repositories at frequent intervals of time, and in case of any new change configurations (declared state) are deployed and automatically to the target environment (desired state). This process deployment without any human intervention is also called continuous deployment.\"]}),/*#__PURE__*/e(\"ol\",{start:\"4\",children:/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"h2\",children:/*#__PURE__*/e(\"h2\",{children:\"Continuous Reconciliation\"})})}),/*#__PURE__*/t(\"p\",{children:[\"One of the most important functions of deploying applications using GitOps is that the state of the cluster will always match the state of the Git repository. If the state of the cluster does not match the state of the manifests present in the Git repository, the GitOps tool will automatically reconcile the differences and ensure that both states match. Different GitOps tools such as \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/gitops-tool-selection-argo-cd-or-flux-cd/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"ArgoCD and FluxCD\"})}),\" have different mechanisms for reconciliation.\\xa0\"]}),/*#__PURE__*/e(\"ol\",{start:\"5\",children:/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"h2\",children:/*#__PURE__*/e(\"h2\",{children:\"Integration of GitOps with CI/CD process\"})})}),/*#__PURE__*/t(\"p\",{children:[\"GitOps cannot work in silo or as a disjointed functionality, but rather it has to be made a part of the overall CI/CD process. \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/adding-gitops-to-ci-cd-pipelines/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"GitOps tool should be integrated with the CI/CD\"})}),\" toolchain and should be customized to ensure security, safety, and speed of deployments are not compromised.\"]}),/*#__PURE__*/e(\"ol\",{start:\"6\",children:/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"h2\",children:/*#__PURE__*/e(\"h2\",{children:\"Visibility and Control\"})})}),/*#__PURE__*/e(\"p\",{children:\"Finally, GitOps is like any other paradigm shift to help enterprises release more applications into the market quickly and frequently. To adopt and scale GitOps style delivery, a single plane for visibility and control is essential to visualize the deployment changes across the Kubernetes cluster, and also practice safety in the release process. A central control plane will help in configuring rollout and rollback strategies easily.\"}),/*#__PURE__*/e(\"h2\",{children:\"Why is GitOps very popular?\"}),/*#__PURE__*/t(\"p\",{children:[\"Kubernetes has become, by far, the most accepted and widely used container orchestration platform. Although Kubernetes provides a lot of benefits, users need learning and training before they can completely adopt Kubernetes. There are many organizations where developers and testers don\u2019t care to learn Kubernetes as it is not their core activity. Secondly, there are many flavors of managed Kubernetes offered by cloud providers and independent companies such as AWS EKS, Google Kubernetes, Azure Kubernetes, \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/rancher-kubernetes-a-quick-installation-guide-for-rke2/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Rancher Kubernetes\"})}),\", Red Hat OpenShift, Mirantis Kubernetes, etc.\"]}),/*#__PURE__*/e(\"p\",{children:\"This aversion of developers to learning Kubernetes and commands, and writing deployment configurations made the Kubernetes deployments very slow. That\u2019s where the idea of GitOps was born to continuously check off new and approved app or infra changes and constantly deploy into the target cluster with less human intervention.\"}),/*#__PURE__*/e(\"h2\",{children:\"Who should use GitOps?\"}),/*#__PURE__*/t(\"p\",{children:[\"Any organization using Kubernetes as their infrastructure for their applications can and should use GitOps. Since GitOps is all about deploying the application to the cluster and nothing else, it can be used by small, mid, and large enterprises. When it comes to the software department, the developers, DevOps engineers (or release engineers), and SREs are the ones who will benefit the most from \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/gitops-best-practices/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"GitOps implementation\"})}),\".\"]}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"487\",src:\"https://framerusercontent.com/images/SHM3YviwXGdXWrR8xKeupxmiM.png\",srcSet:\"https://framerusercontent.com/images/SHM3YviwXGdXWrR8xKeupxmiM.png?scale-down-to=512 512w,https://framerusercontent.com/images/SHM3YviwXGdXWrR8xKeupxmiM.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/SHM3YviwXGdXWrR8xKeupxmiM.png 1600w\",style:{aspectRatio:\"1600 / 974\"},width:\"800\"}),/*#__PURE__*/e(\"p\",{children:\"Before GitOps a DevOps engineer would take the new image and create configuration (manifest files or HELM Charts) for deployment. Even though deployment was done using a pipeline using tools such as Spinnaker or Jenkins, a manual intervention was needed.\\xa0\"}),/*#__PURE__*/e(\"p\",{children:\"After GitOps, an agent would monitor the change in the Docker Hub repository and automatically update the manifest file. The manifest file will be updated in the environment repository (say in Git or Bitbucket). The GitOps agent would take the updated manifest files or HELM charts and apply them to the target cluster. This is a very simple explanation of the integration of the GitOps method with the CI/CD process. The actual implementation may be very complicated based on the SDLC policies and stages. For e.g. the deployment may happen to test, pre-prod, and finally production cluster using GitOps tools. And GitOps methods can be invoked in the CI/CD pipeline.\"}),/*#__PURE__*/e(\"h2\",{children:\"Key Benefits of GitOps\"}),/*#__PURE__*/e(\"p\",{children:\"There are several benefits of using GitOps methodology when used for deploying Kubernetes applications.\"}),/*#__PURE__*/t(\"ul\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"More time for innovation:\"}),\" Developers and Engineers are relieved from updating changes to Kubernetes configuration every time, they will have to deal with less context switching and more time to focus on their core activities.\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"Faster time to market: \"}),\"With less manual intervention in deployment with GitOps methodology, developers can release more features to the market quickly and frequently.\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"Zero downtime with instant rollback:\"}),\" Since all the configurations are stored and versioned in Git, the application can be rolled back to the previous version instantaneously without causing unnecessary service unavailability.\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"Single source of truth for almost all the changes:\"}),\" By storing applications, infrastructure, deployments, network, and security policies in a single place, the manageability increases by many folds\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"Audit trail to identify breaches:\"}),\" When GitOps style deployment is practiced using Git to store environment configuration and manage the Kubernetes cluster, the DevOps team will get a complete audit trail of every change- who, what, how, and when of every change. The audit is particularly beneficial to analyze what went wrong and optimize the deployment process further.\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"More visibility into software deployment:\"}),\" By using Git for environment configuration and GitOps software for deployment, there will be more data and insights available w.r.t application, deployments, Kubernetes clusters, namespaces, etc.\"]})})]}),/*#__PURE__*/e(\"h2\",{children:\"Open source tools for GitOps deployment\"}),/*#__PURE__*/e(\"p\",{children:\"There are several open-source tools available with which one can get started with GitOps-style deployments for Kubernetes. The famous and widely-accepted GitOps tools are:\"}),/*#__PURE__*/e(\"h3\",{children:\"Devtron\"}),/*#__PURE__*/t(\"p\",{children:[\"Comparatively, the youngest Kubernetes-native open-source platform was founded in 2020 to implement GitOps, but Devtron is gradually becoming famous. It offers an intuitive UI and is the one-stop-shop solution for \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/deploying-apps-with-argocd-and-cicd/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"deploying Kubernetes apps using CI/CD pipelines and GitOps\"})}),\". Devtron also provides its own \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/manage-kubernetes-like-a-pro-with-kubernetes-dashboard-by-devtron/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Dashboard for visibility\"})}),\" into Kubernetes resources, deployment, \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/introduction-to-helm/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"HELM charts\"})}),\", and take any action such as Rollback or configure rollout strategies such as canary and blue/green.\"]}),/*#__PURE__*/e(\"h3\",{children:\"ArgoCD\"}),/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/deploy-apps-across-clusters-using-argo-cd/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Argo CD\"})}),\" was started in 2018 and is perhaps the most popular GitOps tool now. The Argo project of which the Argo CD is a part, has other applications to offer- Argo Workflow, Argo Notification, Argo Rollouts, and Argo Events- to transform the Kubernetes delivery. Argo is a CNCF graduate project.\"]}),/*#__PURE__*/e(\"h3\",{children:\"Flux CD\"}),/*#__PURE__*/t(\"p\",{children:[\"Flux CD was initially created by Weaveworks and has since become a Cloud Native Computing Foundation (CNCF) project with an Apache 2.0 license on GitHub. It is an open-source Continuous Delivery tool for automated Git-based Kubernetes deployments. It uses a declarative approach to manage Kubernetes deployments using Git repositories to store application configurations. Check out how \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/gitops-tool-selection-argo-cd-or-flux-cd/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"ArgoCD and FluxCD\"})}),\" differ from each other.\"]}),/*#__PURE__*/e(\"h3\",{children:\"Jenkins X\"}),/*#__PURE__*/e(\"p\",{children:\"Jenkins X was introduced around 2018 as an extension of Jenkins. Jenkins provides GitOps functionalities and also natively supports integration with Tekton CI/CD pipelines for deployment. Of late, the project has seen very less contributions from the community.\"}),/*#__PURE__*/e(\"h2\",{children:\"Conclusion\"}),/*#__PURE__*/e(\"p\",{children:\"GitOps is a modern deployment paradigm that helps accelerate the deployment velocity across various Kubernetes environments. Multiple different tools can help implement GitOps practices such as ArgoCD and FluxCD. Due to the technical challenges associated with Kubernetes deployments, traditional tools often fall short when trying to create a robust CI/CD pipeline.\"}),/*#__PURE__*/e(\"p\",{children:\"GitOps fills the gaps between the CI and CD pipelines and helps deploy the application to multiple Kubernetes environments, keep an entire audit log, as well as ensure that the configuration being deployed have been verified and tested.\"})]});export const richText2=/*#__PURE__*/t(r.Fragment,{children:[/*#__PURE__*/e(\"p\",{children:\"Kubernetes provides a command line (CLI) component called \u201Ckubectl\u201D for carrying out core operations like managing application deployments, releasing updates, managing traffic provisioning storage, and much more. But there are two significant hurdles to using CLI enterprise-wide:\"}),/*#__PURE__*/t(\"ul\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"The high learning curve for developers to adopt Kubernetes for deployment.\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Time-consuming and frustrating work for SREs and Ops team to monitor and troubleshoot multiple clusters at scale.\"})})]}),/*#__PURE__*/t(\"p\",{children:[\"Dashboard by Kubernetes ( also known as Kubernetes Dashboard) is a web-based user interface to deploy applications into the Kubernetes cluster, monitor the health of all the resources, and troubleshoot them in case of any issues. The application is helpful for DevOps, Ops, and SRE teams to manage \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/what-are-kubernetes-workloads/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Kubernetes resources\"})}),\" such as \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/deployment-vs-statefulset/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!0,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Deployments vs Statefulsets\"})}),\", Jobs, etc. One can quickly deploy an application using manifest files and update the help from the UI itself.\"]}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"640\",src:\"https://framerusercontent.com/images/KnQAHZLWuPEoEUdX6cNN1F0mBq0.png\",srcSet:\"https://framerusercontent.com/images/KnQAHZLWuPEoEUdX6cNN1F0mBq0.png?scale-down-to=512 512w,https://framerusercontent.com/images/KnQAHZLWuPEoEUdX6cNN1F0mBq0.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/KnQAHZLWuPEoEUdX6cNN1F0mBq0.png?scale-down-to=2048 2048w,https://framerusercontent.com/images/KnQAHZLWuPEoEUdX6cNN1F0mBq0.png 2320w\",style:{aspectRatio:\"2320 / 1281\"},width:\"1160\"}),/*#__PURE__*/e(\"h2\",{children:\"Features of Kubernetes Dashboard\"}),/*#__PURE__*/e(\"p\",{children:\"Kubernetes Dashboard is compelling for the DevOps team because of two primary features:Cluster-wide visibility and troubleshooting.UI-based deployment.\"}),/*#__PURE__*/e(\"h3\",{children:\"Cluster-wide visibility and troubleshooting\"}),/*#__PURE__*/t(\"p\",{children:[\"The Kubernetes Dashboard will provide a view of various running workloads and their total count. DevOps engineers will get the visibility of workloads, \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/understanding-kubernetes-services/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"services\"})}),\", \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/kubernetes-configmaps-secrets/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"configurations\"})}),\" and \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/kubernetes-storage-made-easy-kubernetes-volumes-persistent-volumes/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"storage\"})}),\", and cluster view.\"]}),/*#__PURE__*/e(\"h3\",{children:\"Workload view\"}),/*#__PURE__*/t(\"p\",{children:[\"Under the workload view, users will get the details of workload resources such as Deployments, Pods, ReplicaSets, DaemonSets, Job, and StatefulSet running in all the namespaces of a cluster. One can also perform a granular search based on a particular namespace in a cluster. Getting a visual representation of these different workloads helps in \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/kubernetes-dashboard-for-application-management/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"managing various applications\"})}),\" deployed on the cluster.\"]}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"463\",src:\"https://framerusercontent.com/images/TrrKTlGD4n2M1WM2tLHEXq8U.png\",srcSet:\"https://framerusercontent.com/images/TrrKTlGD4n2M1WM2tLHEXq8U.png?scale-down-to=512 512w,https://framerusercontent.com/images/TrrKTlGD4n2M1WM2tLHEXq8U.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/TrrKTlGD4n2M1WM2tLHEXq8U.png 1950w\",style:{aspectRatio:\"1950 / 926\"},width:\"975\"}),/*#__PURE__*/e(\"h3\",{children:\"Pods view\"}),/*#__PURE__*/e(\"p\",{children:\"One of the most important aspects of workloads can be the number of pods running in a specific node and its respective namespace.\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"466\",src:\"https://framerusercontent.com/images/AtPzMMYVYAYZrDHJvkPxuGJWyPE.png\",srcSet:\"https://framerusercontent.com/images/AtPzMMYVYAYZrDHJvkPxuGJWyPE.png?scale-down-to=512 512w,https://framerusercontent.com/images/AtPzMMYVYAYZrDHJvkPxuGJWyPE.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/AtPzMMYVYAYZrDHJvkPxuGJWyPE.png 1950w\",style:{aspectRatio:\"1950 / 933\"},width:\"975\"}),/*#__PURE__*/t(\"ul\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Users will get drilled-down information about a pod, such as:\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Metadata about labels and annotations.\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Resource consumption \u2013 CPU and memory utilization.\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Date of creation and number of restarts.Events logs and persistent volume claim.\"})})]}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"384\",src:\"https://framerusercontent.com/images/qsD1qYfh7ymn2sowsRAoLpKHxg.png\",srcSet:\"https://framerusercontent.com/images/qsD1qYfh7ymn2sowsRAoLpKHxg.png?scale-down-to=512 512w,https://framerusercontent.com/images/qsD1qYfh7ymn2sowsRAoLpKHxg.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/qsD1qYfh7ymn2sowsRAoLpKHxg.png 1600w\",style:{aspectRatio:\"1600 / 768\"},width:\"800\"}),/*#__PURE__*/t(\"p\",{children:[\"Similarly, Kubernetes Dashboard also provides an aggregated view of namespaces and a detailed view of services & ingress objects, configmaps, network policies, secrets, and persistent volume claims in a namespace. Visibility into these resources can help with \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/kubernetes-dashboard-for-cluster-management/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"cluster management\"})}),\".\"]}),/*#__PURE__*/e(\"h3\",{children:\"Service and Ingress view\"}),/*#__PURE__*/e(\"p\",{children:\"Kubernetes Dashboard provides visibility about running Services and Ingress objects, including the namespace each Service or ingress belongs to, their labels, and Cluster IP. Users can get far more drilled-down information about each Service, such as labels, pods, endpoints, etc.\"}),/*#__PURE__*/e(\"h3\",{children:\"Configuration and storage view\"}),/*#__PURE__*/t(\"p\",{children:[\"Kubernetes Dashboard provides visibility about running Services and \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/setup-ingress-for-an-application-with-devtron/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Ingress\"})}),\" objects, including the namespace each Service or ingress belongs to, their labels, and Cluster IP. Users can get far more drilled-down information about each Service, such as labels, pods, endpoints, etc.\"]}),/*#__PURE__*/e(\"h3\",{children:\"UI-based Deployment\"}),/*#__PURE__*/e(\"p\",{children:\"The Kubernetes Dashboard allows you to deploy any (workload) resources from the UI. You can create manifest files in the browser, or you can upload your manifest files from a source such as Git. And the Kubernetes Dashboard will directly communicate with the Kubernetes controller to get an object of a resource created for you. In the below example, we have created a manifest file to create a pod with NGINX 1.19.0 image to create a pod.\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"384\",src:\"https://framerusercontent.com/images/qsD1qYfh7ymn2sowsRAoLpKHxg.png\",srcSet:\"https://framerusercontent.com/images/qsD1qYfh7ymn2sowsRAoLpKHxg.png?scale-down-to=512 512w,https://framerusercontent.com/images/qsD1qYfh7ymn2sowsRAoLpKHxg.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/qsD1qYfh7ymn2sowsRAoLpKHxg.png 1600w\",style:{aspectRatio:\"1600 / 768\"},width:\"800\"}),/*#__PURE__*/e(\"h2\",{children:\"Kubernetes Dashboard Architecture\"}),/*#__PURE__*/e(\"p\",{children:\"Kubernetes Dashboard is an external service developed on top of Kubernetes architecture. Under the hood, the Dashboard uses APIs to read all cluster-wide information for visibility into a single pane. It also uses the APIs to deploy resources and applications into a cluster. Both CLI and Kubernetes Dashboards depend on the kube-API-server to process the requests. To get started with the CLI, the Ops team must deploy the Kubernetes Dashboard in the same cluster (similar to Kubectl deployment).\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"562\",src:\"https://framerusercontent.com/images/G6Il0HPU56Q5B8TQ6Ae2V6jXTk.png\",srcSet:\"https://framerusercontent.com/images/G6Il0HPU56Q5B8TQ6Ae2V6jXTk.png?scale-down-to=512 512w,https://framerusercontent.com/images/G6Il0HPU56Q5B8TQ6Ae2V6jXTk.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/G6Il0HPU56Q5B8TQ6Ae2V6jXTk.png 2000w\",style:{aspectRatio:\"2000 / 1125\"},width:\"1000\"}),/*#__PURE__*/e(\"h2\",{children:\"Getting started with Kubernetes Dashboard\"}),/*#__PURE__*/e(\"p\",{children:\"To get started with Kubernetes Dashboard, you need to run the following commands in your cluster.\"}),/*#__PURE__*/e(\"h3\",{children:\"Step 1: Deploy Kubernetes Dashboard\"}),/*#__PURE__*/e(\"p\",{children:\"The Kubernetes dashboard can only be installed with Helm. Please ensure that you have Helm installed and run the below commands:\"}),/*#__PURE__*/e(\"div\",{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/HTBsNkEMAb7TUGaO3DBy/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(s,{...t,code:\"helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboard/\\nhelm upgrade --install kubernetes-dashboard kubernetes-dashboard/kubernetes-dashboard --create-namespace --namespace kubernetes-dashboard\",language:\"Shell\"})})}),/*#__PURE__*/e(\"p\",{children:\"To access the Kubernetes Dashboard from the local machine, one can create a secure channel to access the K8s cluster by running the following command:\"}),/*#__PURE__*/e(\"div\",{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/HTBsNkEMAb7TUGaO3DBy/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(s,{...t,code:\"kubectl proxy\",language:\"Shell\"})})}),/*#__PURE__*/t(\"p\",{children:[\"You can access your Dashboard using the following URL: \",/*#__PURE__*/e(o,{motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/\"})})]}),/*#__PURE__*/e(\"h3\",{children:\"Step 2: Create a Service Account\"}),/*#__PURE__*/e(\"p\",{children:\"The Kubernetes Dashboard is installed with minimal RBAC permissions, so you can access the Dashboard using a bearer token. So you can create a service account and bind it to a cluster with admin rights. You can use the following service account yaml file:\"}),/*#__PURE__*/e(\"div\",{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/HTBsNkEMAb7TUGaO3DBy/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(s,{...t,code:\"apiVersion: v1\\nkind: ServiceAccount\\nmetadata:\\n  name: admin-user\\n  namespace: kubernetes-dashboard\",language:\"YAML\"})})}),/*#__PURE__*/e(\"p\",{children:\"Make service resources by using the command:\"}),/*#__PURE__*/e(\"div\",{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/HTBsNkEMAb7TUGaO3DBy/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(s,{...t,code:\"kubectl - apply -f  serviceaccount.yaml\",language:\"Shell\"})})}),/*#__PURE__*/e(\"p\",{children:\"You can use the following ClusterRoleBinding.YAML to make the service account as cluster-admin:\"}),/*#__PURE__*/e(\"div\",{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/HTBsNkEMAb7TUGaO3DBy/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(s,{...t,code:\"apiVersion: v1\\nkind: ClusterRoleBinding\\nmetadata:\\n  name: admin-user\\nroleRef:\\n  apiGroup: rbac.authorization.k8s.io\\n  kind: ClusterRole\\n  name: cluster-admin\\nsubjects:\\n  kind: ServiceAccount\\n  name: admin-user\\n  namespace: kubernetes-dashboard\",language:\"YAML\"})})}),/*#__PURE__*/e(\"p\",{children:\"Similarly, apply the YAML file to create a ClusterRoleBinding resource in your cluster.\"}),/*#__PURE__*/e(\"h3\",{children:\"Step 3: Generate Bearer Token\"}),/*#__PURE__*/e(\"p\",{children:\"Use the command to generate the bearer token\"}),/*#__PURE__*/e(\"div\",{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/HTBsNkEMAb7TUGaO3DBy/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(s,{...t,code:\"kubectl -n kubernetes-dashboard create token admin-user\",language:\"JSX\"})})}),/*#__PURE__*/e(\"h3\",{children:\"Step 4: Use the token and get started with the Dashboard\"}),/*#__PURE__*/e(\"p\",{children:\"You can paste the bearer token to get started with Kubernetes Dashboard.\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"357\",src:\"https://framerusercontent.com/images/zgHVsKvKGs51UhR3tWRVwqlWfs.png\",srcSet:\"https://framerusercontent.com/images/zgHVsKvKGs51UhR3tWRVwqlWfs.png?scale-down-to=512 512w,https://framerusercontent.com/images/zgHVsKvKGs51UhR3tWRVwqlWfs.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/zgHVsKvKGs51UhR3tWRVwqlWfs.png 1766w\",style:{aspectRatio:\"1766 / 714\"},width:\"883\"}),/*#__PURE__*/e(\"h2\",{children:\"Limitations of Kubernetes Dashboard\"}),/*#__PURE__*/e(\"p\",{children:\"Using a UI-based Kubernetes Dashboard to replace CLI is undoubtedly good. However, there are a few limitations that restrict its use cases to only small startups:\"}),/*#__PURE__*/t(\"ul\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"Lack of multi-cluster view\"}),/*#__PURE__*/e(\"br\",{}),\"Kubernetes Dashboard provides the view pertinent to namespaces in a single cluster. It does not offer a view of multiple clusters.\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"Minimal RBAC\"}),/*#__PURE__*/e(\"br\",{}),\"Kubernetes does not provide \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/kubernetes-access-management-made-easy/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"granular access control for various users\"})}),\". One has to be dependent on token or kubeconfig files.\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"Lack of Single Sign On(SSO)\"}),/*#__PURE__*/e(\"br\",{}),\"Kubernetes Dashboard does not provide \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/sso-and-rbac-a-secure-access-strategy-for-your-kubernetes/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"SSO login services\"})}),\". SSO is essential for mid and large enterprises to secure resources and applications in Kubernetes.\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"No Node management\"}),/*#__PURE__*/e(\"br\",{}),\"Kubernetes Dashboard DevOps team to view the node information such as status, labels, limits, and memory/CPU requests, machine ID, addresses, allocated resources, pods, etc. But does not allow any provision to edit nodes and \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/understanding-kubernetes-nodes/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"manage nodes\"})}),\". This is essential because if a node is unhealthy, it will not run any pods and will not participate in cluster activity.\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"Zero visibility and manageability of HELM charts\"}),/*#__PURE__*/e(\"br\",{}),\"Many organizations use them to deploy their Kubernetes applications at scale. Unfortunately, Kubernetes Dashboard does not provide the capability to \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/kubernetes-dashboard-for-helm-release-management/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"HELM Dashboards\"})}),\".\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"Lack of application view\"}),/*#__PURE__*/e(\"br\",{}),\"Kubernetes Dashboard provides the resource or object view but needs to provide more information about applications, making it cumbersome for developers to modify any deployments. Without \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/kubernetes-dashboard-for-application-management/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!0,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"application view\"})}),\", Kubernetes Dashboard has restricted its usage to only the Ops team.\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"Audit\"}),/*#__PURE__*/e(\"br\",{}),\"Kubernetes Dashboard does not offer audit reports of deployments, such as who, when, and how an application is being deployed.\"]})})]}),/*#__PURE__*/t(\"p\",{children:[\"Note, although Kubernetes Dashboard is also developed to make the deployment easy from UI, today, there is no mechanism to apply \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/kubernetes-deployment-strategies-the-ultimate-guide/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"advanced deployment strategies\"})}),\" such as \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/canary-deployment-strategy/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"canary\"})}),\" from the UI.\"]}),/*#__PURE__*/e(\"h2\",{children:\"Open source alternatives to Kubernetes Dashboards\"}),/*#__PURE__*/t(\"p\",{children:[\"There are a number of \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/best-5-alternatives-to-kubernetes-dashboard/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"alternatives to the default Kubernetes dashboard\"})}),\". Let us explore a few of these dashboards.\"]}),/*#__PURE__*/e(\"h3\",{children:\"Devtron\"}),/*#__PURE__*/t(\"p\",{children:[\"Devtron provides an open-source Kubernetes-native DevOps platform that automates the entire software delivery process from CI, CD, GitOps, security and governance, progressive deployment, observability, monitoring, and troubleshooting. \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/manage-kubernetes-like-a-pro-with-kubernetes-dashboard-by-devtron/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Devtron Kubernetes dashboard\"})}),\" provides powerful features in a single pane to make DevOps, SREs, and developers' life simpler:\"]}),/*#__PURE__*/t(\"ul\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/what-is-the-kubernetes-resource-browser-in-devtron/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Multicluster resource monitoring and node management\"})})})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/manage-kubernetes-like-a-pro-with-kubernetes-dashboard-by-devtron/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"HELM chart dashboard and management \"})}),\"from a single pane of dashboard\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Events and real-time logs, and pod execution for debugging\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"UI-based deployments (or modifications to existing manifest files)\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Instant rollback of new deployments to production\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"DORA metrics\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Granular RBAC for users, action and resources.\"})})]}),/*#__PURE__*/e(\"div\",{className:\"framer-text-module\",style:{\"--aspect-ratio\":\"560 / 315\",aspectRatio:\"560 / 315\",height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:NEd4VmDdsxM3StIUbddO/DDzyuYPF56TuI0bfUu2z/YouTube.js:Youtube\",children:t=>/*#__PURE__*/e(i,{...t,play:\"Off\",shouldMute:!0,thumbnail:\"Medium Quality\",url:\"https://www.youtube.com/watch?v=oqCAB9b-SGQ\"})})}),/*#__PURE__*/e(\"h3\",{children:\"OpenLens\"}),/*#__PURE__*/t(\"p\",{children:[\"An open-source software with an MIT license used for multicluster management and monitoring workloads. It also provides basic HELM resource management and resource grouping, but it may require a learning curve. Secondly, it has a few blind spots as it does not provide HELM chart groups for multicluster deployments, Chart config differences, etc. Read more about\",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/devtron-vs-openlens-a-comparative-analysis/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\" Devtron vs OpenLens\\xa0\"})})]}),/*#__PURE__*/e(\"h3\",{children:\"Octant\"}),/*#__PURE__*/t(\"p\",{children:[\"Open source dashboard started by VMware but is archived now- no community support, and you are on your own. Initially, the project was targeted for developers to use the UI to ship code faster into clusters. Octane has limited functionalities w.r.t cluster visualization and management. Read more about \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/the-kubernetes-dashboard-you-need/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Devtron vs Octant.\"})})]})]});export const richText3=/*#__PURE__*/t(r.Fragment,{children:[/*#__PURE__*/t(\"p\",{children:[\"Kubernetes is an open-source platform widely used in the industry to automate the deployment, scaling, and management of containerized applications. A recent survey by \",/*#__PURE__*/e(o,{href:\"https://edgedelta.com/company/blog/kubernetes-adoption-statistics\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"EdgeDelta\"})}),\" revealed that more than 60% of organizations have already adopted Kubernetes, and adoption rates have increased to 96% in 2024. Over 50,000 organizations and 5.6 Million developers are using Kubernetes globally.\\xa0 These status show that Kubernetes has become the de facto standard for orchestrating containers, particularly in cloud environments. Kubernetes is most beneficial when organizations have microservice architecture, and they want to orchestrate all the containers to scale efficiently.\"]}),/*#__PURE__*/t(\"p\",{children:[\"Kubernetes provides a ton of business value for organizations as it helps scale and run applications efficiently. According to a \",/*#__PURE__*/e(o,{href:\"https://20518613.fs1.hubspotusercontent-na1.net/hubfs/20518613/Spectro%20Cloud%202024%20State%20of%20Production%20Kubernetes%20(1).pdf?utm_campaign=2024%20State%20of%20Production%20Kubernetes&utm_medium=email&_hsmi=308611242&utm_content=308611242&utm_source=hs_automation\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"survey by SpectroCloud\"})}),\", nearly 70% of organizations have matured their use of Kubernetes, and many organizations continue to adopt Kubernetes and work towards maturity. However, adopting Kubernetes does come with its \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/kubernetes-adoption-key-challenges-in-migrating-to-kubernetes/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"own set of challenges\"})}),\".\"]}),/*#__PURE__*/e(\"p\",{children:\"By using Kubernetes, teams become cloud agnostic i.e, they can run their workloads a public or private cloud, on-premises, or in hybrid configurations. This makes Kubernetes an ideal tool for deploying workloads that can easily run and be ported to different environments.\"}),/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"br\",{className:\"trailing-break\"})}),/*#__PURE__*/e(\"h2\",{children:\"Kubernetes Architecture\"}),/*#__PURE__*/e(\"p\",{children:\"When you create a Kubernetes cluster, it has many components that work together for orchestrating containers. Due to the highly distributed nature of Kubernetes, it also has a lot of different complexities. The image below shows the Kubernetes architecture at a high level.\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"585\",src:\"https://framerusercontent.com/images/1f5xfpHLJ2WntgVKsTyTrg4EAlo.jpg\",srcSet:\"https://framerusercontent.com/images/1f5xfpHLJ2WntgVKsTyTrg4EAlo.jpg?scale-down-to=512 512w,https://framerusercontent.com/images/1f5xfpHLJ2WntgVKsTyTrg4EAlo.jpg?scale-down-to=1024 1024w,https://framerusercontent.com/images/1f5xfpHLJ2WntgVKsTyTrg4EAlo.jpg?scale-down-to=2048 2048w,https://framerusercontent.com/images/1f5xfpHLJ2WntgVKsTyTrg4EAlo.jpg 2505w\",style:{aspectRatio:\"2505 / 1171\"},width:\"1252\"}),/*#__PURE__*/e(\"p\",{children:\"Let\u2019s take a quick look at the different components of Kubernetes:\\xa0\"}),/*#__PURE__*/e(\"h3\",{children:\"Kubernetes Nodes\"}),/*#__PURE__*/t(\"p\",{children:[\"A Kubernetes Node is an individual machine where the workloads can run. It is essentially a unique computer or virtual machine itself. Multiple such nodes are connected together to form a Kubernetes cluster. As per \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/kubernetes-1-31-whats-new/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Kubernetes v1.31\"})}),\", a total of 5,000 nodes are supported per cluster.\"]}),/*#__PURE__*/t(\"p\",{children:[\"A Kubernetes cluster has two main types of nodes. The control plane node houses all the critical Kubernetes components that are crucial for orchestrating workload. The worker nodes on the other hand are where application workloads are deployed. To learn about Kubernetes nodes in greater depth, \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/kubernetes-architecture-the-ultimate-guide/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"please check out our dedicated article on Kubernetes Nodes\"})}),\".\"]}),/*#__PURE__*/e(\"h3\",{children:\"Kubernetes API Server\"}),/*#__PURE__*/e(\"p\",{children:\"The Kubernetes API server acts as the entry point for the Kubernetes Cluster. Whenever any external request is made to the cluster, or by any of the other control plane components, the request first goes to the API server. The API server authenticates and authorizes the request, and then sends the request to the relevant K8s components.\"}),/*#__PURE__*/e(\"h3\",{children:\"Kubernetes ETCD\"}),/*#__PURE__*/e(\"p\",{children:\"The ETCD is a distributed key-value database that is designed to specifically work with Kubernetes. It stores information about the state of the cluster such as resource utilization, creation or deletion of any Kubernetes objects, the status of the objects, etc.\\xa0\"}),/*#__PURE__*/e(\"p\",{children:\"The API Server is the only Kubernetes component that can directly interact with the ETCD. If any other components wants to read or update the data of the ETCD, they cannot do it directly. First, the component will have to talk to the API Server and the API server will make the necessary changes in the ETCD.\"}),/*#__PURE__*/e(\"h3\",{children:\"Kubernetes Scheduler\"}),/*#__PURE__*/e(\"p\",{children:\"In Kubernetes, containers are run within a unit called a pod. A pod is simply a wrapper around one or multiple different containers. Whenever you deploy any kind of workload, the application always runs inside a pod.\\xa0\"}),/*#__PURE__*/e(\"p\",{children:\"When the request is sent to the API Server to run a workload, a particular node needs to be selected where the pod should run. Filtering the available nodes, and selecting the correct node to schedule the pod to, is the job of the kube-scheduler. You can either define some rules for how the pod should be scheduled, or you can leave it up to the scheduler to select the best available node for running the pod upon.\"}),/*#__PURE__*/t(\"p\",{children:[\"This article covers all the different \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/how-to-schedule-workloads-in-kubernetes/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Kubernetes Scheduling concepts and how to use them\"})}),\".\"]}),/*#__PURE__*/e(\"h3\",{children:\"Kubernetes Controller Manager\"}),/*#__PURE__*/e(\"p\",{children:\"Kubernetes has several different control loops that are responsible for observing, managing, and taking appropriate actions when a particular event occurs. These control loops are called controllers in Kubernetes. Multiple controllers exist in Kubernetes that manage different aspects of the cluster.\\xa0\"}),/*#__PURE__*/e(\"p\",{children:\"For example, there is a Deployment Controller, Replication Controller, Endpoint Controller, Namespace controller, and Service Account controller. Each one of these controllers is responsible for managing a different component of Kubernetes.\"}),/*#__PURE__*/e(\"h3\",{children:\"Kubelet\"}),/*#__PURE__*/e(\"p\",{children:\"The kubelet is the cluster builder. Earlier in this blog we already learned that every single application in the cluster runs inside a pod. There has to be a component for building and running the pods and the containers inside the pod. The Kubelet is responsible for creating the pods with the correct configuration.\"}),/*#__PURE__*/e(\"h3\",{children:\"Kube Proxy\"}),/*#__PURE__*/e(\"p\",{children:\"After you set up all the other components of a cluster, there has to be a way for all of the components to communicate with each other. The kube-proxy is the component that ensures that every Kubernetes resource can communicate with the other resources.\\xa0\"}),/*#__PURE__*/e(\"p\",{children:\"The kube-proxy can perform simple TCP, UDP, and SCTP stream forwarding or round-robin TCP, UDP, and SCTP forwarding across a set of backends.\"}),/*#__PURE__*/t(\"p\",{children:[\"To learn about the Kubernetes Architecture in-depth, please check out our dedicated blog where we have covered every component of the \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/kubernetes-architecture-the-ultimate-guide/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!0,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Kubernetes architecture in detail\"})}),\".\"]}),/*#__PURE__*/e(\"h2\",{children:\"Kubernetes Distributions\"}),/*#__PURE__*/t(\"p\",{children:[\"Similar to Linux distributions, Kubernetes also has several different flavors. The \",/*#__PURE__*/e(o,{href:\"https://github.com/kubernetes/kubernetes\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Kubernetes open-source project\"})}),\" was initially created by Google and has been adopted by many different organizations. Each has molded Kubernetes to work in different ways to achieve specific goals. This has led to many Kubernetes distributions, some of which are designed to be lightweight, others that have a greater focus on security, and some that have been stripped down and meant to be used locally as development environments.\"]}),/*#__PURE__*/t(\"p\",{children:[\"Kubernetes is a distributed system which means it can be difficult to manage. To avoid managing the Kubernetes clusters yourself, there are multiple managed Kubernetes distributed and provided by popular cloud providers like \",/*#__PURE__*/e(o,{href:\"https://aws.amazon.com/free/?trk=14a4002d-4936-4343-8211-b5a150ca592b&sc_channel=ps&ef_id=Cj0KCQiAire5BhCNARIsAM53K1h50V2UG4ptqThj6IVRjYcRISqcoJfm7lOBfd12-QHwYRCR5IYeAMgaAk8hEALw_wcB:G:s&s_kwcid=AL!4422!3!453325184782!e!!g!!aws!10712784856!111477279771&all-free-tier.sort-by=item.additionalFields.SortRank&all-free-tier.sort-order=asc&awsf.Free%20Tier%20Types=*all&awsf.Free%20Tier%20Categories=*all\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"AWS\"})}),\", \",/*#__PURE__*/e(o,{href:\"https://cloud.google.com/free/?utm_source=google&utm_medium=cpc&utm_campaign=japac-IN-all-en-dr-BKWS-all-core-trial-EXA-dr-1605216&utm_content=text-ad-none-none-DEV_c-CRE_644159077394-ADGP_Hybrid+%7C+BKWS+-+EXA+%7C+Txt+-GCP-General-core+brand-main-KWID_43700074766895889-kwd-87853815&userloc_9196528-network_g&utm_term=KW_gcp&gad_source=1&gclid=CIe_0ouzzIkDFdjKhAAd03MHcQ&gclsrc=ds&hl=en\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Google Cloud\"})}),\", \",/*#__PURE__*/e(o,{href:\"https://azure.microsoft.com/en-in/products/kubernetes-service\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Azure\"})}),\", \",/*#__PURE__*/e(o,{href:\"https://www.civo.com/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Civo\"})}),\", \",/*#__PURE__*/e(o,{href:\"https://www.digitalocean.com/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Digital Ocean\"})}),\", and many more.\"]}),/*#__PURE__*/t(\"p\",{children:[\"Apart from the managed Kubernetes options, you also have to option to self-host the Kubernetes cluster on your own infrastructure. Tools such as \",/*#__PURE__*/e(o,{href:\"https://kubernetes.io/docs/reference/setup-tools/kubeadm/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Kubeadm\"})}),\", \",/*#__PURE__*/e(o,{href:\"https://kops.sigs.k8s.io/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"KOP\"})}),\", and \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/rancher-kubernetes-a-quick-installation-guide-for-rke2/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"RKE2\"})}),\" help bootstrap the Kubernetes cluster. One of the key considerations of self-hosting is to ensure that you have the expertise to start, manage, and maintain a Kubernetes cluster. Many organizations lack the fine-grained expertise for managing a cluster and hence prefer using a managed service. This blog will help you decide if using a \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/aws-eks-vs-kops-what-to-chose/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"managed cluster like EKS or a self-hosted option like KOPS\"})}),\" is right for you.\"]}),/*#__PURE__*/t(\"p\",{children:[\"When developing applications for Kubernetes, developers tend to use lightweight clusters such as \",/*#__PURE__*/e(o,{href:\"https://minikube.sigs.k8s.io/docs/start/?arch=%2Fmacos%2Farm64%2Fstable%2Fbinary+download\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"minikube\"})}),\", \",/*#__PURE__*/e(o,{href:\"https://kind.sigs.k8s.io/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"kin\"})}),\", \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/k3d-for-local-kubernetes-development/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"k3d\"})}),\", or \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/what-is-k3s-a-quick-installation-guide-for-k3s/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"k3s\"})}),\". While K3s is a lightweight version of Kubernetes, many cloud providers use K3s as their Kubernetes offering, as it helps reduce the hosting costs for Kubernetes. Read on how you can use \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/deploy-your-applications-over-k3s-lightweight-kubernetes-in-no-time/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"K3s for deploying applications\"})}),\".\"]}),/*#__PURE__*/e(\"h2\",{children:\"Kubernetes Workloads\"}),/*#__PURE__*/e(\"p\",{children:\"Kubernetes has several building blocks that are useful for deploying, updating, and managing your applications. These different building blocks are called Kubernetes Workloads. In total, there are 75 resources are shipped with Kubernetes. However, since Kubernetes is extensible, a lot of different custom resources can be added to the cluster using Custom Resource Definitions (CRDs)\"}),/*#__PURE__*/e(\"p\",{children:\"Every Kubernetes resource has a certain function. Some workloads might work in combination with several different workloads. Let us look at some of these Kubernetes resources that you will have to use in everyday activities.\"}),/*#__PURE__*/e(\"h3\",{children:\"Kubernetes Pods\"}),/*#__PURE__*/e(\"p\",{children:\"A pod is the smallest deployable Kubernetes unit. Inside a pod, all the applications run as containers. Pods are a wrapper unit around the containers. Inside a pod, there can exist multiple containers. Every container that is inside the pod will share the same network, storage, system resources, and specific configuration on how to run the pods.\"}),/*#__PURE__*/t(\"p\",{children:[\"Each Kubernetes pod is created through a YAML manifest. This manifest can be created using \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/kubectl-apply-vs-create/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"kubectl apply or kubectl create commands\"})}),\". Whenever you create a pod, it is also important to define the different resource\",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/configuring-requests-and-limits-in-kubernetes-deployments/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\" requests and limits\"})}),\" in the pod. The resource requests help manage system resources among different pods running on the node.\"]}),/*#__PURE__*/e(\"h3\",{children:\"Kubernetes ReplicaSets\"}),/*#__PURE__*/e(\"p\",{children:\"Kubernetes pods are ephemeral workloads which means that they can get deleted at any time due to insufficient system resources, some application error, or any other reason. If a production application is running inside the pod, the application will be lost until the pod is recreated. If you try to manually observe the pod\u2019s status and recreate it when it is destroyed, it can consume a lot of time, and there can be a significant delay between the pod\u2019s deletion and recreation.\"}),/*#__PURE__*/e(\"p\",{children:\"To ensure that a pod is running at any given point in time, Kubernetes has a resource called as the ReplicaSet. A ReplicaSet ensures that a pod with a given configuration is running at any given point in time. If the Pod is deleted either manually, or by any system process, the ReplicaSet ensures that the pod is recreated.\"}),/*#__PURE__*/e(\"h3\",{children:\"Kubernetes Deployments & StatefulSets\"}),/*#__PURE__*/t(\"p\",{children:[\"In Kubernetes, a Deployment is a way to create ReplicaSets and pods, and also manage rolling out updates in a seamless manner. When you wish to deploy an application in Kubernetes, you will want to use the Deployment object instead of using a ReplicaSet. Deployments also help progressively rollout application updates using \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/kubernetes-deployment-strategies-the-ultimate-guide/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"deployment strategies\"})}),\".\"]}),/*#__PURE__*/t(\"p\",{children:[\"In a similar way, when you have applications that need to maintain state, you will want to use a StatefulSet. For example, you will want to maintain the state of a database such as MySQL, hence it will be deployed as a StatefulSet. This article highlights the differences between \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/deployment-vs-statefulset/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Deployment and StatefulSets\"})}),\".\"]}),/*#__PURE__*/e(\"h3\",{children:\"Kubernetes Services\"}),/*#__PURE__*/e(\"p\",{children:\"A Kubernetes service provides a way to expose the application in the pod to the network. By default, every pod has a unique IP, and the containers inside the pod are isolated. They can only communicate with other containers in the same pod. If a container wants to send or receive a request from the external world, it cannot do so.\"}),/*#__PURE__*/e(\"p\",{children:\"To expose the pod to the outside world, a service has to be created and mapped to the pod. The service makes the pod accessible to other pods on the same network. Each service has a set of endpoints that are used to access the pods that are mapped to it.\"}),/*#__PURE__*/t(\"p\",{children:[\"This article covers \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/understanding-kubernetes-services/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"in-depth information about the various Kubernetes Services\"})}),\".\"]}),/*#__PURE__*/e(\"h3\",{children:\"Kubernetes Namespaces\"}),/*#__PURE__*/e(\"p\",{children:\"In Kubernetes, it\u2019s important to segregate groups of workloads into isolated spaces. This is done through a resource called Kubernetes Namespaces. Let\u2019s say that you have deployed a monitoring stack and a network resource and you also have your core applications all running in your cluster.\"}),/*#__PURE__*/t(\"p\",{children:[\"Namespaces can also be used in advanced ways to serve multiple tenants. This is known as \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/multi-tenancy-in-kubernetes/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Multi-tenancy\"})}),\".\"]}),/*#__PURE__*/e(\"h3\",{children:\"Kubernetes Jobs\"}),/*#__PURE__*/e(\"p\",{children:\"A Kubernetes job is used for running certain tasks within the cluster. A job creates one or more pods within which the actual task that is defined runs. When a specified number of pods is complete, the task or the job is marked as completed. Kubernetes mainly has two types of Jobs\"}),/*#__PURE__*/t(\"ul\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"Job:\"}),\" A job runs a single time and then terminates\\xa0\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"CronJob:\"}),\" A CronJob is a job that runs at specified time intervals\"]})})]}),/*#__PURE__*/t(\"p\",{children:[\"To learn about the different \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/what-are-kubernetes-workloads/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Kubernetes workloads in depth, please check out this blog\"})}),\".\"]}),/*#__PURE__*/e(\"h2\",{children:\"Kubernetes Networking\"}),/*#__PURE__*/e(\"p\",{children:\"As we have seen previously, Kubernetes has a lot of different elements and works in a distributed manner. Nodes can be in multiple different physical locations, and they are all connected through the network. Due to this distributed nature, it is important to have robust networking to properly operate a Kubernetes cluster.\"}),/*#__PURE__*/e(\"p\",{children:\"Whenever you create a pod, it has an IP Address, but other pods, or external traffic is not able to access the pod. This is because the pod has not been exposed in any way. To expose the pod, you have to create a Kubernetes Service.\"}),/*#__PURE__*/e(\"p\",{children:\"There are three main types of Kubernetes services which are\"}),/*#__PURE__*/t(\"ul\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"ClusterIP\"}),\": Enables pod-to-pod communication\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"NodePort:\"}),\" Exposes the pod on a random port between 30,000 to 32,767\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"LoadBalancer\"}),\": Exposes pods to external traffic and load balances the traffic.\"]})})]}),/*#__PURE__*/t(\"p\",{children:[\"To get an in-depth understanding of the different service types, and how to use them, refer to \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/understanding-kubernetes-services/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"our blog on Kubernetes Services\"})}),\".\"]}),/*#__PURE__*/e(\"p\",{children:\"Apart from the above services, Kubernetes also has a resource known as Kubernetes Ingress. Ingress is an API object that handles external access to the cluster and provides load-balancing capabilities based on certain rules that you can define. An Ingress can act as a single point of entry for your Kubernetes cluster. Instead of requiring to expose multiple services individually, you can use an Ingress to provide access to those applications.\"}),/*#__PURE__*/t(\"p\",{children:[\"This article covers \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/setup-ingress-for-an-application-with-devtron/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Kubernetes Ingress in-depth and walks you through creating an ingress resource\"})}),\".\"]}),/*#__PURE__*/e(\"h2\",{children:\"Kubernetes Storage\"}),/*#__PURE__*/e(\"p\",{children:\"By default, pods are ephemeral in nature which means that are designed to be destroyed and recreated. Whenever a pod is destroyed, all the data in the pod is lost as well. Certain types of ephemeral storage can be mounted to a pod, but it is not recommended.\"}),/*#__PURE__*/e(\"p\",{children:\"Ephemeral storage is useful for certain use cases, but when you want to persist the data long after the pod is destroyed, ephemeral storage falls short. For this, Kubernetes has a few different resources for persistent storage.\"}),/*#__PURE__*/e(\"p\",{children:\"Kubernetes has a resource called Persistent Volumes, which is useful when working with data. These persistent volumes can be a cloud storage resource such as a S3 bucket, or local storage on the Node. In short, Persistent Volumes help retain data even after the lifecycle of the pod is complete.\"}),/*#__PURE__*/e(\"p\",{children:\"The persistent volumes are assigned to different pods using Persistent Volume Claims(PVCs). A Persistent Volume(PV) binds to a PVC which is then mounted to a pod.\"}),/*#__PURE__*/e(\"p\",{children:\"Oftentimes, you may not have direct access to the storage resources. In this case, Kubernetes has the storage class resource that can help dynamically provision Persistent Volumes.\"}),/*#__PURE__*/e(\"p\",{children:\"In order to ensure that all cloud storage can work with Kubernetes, the Container Storage Interface (CSI) was created to standardize the methods of storing data in Kubernetes. Using the various CSI drivers, Kubernetes can support a number of different storage types.\"}),/*#__PURE__*/t(\"p\",{children:[\"For more information about \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/kubernetes-storage-made-easy-kubernetes-volumes-persistent-volumes/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Kubernetes storage, refer to this article.\"})})]}),/*#__PURE__*/t(\"p\",{children:[\"While working with any kind of storage, it is important to back up the data in case of any kind of data loss. By default, Kubernetes stores its information in the etcd. However, operating the etcd can be tricky. There are certain tools like \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/how-to-backup-and-restore-kubernetes-clusters/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Velero which are helpful for backing up Kubernetes clusters\"})})]}),/*#__PURE__*/e(\"h2\",{children:\"Kubernetes Security\"}),/*#__PURE__*/e(\"p\",{children:\"Similar to every computing system, when deploying applications to Kubernetes, you need to ensure that the cluster and the applications are secure. Security becomes complicated in Kubernetes since there are many different components working together. Kubernetes has several built-in mechanisms that can help secure a cluster, as well as external tools that enhance security.\"}),/*#__PURE__*/t(\"p\",{children:[\"Ensuring overall Kubernetes security starts from the containers. While building containers, it is important to ensure that the containers are secure. This includes using up-to-date dependencies, secure base images, and scanning the container image once it\u2019s built. To learn about the \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/kubernetes-container-security-devsecops-best-practices/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"best practices for securing containers, please check out this blog\"})}),\".\"]}),/*#__PURE__*/t(\"p\",{children:[\"Your applications might need to use access keys to authenticate and authorize certain services. Injecting these sensitive keys directly into the container is not a good idea. If the container gets compromised, the credentials will be compromised as well. Kubernetes provides two resources i.e \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/kubernetes-configmaps-secrets/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"secrets and configmaps\"})}),\" that help manage sensitive data and configuration data respectively.\"]}),/*#__PURE__*/t(\"p\",{children:[\"However, one thing to note is that secrets are not secure by default. They encode the secret data is a base64 format. There is no encryption that happens to the secret data. To increase security, DevOps teams prefer using an external secret store such as \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/how-to-deploy-kubernetes-secrets-with-aws-secrets-manager/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"AWS Secret Manager\"})}),\", \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/how-to-deploy-hashicorp-vault-in-kubernetes/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Hashicorp Vault\"})}),\" or \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/how-to-manage-secrets-with-azure-key-vault-in-kubernetes/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Azure Key Vault\"})}),\".\"]}),/*#__PURE__*/t(\"p\",{children:[\"When you want to share cluster access with different team members, it is generally not a good idea to share the admin level of access to every member. Instead, the level of access should be restricted to just what users require. Kubernetes has a Role Based Access Control(RBAC) mechanism that let\u2019s you fine grain the level of access for each individual user. To learn how to \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/kubernetes-rbac-improve-the-k8s-security-posture/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"implement RBAC, please refer to this blog\"})}),\".\"]}),/*#__PURE__*/e(\"h2\",{children:\"Extending Kubernetes\"}),/*#__PURE__*/t(\"p\",{children:[\"The design philosophy of Kubernetes is based on the principles of automation, API-driven, extensible and loose coupling between components. Kubernetes follows a number of different open standards such as CRI, CRO, CNI, and others which make it easy to extend the functionality of Kubernetes. K\",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/reconsidering-kubernetes-deployments-when-operators-are-overkill/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"ubernetes Operators\"})}),\" are useful for adding to the functionalities of Kubernetes. There are a number of different tools in the cloud native landscape that are designed to work in unison with Kubernetes. This entire \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/elevating-cloud-native-development-kubernetes/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"cloud native ecosystem can be leveraged\"})}),\" to create a robust Kubernetes cluster that fits business requirements.\"]}),/*#__PURE__*/t(\"p\",{children:[\"When working with Kubernetes at scale, autoscalers can be highly beneficial. They can automatically scale the pods or nodes depending on certain factors such as traffic, time, or any particular event that occurs in the cluster. \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/http-request-based-autoscaling-with-keda/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"KEDA is one of the popular autoscalers\"})}),\" that are used in Kubernetes.\"]}),/*#__PURE__*/e(\"p\",{children:\"Similar to autoscaling tools, there are many different tools that can extend the functionality of Kubernetes. Some of these include service meshes, API gateways, Ingress controllers, custom schedulers, and more.\"}),/*#__PURE__*/e(\"h2\",{children:\"Managing Kubernetes Applications\"}),/*#__PURE__*/e(\"p\",{children:\"The whole purpose of deploying workloads onto Kubernetes is to achieve greater scale and reliability. However, as scale increases, so does management complexity. There are a number of different tools that DevOps teams incorporate into their workflow to simplify cluster management. We will look at some of the key tools that are useful for managing clusters.\"}),/*#__PURE__*/t(\"ul\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/t(\"strong\",{children:[\"K8s Package Managers\",/*#__PURE__*/e(\"br\",{})]}),\"A single K8s application can have multiple resources which can be difficult to manage and deploy to multiple environments. For this, teams use tools such as \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/introduction-to-helm/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Helm\"})}),\" to package and deploy apps across multiple environments.\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/t(\"strong\",{children:[\"GitOps tools\",/*#__PURE__*/e(\"br\",{})]}),/*#__PURE__*/e(o,{href:\"https://devtron.ai/what-is-gitops\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"GitOps\"})}),\" is an ideology where your Kubernetes cluster is managed directly through Git repositories. Tools such as \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/what-is-argocd\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"ArgoCD\"})}),\" and \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/what-is-fluxcd/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"FluxCD\"})}),\" are widely used to implement GitOps practices for managing applications.\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/t(\"strong\",{children:[\"Kubernetes Dashboard\",/*#__PURE__*/e(\"br\",{})]}),\"Managing Kubernetes through just the command line utility can become challenging. In order to get visibility into all workloads, and manage multiple clusters, the team prefers using a dedicated \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/what-is-kubernetes-dashboard\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Kubernetes Dashboard\"})}),\".\"]})})]}),/*#__PURE__*/e(\"h2\",{children:\"Conclusion\"}),/*#__PURE__*/e(\"p\",{children:\"Kubernetes is a highly sophisticated tool that helps to orchestrate containers in multiple environments. Many industries use Kubernetes for running their applications. Some organizations are running multiple Kubernetes clusters across different regions to managing their workloads.\"}),/*#__PURE__*/e(\"p\",{children:\"Kubernetes has a number of different components ranging from the core architectural components to resources essential for running applications. It has a number of resources for managing the network communication between different pods as well as storage resources. Kubernetes is also cloud agnostic which means you can run a Kubernetes cluster in any environment without worrying about getting vendor-locked.\"}),/*#__PURE__*/e(\"p\",{children:\"It is also highly extensible which makes it a versatile option that fits almost every business use case. The entire Kubernetes ecosystem makes it a great choice for running and scaling applications in production environments.\"})]});export const richText4=/*#__PURE__*/t(r.Fragment,{children:[/*#__PURE__*/e(\"p\",{children:\"Platform engineering is the discipline of building and maintaining a self-service platform for developers. The platform provides a set of cloud-native tools and services to help developers deliver applications quickly and efficiently. The goal of platform engineering is to improve developer experience (DX) by standardizing and automating most of the tasks in the software delivery lifecycle (SDLC). Instead of context switching like provisioning infrastructure, managing security, and learning curve, developers can focus on coding and delivering the business logic using automated platforms \u200D\"}),/*#__PURE__*/e(\"p\",{children:\"Platform engineering has an inward-looking perspective as it focuses on optimizing developers in the organization for better productivity. Organizations benefit greatly from developers working at the optimum level because it leads to faster release cycles. The platform makes it happen by providing everything developers need to get their code into production so they do not have to wait for other IT teams for infrastructure and tooling. The self-service platform that makes developers' day-to-day activities more effortless and autonomous is called an internal developer platform (IDP).\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"1620\",src:\"https://framerusercontent.com/images/rZpKtfk6BXI1NqPUGuA1v3EuKTA.png\",srcSet:\"https://framerusercontent.com/images/rZpKtfk6BXI1NqPUGuA1v3EuKTA.png?scale-down-to=512 512w,https://framerusercontent.com/images/rZpKtfk6BXI1NqPUGuA1v3EuKTA.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/rZpKtfk6BXI1NqPUGuA1v3EuKTA.png?scale-down-to=2048 2048w,https://framerusercontent.com/images/rZpKtfk6BXI1NqPUGuA1v3EuKTA.png?scale-down-to=4096 4096w,https://framerusercontent.com/images/rZpKtfk6BXI1NqPUGuA1v3EuKTA.png 5760w\",style:{aspectRatio:\"5760 / 3240\"},width:\"2880\"}),/*#__PURE__*/e(\"h2\",{children:\"What is Internal Developer Platform (IDP)?\"}),/*#__PURE__*/e(\"p\",{children:\"IDP is a platform that comprises self-serving cloud-native tools and technologies that developers can use to build, test, deploy, monitor, or do almost anything regarding application development and delivery with as little overhead as possible. Platform engineers or platform teams build it after consulting the developers and understanding their unique challenges and workflows.\\xa0\"}),/*#__PURE__*/t(\"p\",{children:[\"After discussing and implementing \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/adding-gitops-to-ci-cd-pipelines/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Kubernetes CI/CD pipelines and GitOps\"})}),\" solutions for many large hi-tech enterprises, we realized a typical IDP would consist of the below 5 pillars:\"]}),/*#__PURE__*/t(\"ol\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"CI/CD platforms for automated deployments (Jenkins, Docker Hub, Argo CD, Devtron, Spinnaker)\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Container orchestration platforms for managing containers (Kubernetes, Nomad, Docker Swarm)\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Security management tools for authentication, authorization, and secret management (HashiCorp Vault, AWS Secrets Manager, Okta Identity Cloud)\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Infrastructure as code (IaC) tools for automated infrastructure provisioning (Terraform, Ansible, Chef, AWS CloudFormation)\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[\"Observability stacks for workloads and applications visualization across all the clusters (Devtron \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/what-is-kubernetes-dashboard\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Kubernetes dashboard\"})}),\", Prometheus, Grafana, ELK stack)\"]})})]}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"450\",src:\"https://framerusercontent.com/images/nLfZQAyWBascB0C8VgpvaJ8U90.png\",srcSet:\"https://framerusercontent.com/images/nLfZQAyWBascB0C8VgpvaJ8U90.png?scale-down-to=512 512w,https://framerusercontent.com/images/nLfZQAyWBascB0C8VgpvaJ8U90.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/nLfZQAyWBascB0C8VgpvaJ8U90.png 1600w\",style:{aspectRatio:\"1600 / 900\"},width:\"800\"}),/*#__PURE__*/e(\"p\",{children:\"The platform team designs IDP in a way that is easy to use for developers with a minimal learning curve. IDPs can help reduce developers' cognitive load and improve DX by automating repetitive tasks, reducing maintenance overhead, and eliminating the need for endless scripting. IDP enables development teams to independently manage resources, infrastructure needs, deployments, and rollbacks by providing a self-service platform. This increases developer autonomy and accountability, reduces dependencies, and streamlines the development cycle.\"}),/*#__PURE__*/e(\"h2\",{children:\"Why is Platform Engineering Important?\"}),/*#__PURE__*/e(\"p\",{children:\"Platform engineering can help organizations reap several internal (developers) and external (end users) benefits:\"}),/*#__PURE__*/t(\"ul\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"Improved developer experience (DX)\"}),/*#__PURE__*/e(\"br\",{}),\"The plethora of cloud-native tools increases the cognitive load of developers, as it takes a good amount of time to decide which one to use for their specific use cases and master it. Platform engineering solves this and improves DX by providing a simplified, standardized set of tools and services that suit developers\u2019 unique workflows.\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"Increased productivity\"}),/*#__PURE__*/e(\"br\",{}),\"The IDP provides everything developers need to get their code tested and deployed in a self-service manner. This reduces the delays in different stages of SDLC, like waiting for someone to provision the infrastructure to deploy, for example. Platform engineering ensures developer productivity by helping them focus mainly on the core development work.\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"Standardization by design\"}),/*#__PURE__*/e(\"br\",{}),\"IT teams use a variety of tooling in a typical software organization, varying from team to team. Maintaining and keeping track of things becomes complex in such a situation. Platform engineering solves this by standardizing the tools and services, and it is easier for them to solve any bottlenecks because the platform is identical for every developer.\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"Faster releases\"}),/*#__PURE__*/e(\"br\",{}),\"The platform team ensures developers are working on delivering the business logic by providing toolchains that are easily consumable, reusable, and configurable. Developers are very productive as a result, and it accelerates faster time-to-market for features and innovations reliably and securely.\"]})})]}),/*#__PURE__*/e(\"p\",{children:\"Implementing a successful platform team in an organization and leveraging the above benefits requires following some common principles. Treating the platform as a product is one of them.\"}),/*#__PURE__*/e(\"h3\",{children:\"Platform as a Product\"}),/*#__PURE__*/e(\"p\",{children:\"One of the core principles of platform engineering is productizing the platform. The platform team needs to employ a product management mindset to design and maintain a platform that is not only user-friendly but meets the expectations and needs of the customers (app developers). It starts with collecting data points around the problems developers have and identifying which area to facilitate. This could improve deployment frequency, reduce the change failure rate, improve reliability and security, improve DX, etc.\"}),/*#__PURE__*/e(\"p\",{children:\"It is important to note that building a platform is all about building a core product that solves common challenges most teams have. It is not about solving the problems of a single team but providing the product across multiple teams to solve the same set of problems. For example, if multiple teams require the same piece of infrastructure, it makes sense for the platform team to work on that shared piece and distribute it. This idea of reusing the platform and repeatability is crucial as it allows for standardization, consistency, and scalability in application delivery.\"}),/*#__PURE__*/t(\"p\",{children:[\"As in product management, the platform team owns the product, chooses certain metrics, and continues taking customer feedback to improve the user experience. The \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/making-devtron-your-internal-developer-platform-idp/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"platform's product roadmap evolves\"})}),\" with respect to feedback, and it accommodates the changing needs and desires of the customers.\"]}),/*#__PURE__*/e(\"h3\",{children:\"Roles & Responsibilities of Platform Engineers\"}),/*#__PURE__*/e(\"p\",{children:\"The primary role of a platform engineer is to design and maintain a self-service platform (IDP) and provide platform services for developers. It starts with engaging with the developers and understanding their pain points:\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"450\",src:\"https://framerusercontent.com/images/56VqI6YgYnlh16CVoUYYmESP3o.png\",srcSet:\"https://framerusercontent.com/images/56VqI6YgYnlh16CVoUYYmESP3o.png?scale-down-to=512 512w,https://framerusercontent.com/images/56VqI6YgYnlh16CVoUYYmESP3o.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/56VqI6YgYnlh16CVoUYYmESP3o.png 1600w\",style:{aspectRatio:\"1600 / 900\"},width:\"800\"}),/*#__PURE__*/t(\"ul\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/t(\"strong\",{children:[\"Listen to the customers\",/*#__PURE__*/e(\"br\",{})]}),\"Interview developers and different IT teams to understand their engineering landscape and challenges and to know what they are optimizing for. They may be trying to build an effective CI/CD pipeline or implement better access control, among many other challenges around software delivery.\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/t(\"strong\",{children:[\"Prioritize\",/*#__PURE__*/e(\"br\",{})]}),\"Identify common challenges most teams share and prioritize solving them over problems individual teams face. For example, if most teams find it hard to store and retrieve secrets securely, it is ideal to prioritize and solve them for everyone.\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/t(\"strong\",{children:[\"Platform designing\",/*#__PURE__*/e(\"br\",{})]}),\"Design IDP with required tools that would solve those problems for users, along with documentation to enable developers to self-serve resources and infrastructure. Adopting a secret management tool would solve challenges around securely managing secrets in the above case. Part of platform designing also includes writing scripts to automate routine development tasks, such as spinning up new environments and provisioning infrastructure to reduce errors and friction points in the development flow.\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/t(\"strong\",{children:[\"Metrics\",/*#__PURE__*/e(\"br\",{})]}),\"Choose specific metrics around the goals to measure the platform's effectiveness. For example, if the goal is to improve DX, the metrics include engagement scores, team feedback, etc. Similarly, the metrics will change if the goal is to reduce the change failure rate or to increase deployment frequency.\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/t(\"strong\",{children:[\"Gather feedback and maintain the platform\",/*#__PURE__*/e(\"br\",{})]}),\"Continue listening to the customers and watch the metrics. Gather user feedback to add new tools to the platform and optimize for a better user experience. This also includes staying up-to-date with emerging tools and technologies in the DevOps and cloud infrastructure space and adapting them if necessary.\"]})})]}),/*#__PURE__*/e(\"p\",{children:\"It is easy to confuse the roles of a DevOps engineer or SRE with that of a platform engineer since they all manage the underlying infrastructure and support software development teams. Although there are certain overlapping responsibilities between all these roles, each differs from the others with its unique focus.\"}),/*#__PURE__*/e(\"h3\",{children:\"Platform Engineering vs. DevOps\"}),/*#__PURE__*/e(\"p\",{children:\"DevOps is a philosophy that brought a cultural shift to SDLC to improve software delivery speed and quality. DevOps facilitated collaboration and communication between development and ops teams and accelerated automation to streamline deployments. Platform engineering \u2014 a practice rather than a philosophy \u2014 can be considered the next iteration of DevOps as it shares some core principles of DevOps: collaboration (with Ops), continuous improvement, and automation.\"}),/*#__PURE__*/e(\"p\",{children:\"The daily tasks of a platform team and DevOps differ from each other in some aspects. DevOps use certain tools and automation to streamline getting the code to production, managing it, and observing it using logging and monitoring tools. They mostly work on building an effective CI/CD pipeline. Platform engineers take all the tools used by DevOps and integrate them into a shared platform, which different IT teams can use on an enterprise level. This eliminates the need for teams to configure and manage infrastructure and tooling on their own and saves significant time, effort, and resources. Platform engineers also create the documentation and optimize the platform so developers can self-serve the tools and infrastructure in their workflow.\"}),/*#__PURE__*/t(\"p\",{children:[\"Platform teams are required only in matured companies with many different IT teams using complex tools and infrastructure. Naturally, a dedicated platform team to manage the complexity will become necessary in such an engineering landscape. The platform team builds and manages the infrastructure, helping DevOps speed up continuous delivery. However, it is common for the \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/enhancing-software-delivery-platform-engineering-devops/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"DevOps team to perform platform engineering tasks\"})}),\" (configuring Terraform, for example) in startups.\"]}),/*#__PURE__*/e(\"h3\",{children:\"Platform Engineering vs. SRE\"}),/*#__PURE__*/e(\"p\",{children:\"Site reliability engineers (SREs) focus on ensuring the application is reliable, secure, and always available. They work with developers and Ops teams to create systems or infrastructure that support delivering highly reliable applications. SREs also perform capacity planning and infrastructure scaling and manage and respond to incidents so that the platform meets required service level objectives (SLOs). On the other hand, platform engineering manages complex infrastructure and builds an efficient platform for developers to optimize SDLC. While both work on platforms and their roles sound similar, their goals differ.\"}),/*#__PURE__*/e(\"p\",{children:\"The major difference between platform engineering and SRE regards whom they face and cater their services to. SREs face end users and ensure the application is reliable and available for them. Platform engineers face internal developers and focus on improving their developer experience. The daily tasks of both teams differ with respect to these goals. Platform engineering provides the underlying infrastructure for rapid application delivery, while SREs do the same to deliver highly reliable and available applications. SREs work more on troubleshooting and incident response, and platform engineers focus on complex infrastructure and enabling developer self-service. \u200D\"}),/*#__PURE__*/e(\"p\",{children:\"To achieve their respective goals, both SREs and platform teams use different tools in their workflows. SREs mostly use monitoring and logging tools like Prometheus or Grafana to detect anomalies in real-time and to set automated alerts. Platform teams work with different sets of tools spanning various stages of the software delivery process, such as container orchestration tools, CI/CD pipeline tools, and IaC tools. All in all, SREs and platform teams work on building a reliable and scalable infrastructure with different goals but with some overlapping between the tools they use.\"}),/*#__PURE__*/e(\"h2\",{children:\"How to implement Platform Engineering in an organization?\"}),/*#__PURE__*/t(\"p\",{children:[\"A platform team will not be an immediate requirement in a startup with a few engineers. Once the organization grows to multiple IT teams and starts dealing with complex tooling and infrastructure, it is ideal to have \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/making-devtron-your-internal-developer-platform-idp/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"platform engineers to manage the complexity\"})}),\".\"]}),/*#__PURE__*/e(\"h3\",{children:\"Create the role (Head/VP of Engineering)\"}),/*#__PURE__*/e(\"p\",{children:\"Top-level engineers like the VP or Head of Engineering usually create the role of a platform engineer when developers spend more time configuring the tools and infrastructure rather than delivering the business logic. They would find that most IT teams are solving the same problems, like spinning up a new environment, which lags the delivery process. So the Head of Engineering would define the scope of platform engineering, identify the areas of responsibility, and create the role of a platform engineer/team.\"}),/*#__PURE__*/e(\"h3\",{children:\"Create an Internal Developer Platform (Platform Engineers/Team)\"}),/*#__PURE__*/t(\"p\",{children:[\"The platform engineer starts by building the logs of the infrastructure and tools that are already used in the organization. Then they would interview developers and understand their challenges and build the\",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/making-devtron-your-internal-developer-platform-idp/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\" internal developer platform with tools and services\"})}),\" that solve problems on an enterprise level. They will build the platform in a way that is flexible and facilitates different architectures and deployment styles. Platform engineers also create documentation and conduct training sessions to help developers self-serve the platform. It is ideal for platform engineers to have a developer background so they know what it is like to be a developer and understand the challenges better.\"]}),/*#__PURE__*/e(\"h3\",{children:\"Onboard users (Application Developers)\"}),/*#__PURE__*/e(\"p\",{children:\"Once the platform is ready, platform engineers onboard application developers. It will require internal marketing and letting teams know of the platform and what it can solve. The best way to onboard users is to pull them to the platform rather than throw the platform at them. This can be done by starting with a small team and helping them overcome a challenge. For example, help a small team optimize CI/CD pipeline and provide the best experience possible in the process. Word-of-mouth from early adopters will have a positive ripple effect throughout the organization, which will help onboard more users to the platform.\"}),/*#__PURE__*/e(\"p\",{children:\"Platform engineering does not stop at onboarding the users. It is a continuous process where the platform accommodates emerging tools and technologies and the changing needs and requirements of the users.\"}),/*#__PURE__*/e(\"h2\",{children:\"Platform Engineering with Open-Source Devtron\"}),/*#__PURE__*/e(\"p\",{children:\"The open-source Devtron platform is built to enable platform engineers with a standardized toolchain, which helps developers accelerate software delivery. Devtron platform helps developers by automating CI/CD platform, security, and observability for end-to-end SDLC. Below are some use cases of the Devtron platform:\"}),/*#__PURE__*/t(\"ul\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[\"Create \",/*#__PURE__*/e(o,{href:\"https://docs.devtron.ai/usage/applications/creating-application/ci-pipeline\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"automated push-based pipelines\"})}),\" for deployment\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(o,{href:\"https://docs.devtron.ai/install/install-devtron-with-cicd-with-gitops\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"GitOps workflow\"})}),\" for automated reconciliation with the clusters\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(o,{href:\"https://docs.devtron.ai/usage/applications/deploying-application/rollback-deployment\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Automated rollback\"})}),\" to previous versions based on deployment errors or issues\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[\"Set \",/*#__PURE__*/e(o,{href:\"https://docs.devtron.ai/usage/security-features\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"security policies at different levels\"})}),\" (global, cluster, user, environment, application), and automate security scanning and vulnerability checks\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[\"Kubernetes \",/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/manage-kubernetes-like-a-pro-with-kubernetes-dashboard-by-devtron/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"application dashboard\"})}),\" to visualize multi-clusters, workloads, and resources\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(o,{href:\"https://devtron.ai/blog/the-ultimate-kubernetes-dashboard-for-helm/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"HELM dashboard\"})}),\" to visualize and manage HELM-based deployments\"]})})]}),/*#__PURE__*/t(\"p\",{children:[\"Devtron makes platform engineering easier by providing all these features inside a user-friendly dashboard. Devtron also has great community support for integrating emerging tools and technologies into the platform. Feel free to log in with your GitHub credentials and have a look and feel for the platform here: \",/*#__PURE__*/e(o,{href:\"https://preview.devtron.ai/dashboard/login/\",motionChild:!0,nodeId:\"NOV9lZaAr\",openInNewTab:!0,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"https://preview.devtron.ai/dashboard/login/\"})})]})]});\nexport const __FramerMetadata__ = {\"exports\":{\"richText3\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText4\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText1\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText2\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}"],
  "mappings": "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",
  "names": ["PlayOptions", "ThumbnailOptions", "Youtube", "url", "play", "shouldMute", "thumbnail", "isRed", "onClick", "onMouseEnter", "onMouseLeave", "onMouseDown", "onMouseUp", "title", "props", "onCanvas", "useIsOnCanvas", "isAutoplay", "showThumbnail", "isPreloading", "preloadVideo", "le", "showVideo", "startVideo", "isHovered", "setHovered", "ye", "borderRadius", "useRadius", "hasBorderRadius", "p", "Instructions", "parsedURL", "parseVideoURL", "ErrorMessage", "videoId", "embedURL", "originalSearchParams", "searchParams", "param", "value", "iframeProps", "u", "wrapperStyle", "l", "getThumbnailURL", "videoStyle", "PlayButton", "addPropertyControls", "ControlType", "borderRadiusControl", "defaultEvents", "defaultProps", "urlString", "getEmbedURL", "pathSegments", "page", "res", "pre", "ext", "emptyStateStyle", "centerTextStyle", "message", "containerStyles", "buttonStyle", "richText", "u", "x", "p", "Link", "motion", "richText1", "richText2", "ComponentPresetsConsumer", "t", "CodeBlock_default", "Youtube", "richText3", "richText4", "__FramerMetadata__"]
}
