[{"data":1,"prerenderedAt":1547},["ShallowReactive",2],{"/blog/configuring-your-cluster-with-kubernetes-integration":3,"navigation-en-us":764,"banner-en-us":1191,"footer-en-us":1201,"blog-post-authors-en-us-Jean-Philippe Baconnais":1443,"blog-related-posts-en-us-configuring-your-cluster-with-kubernetes-integration":1458,"blog-promotions-en-us":1483,"next-steps-en-us":1537},{"id":4,"title":5,"authors":6,"body":8,"category":739,"date":740,"description":741,"extension":742,"externalUrl":743,"faq":743,"featured":744,"heroImage":745,"meta":746,"navigation":747,"path":748,"seo":749,"slug":754,"stem":755,"tags":756,"template":762,"updatedDate":743,"__hash__":763},"blogPosts/en-us/blog/configuring-your-cluster-with-kubernetes-integration.md","GitLab Heroes Unmasked - How I became acquainted with the GitLab Agent for Kubernetes",[7],"Jean-Philippe Baconnais",{"type":9,"value":10,"toc":724},"minimark",[11,25,28,33,36,45,48,55,58,64,67,70,76,80,89,92,101,107,112,120,130,133,137,140,143,151,154,158,167,171,178,183,186,205,311,314,323,326,332,335,443,446,452,455,463,467,494,505,511,515,518,521,527,531,534,556,563,653,657,660,666,675,684,705,711,720],[12,13,14],"p",{},[15,16,17,18,24],"em",{},"A key to GitLab’s success is our vast community of advocates. Here at GitLab, we call these active contributors \"",[19,20,23],"a",{"href":21,"rel":22},"https://contributors.gitlab.com/docs/previous-heroes",[],"GitLab Heroes",".\" Each hero contributes to GitLab in numerous ways, including elevating releases, sharing best practices, speaking at events, and more. Jean-Phillippe Baconnais is an active GitLab Hero, who hails from France. We applaud his contributions, including leading community engagement events. Baconnais shares his interest in Kubernetes and explains how to deploy and monitor an application in Kubernetes without leaving GitLab.",[12,26,27],{},"Since 2007, I’ve been a developer. I’ve learned a lot of things about continuous integration, deployment, infrastructure, and monitoring. In both my professional and personal time, my favorite activity remains software development. After creating a new application with multiple components, I wanted to deploy it on Kubernetes, which has been really famous over the last few years. This allows me to experiment on this platform. This announces a lot of very funny things. I know some terms, I used them in production for five years. But as a user, Kubernetes Administration is not my “cup of tea” 😅.",[29,30,32],"h2",{"id":31},"my-first-deployment-in-kubernetes","My first deployment in Kubernetes",[12,34,35],{},"When I decided to deploy an application on Kubernetes, I wasn’t sure where to start until I saw, navigating in my project in GitLab, a menu called “Kubernetes.\" I wanted to know what GitLab was hiding behind this. Does this feature link my project’s sources to a Kubernetes cluster? I used the credit offered by Google Cloud to discover and test this platform.",[12,37,38,39,44],{},"Deploying my application on Kubernetes was easy. I wrote ",[19,40,43],{"href":41,"rel":42},"https://dev.to/jphi_baconnais/deploy-an-quarkus-application-on-gke-with-gitlabci-lgp",[],"a blog post"," in 2019 describing how I do this, or rather, how GitLab helped me to create this link so easily. In this blog post I will explain further and talk about what’s changed since then.",[12,46,47],{},"Behind the “Kubernetes” menu, GitLab helps you integrate Kubernetes into your project. You can create, from GitLab, a cluster on Google Cloud Platform (GCP), and Amazon Web Services (AWS). If you already have a cluster on this platform or anywhere else, you can connect to it. You just need to specify the cluster name, Kubernetes API UR, and certificate.",[12,49,50],{},[51,52],"img",{"alt":53,"src":54},"Connect cluster","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782397987/blog/Content%20Images/baconcreatecluster.png",[12,56,57],{},"GitLab is a DevOps platform and in the list of DevOps actions, there is the monitoring part.",[12,59,60],{},[51,61],{"alt":62,"src":63},"Chart of GitLab stages","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782397988/blog/Content%20Images/baconstreamline.png",[12,65,66],{},"GitLab deploys an instance of Prometheus to get information about your cluster and facilitate the monitoring of your application.",[12,68,69],{},"For example, you can see how many pods are deployed and their states in your environment. You can also view some charts and information about your cluster, like memory and CPU available. All these metrics are available by default without changing the application of your cluster. We can also read the logs directly in GitLab. For a developer, it’s great to have all this information on the same tool and this allows us to save time.",[12,71,72],{},[51,73],{"alt":74,"src":75},"Pod deployment","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782397987/blog/Content%20Images/baconhealth.png",[29,77,79],{"id":78},"a-new-way-to-integrate-kubernetes","A new way to integrate Kubernetes",[12,81,82,83,88],{},"Everything I explained in the previous chapter doesn’t quite exist anymore. The release of GitLab 14.5 was the beginning of a revolution. The Kubernetes integration with certificates has limitations on security and many issues were created. GitLab teams worked on a new way to rely on your cluster. And in Version 14.5, the ",[19,84,87],{"href":85,"rel":86},"https://docs.gitlab.com/user/clusters/agent/",[],"GitLab Agent for Kubernetes"," was released!",[29,90,87],{"id":91},"gitlab-agent-for-kubernetes",[12,93,94,95,100],{},"GitLab Agent for Kubernetes is a new way to connect to your cluster. This solution is easy to explain: An agent installed on your cluster communicates with your GitLab instance with ",[19,96,99],{"href":97,"rel":98},"https://grpc.io/",[],"gRPC"," protocol. Your agent offers you useful GitOps features I will explain later. The next picture shows you the GitLab Agent for Kubernetes architecture (from GitLab).",[12,102,103],{},[51,104],{"alt":105,"src":106},"GitLab Agent for Kubernetes flow chart","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782397987/blog/Content%20Images/baconkubernetesflowchart.png",[108,109,111],"h3",{"id":110},"gitops-defined","GitOps defined",[12,113,114,115,119],{},"Let’s quickly define the term “",[19,116,118],{"href":117},"/topics/gitops/","GitOps","”: It’s a way to manage your infrastructure as code, in a Git project. For me, there are two aspects in GitOps: “pull” and “push” mode.",[121,122,123,127],"ul",{},[124,125,126],"li",{},"Push mode is when your Git project activates the upgrade of your infrastructure following a change.",[124,128,129],{},"Pull mode is when your infrastructure verifies without interruption of your Git project and applies changes automatically.",[12,131,132],{},"And GitLab chose the latter mode for their solution of GitLab Agent for Kubernetes. Indeed, your agent available on your cluster will check frequently if your project changes. The gRPC protocol is great to respect this intent. When you push a modification on your project, agents detect it automatically, and then your cluster upgrades.",[108,134,136],{"id":135},"how-the-gitlab-agent-for-kubernetes-works","How the GitLab Agent for Kubernetes works",[12,138,139],{},"There are some actions to do to install and have a GitLab Agent for Kubernetes available on your project.",[12,141,142],{},"First, if you create a new project on GitLab, you can use the template “Management cluster,” which allows the initialization of files. These files allow you to have examples of:",[121,144,145,148],{},[124,146,147],{},"a declaration of an agent",[124,149,150],{},"a list of starter kits to install DevOps tools",[12,152,153],{},"GitLab is a DevOps platform that wants to help you to configure all steps of the lifecycle of your project. You can find the configuration of tools like Prometheus, Sentry, Ingress, etc. I will detail this later.",[108,155,157],{"id":156},"the-evolution-of-gitlab-agent-for-kubernetes","The evolution of GitLab Agent for Kubernetes",[12,159,160,161,166],{},"Before explaining more details about this agent, you have to know one thing. This product is in constant evolution and your feedback is welcome in ",[19,162,165],{"href":163,"rel":164},"https://gitlab.com/gitlab-org/gitlab/-/issues/342696#note_899701396",[],"this issue"," to improve it. The roadmap is available and each version gives some information about its evolution.",[29,168,170],{"id":169},"how-to-use-gitlab-agent-for-kubernetes","How to use GitLab Agent for Kubernetes",[12,172,173,174],{},"Creating an agent is simple. You have to create a file in the directory .gitlab/agents/",[175,176,177],"nameofyouragent",{},"/config.yaml.",[12,179,180],{},[51,181],{"alt":53,"src":182},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1782397988/blog/Content%20Images/baconstructure.png",[12,184,185],{},"The default configuration should contain:",[121,187,188,196,199,202],{},[124,189,190,191],{},"your project id, represented by your ",[192,193,195],"user",{"or":194,"group":194},"","/project",[124,197,198],{},"a namespace by default to deploy applications if it’s not present in your yaml files",[124,200,201],{},"path of your yaml file to apply. This can be a specific file, a directory, or a pattern of files",[124,203,204],{},"level of debug",[206,207,211],"pre",{"className":208,"code":209,"language":210,"meta":194,"style":194},"language-yaml shiki shiki-themes github-light","gitops:\n manifest_projects:\n - id: xxxxx/demo-gitlab-kubernetes-cluster-management\n   default_namespace: gitlab-kubernetes-agent-demo\n   paths:\n   - glob: 'deploy.yaml'\nobservability:\n logging:\n   level: debug\n\n","yaml",[212,213,214,227,235,251,262,270,284,292,300],"code",{"__ignoreMap":194},[215,216,219,223],"span",{"class":217,"line":218},"line",1,[215,220,222],{"class":221},"shJU0","gitops",[215,224,226],{"class":225},"sgsFI",":\n",[215,228,230,233],{"class":217,"line":229},2,[215,231,232],{"class":221}," manifest_projects",[215,234,226],{"class":225},[215,236,238,241,244,247],{"class":217,"line":237},3,[215,239,240],{"class":225}," - ",[215,242,243],{"class":221},"id",[215,245,246],{"class":225},": ",[215,248,250],{"class":249},"sYBdl","xxxxx/demo-gitlab-kubernetes-cluster-management\n",[215,252,254,257,259],{"class":217,"line":253},4,[215,255,256],{"class":221},"   default_namespace",[215,258,246],{"class":225},[215,260,261],{"class":249},"gitlab-kubernetes-agent-demo\n",[215,263,265,268],{"class":217,"line":264},5,[215,266,267],{"class":221},"   paths",[215,269,226],{"class":225},[215,271,273,276,279,281],{"class":217,"line":272},6,[215,274,275],{"class":225},"   - ",[215,277,278],{"class":221},"glob",[215,280,246],{"class":225},[215,282,283],{"class":249},"'deploy.yaml'\n",[215,285,287,290],{"class":217,"line":286},7,[215,288,289],{"class":221},"observability",[215,291,226],{"class":225},[215,293,295,298],{"class":217,"line":294},8,[215,296,297],{"class":221}," logging",[215,299,226],{"class":225},[215,301,303,306,308],{"class":217,"line":302},9,[215,304,305],{"class":221},"   level",[215,307,246],{"class":225},[215,309,310],{"class":249},"debug\n",[12,312,313],{},"You can add security to this configuration file with the “ci_access” property. For example, it allows developers to avoid destroying the Kubernetes infrastructure 😅. I didn’t explore in detail this part yet.",[12,315,316,317,322],{},"All configuration options are available on ",[19,318,321],{"href":319,"rel":320},"https://docs.gitlab.com/user/clusters/agent/gitops/#gitops-configuration-reference",[],"this reference page",".",[12,324,325],{},"After creating and pushing your file in your project, you have to register your agent. And this action takes two seconds on the GitLab UI.",[12,327,328],{},[51,329],{"alt":330,"src":331},"Add an agent","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782397985/blog/Content%20Images/baconaddanagent.png",[12,333,334],{},"On the next step, GitLab gives you the Docker command to install your agent on your cluster. For example:",[206,336,340],{"className":337,"code":338,"language":339,"meta":194,"style":194},"language-shell shiki shiki-themes github-light","docker run --pull=always --rm \\\n    registry.gitlab.com/gitlab-org/cluster-integration/gitlab-agent/cli:stable generate \\\n    --agent-token=\u003Cyour token generated by GitLab> \\\n    --kas-address=wss://kas.gitlab.com \\\n    --agent-version stable \\\n    --namespace gitlab-kubernetes-agent | kubectl apply -f -\n\n","shell",[212,341,342,361,371,403,410,420],{"__ignoreMap":194},[215,343,344,348,351,355,358],{"class":217,"line":218},[215,345,347],{"class":346},"s7eDp","docker",[215,349,350],{"class":249}," run",[215,352,354],{"class":353},"sYu0t"," --pull=always",[215,356,357],{"class":353}," --rm",[215,359,360],{"class":353}," \\\n",[215,362,363,366,369],{"class":217,"line":229},[215,364,365],{"class":249},"    registry.gitlab.com/gitlab-org/cluster-integration/gitlab-agent/cli:stable",[215,367,368],{"class":249}," generate",[215,370,360],{"class":353},[215,372,373,376,380,383,386,389,392,395,398,401],{"class":217,"line":237},[215,374,375],{"class":353},"    --agent-token=",[215,377,379],{"class":378},"sD7c4","\u003C",[215,381,382],{"class":353},"your",[215,384,385],{"class":249}," token",[215,387,388],{"class":249}," generated",[215,390,391],{"class":249}," by",[215,393,394],{"class":249}," GitLa",[215,396,397],{"class":225},"b",[215,399,400],{"class":378},">",[215,402,360],{"class":353},[215,404,405,408],{"class":217,"line":253},[215,406,407],{"class":353},"    --kas-address=wss://kas.gitlab.com",[215,409,360],{"class":353},[215,411,412,415,418],{"class":217,"line":264},[215,413,414],{"class":353},"    --agent-version",[215,416,417],{"class":249}," stable",[215,419,360],{"class":353},[215,421,422,425,428,431,434,437,440],{"class":217,"line":272},[215,423,424],{"class":353},"    --namespace",[215,426,427],{"class":249}," gitlab-kubernetes-agent",[215,429,430],{"class":378}," |",[215,432,433],{"class":346}," kubectl",[215,435,436],{"class":249}," apply",[215,438,439],{"class":353}," -f",[215,441,442],{"class":249}," -\n",[12,444,445],{},"You can copy-paste this command on your cluster and your agent will be available in a Kubernetes namespace. You can see on the GitLab UI that the link with the agent is successful.",[12,447,448],{},[51,449],{"alt":450,"src":451},"Link with agent success","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782397985/blog/Content%20Images/baconagentk.png",[12,453,454],{},"You can also verify this connection in logs of agent container:",[206,456,461],{"className":457,"code":459,"language":460,"meta":194},[458],"language-text","{\"level\":\"debug\",\"time\":\"2022-xx-xxT14:11:57.517Z\",\"msg\":\"Handled a connection successfully\",\"mod_name\":\"reverse_tunnel\"}\n","text",[212,462,459],{"__ignoreMap":194},[108,464,466],{"id":465},"gitlab-cluster-management","GitLab cluster management",[12,468,469,470,475,476,481,482,487,488,493],{},"GitLab is a DevOps platform and uses tiers of applications to manage all the steps of a modern DevOps pipeline. The “Monitor” part in GitLab is based on some tools such as ",[19,471,474],{"href":472,"rel":473},"https://prometheus.io/docs/visualization/grafana/",[],"Prometheus",",",[19,477,480],{"href":478,"rel":479},"https://sentry.io/",[],"Sentry",", ",[19,483,486],{"href":484,"rel":485},"https://www.vaultproject.io/",[],"Vault",", etc. To help you, GitLab created the template ",[19,489,492],{"href":490,"rel":491},"https://gitlab.com/gitlab-org/project-templates/cluster-management",[],"GitLab Cluster Management",", which gives you a basic configuration of these tools.",[12,495,496,497,500,501,504],{},"To install these tools, a ",[212,498,499],{},".gitlab-ci.yml"," file is created and defines a job to deploy them with helmfile configuration. All these tools, contained in the directory named “applications,” can be overridden or customized in ",[212,502,503],{},"values.yaml"," file.\nAnd for my experimentation, I used this template and applied a small change to have an external IP address for the Prometheus instance. After registering this external IP in GitLab (Menu Settings > Monitor > Alerts), the Monitor menu has data. We can check information about any pods deployed on my cluster.",[12,506,507],{},[51,508],{"alt":509,"src":510},"Agent graph","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782397985/blog/Content%20Images/baconagentgraph.png",[29,512,514],{"id":513},"the-gitops-aspect","The GitOps aspect",[12,516,517],{},"The GitOps aspect can be verified quickly. If you choose to specify one manifest file defining an application deployment, a modification on this file implies an automatic deployment on your cluster. Without CI! This allows us to have a faster deployment than if we passed with a pipeline. The new features or fixes will be deployed faster on your infrastructures. And if you use the free version of GitLab, your deployment will not count in your CI quota.",[12,519,520],{},"After a commit, the agent detects it and we can see the commit id in the agent logs.",[206,522,525],{"className":523,"code":524,"language":460,"meta":194},[458],"{\"level\":\"info\",\"time\":\"2022-04-11T15:22:44.049Z\",\"msg\":\"Synchronizing objects\",\"mod_name\":\"gitops\",\"project_id\":\"jeanphi-baconnais/demo-gitlab-kubernetes-cluster-management\",\"agent_id\":12804,\"commit_id\":\"e2a82fe6cc82fa25e8d5a72584774f4751407558\"}\n",[212,526,524],{"__ignoreMap":194},[29,528,530],{"id":529},"cicd-tunnel","CI/CD tunnel",[12,532,533],{},"Another feature that comes with the GitLab Agent for Kubernetes is the CI/CD tunnel. Your agent facilitates the interaction with your cluster. You just have to define a KUBE_CONTEXT variable referencing the path of your agent.",[206,535,537],{"className":208,"code":536,"language":210,"meta":194,"style":194},"variables:\nKUBE_CONTEXT: \"xxxxx/demo-gitlab-kubernetes-cluster-management:agentk\"\n",[212,538,539,546],{"__ignoreMap":194},[215,540,541,544],{"class":217,"line":218},[215,542,543],{"class":221},"variables",[215,545,226],{"class":225},[215,547,548,551,553],{"class":217,"line":229},[215,549,550],{"class":221},"KUBE_CONTEXT",[215,552,246],{"class":225},[215,554,555],{"class":249},"\"xxxxx/demo-gitlab-kubernetes-cluster-management:agentk\"\n",[12,557,558,559,562],{},"And actions on your cluster are available without secret configuration or anything else. If you want to execute ",[212,560,561],{},"kubectl"," commands, you can easily use this job:",[206,564,566],{"className":208,"code":565,"language":210,"meta":194,"style":194},"test-cicd-tunnel:\n stage: test\n extends: [.kube-context]\n image:\n   name: bitnami/kubectl:latest\n   entrypoint: [\"\"]\n script:\n  - kubectl get ns\n when: manual\n\n",[212,567,568,575,585,599,606,616,628,635,643],{"__ignoreMap":194},[215,569,570,573],{"class":217,"line":218},[215,571,572],{"class":221},"test-cicd-tunnel",[215,574,226],{"class":225},[215,576,577,580,582],{"class":217,"line":229},[215,578,579],{"class":221}," stage",[215,581,246],{"class":225},[215,583,584],{"class":249},"test\n",[215,586,587,590,593,596],{"class":217,"line":237},[215,588,589],{"class":221}," extends",[215,591,592],{"class":225},": [",[215,594,595],{"class":249},".kube-context",[215,597,598],{"class":225},"]\n",[215,600,601,604],{"class":217,"line":253},[215,602,603],{"class":221}," image",[215,605,226],{"class":225},[215,607,608,611,613],{"class":217,"line":264},[215,609,610],{"class":221},"   name",[215,612,246],{"class":225},[215,614,615],{"class":249},"bitnami/kubectl:latest\n",[215,617,618,621,623,626],{"class":217,"line":272},[215,619,620],{"class":221},"   entrypoint",[215,622,592],{"class":225},[215,624,625],{"class":249},"\"\"",[215,627,598],{"class":225},[215,629,630,633],{"class":217,"line":286},[215,631,632],{"class":221}," script",[215,634,226],{"class":225},[215,636,637,640],{"class":217,"line":294},[215,638,639],{"class":225},"  - ",[215,641,642],{"class":249},"kubectl get ns\n",[215,644,645,648,650],{"class":217,"line":302},[215,646,647],{"class":221}," when",[215,649,246],{"class":225},[215,651,652],{"class":249},"manual\n",[29,654,656],{"id":655},"whats-next","What's next",[12,658,659],{},"Currently, GitLab Agent for Kubernetes doesn’t allow you to get information about the state of pods on your cluster’s environment page.",[12,661,662],{},[51,663],{"alt":664,"src":665},"Success","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782397986/blog/Content%20Images/baconci.png",[12,667,668,669,674],{},"But GitLab wants to offer the same level of service as the certificate integration. So, check the roadmap (",[19,670,673],{"href":671,"rel":672},"https://gitlab.com/groups/gitlab-org/-/epics/3329",[],"in this issue",") and the contents of each release. The template Cluster Management is in progress, too. Some issues will give new features for configuration tools.",[12,676,677,678,683],{},"This experience was so rewarding for me. I would deploy a project on Google Cloud, and I discovered a new method. I saw this agent described in ",[19,679,682],{"href":680,"rel":681},"https://docs.gitlab.com/releases/",[],"GitLab 14.5"," but I didn’t imagine the impact it can have on a project.",[12,685,686,687,692,693,698,699,704],{},"My colleague ",[19,688,691],{"href":689,"rel":690},"https://twitter.com/eric_briand",[],"Eric Briand"," and I had the opportunity to speak about this subject at ",[19,694,697],{"href":695,"rel":696},"https://www.malt-academy.com/",[],"Malt Academy sessions"," and ",[19,700,703],{"href":701,"rel":702},"https://www.meetup.com/GitLab-Meetup-France/events/283917115",[],"Meetup GitLab France",". I will continue to experiment with this agent and try different options for this wonderful product!",[12,706,707],{},[708,709,710],"strong",{},"This blog post and linked pages contain information related to upcoming products, features, and functionality. It is important to note that the information presented is for informational purposes only. Please do not rely on this information for purchasing or planning purposes. As with all projects, the items mentioned in this video/blog post and linked pages are subject to change or delay. The development, release, and timing of any products, features, or functionality remain at the sole discretion of GitLab Inc.",[12,712,713,714,719],{},"Cover image by ",[19,715,718],{"href":716,"rel":717},"https://unsplash.com/photos/mkxTOAxqTTo",[],"Ashin K Suresh"," on Unsplash.",[721,722,723],"style",{},"html pre.shiki code .shJU0, html code.shiki .shJU0{--shiki-default:#22863A}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}html pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}",{"title":194,"searchDepth":229,"depth":229,"links":725},[726,727,728,733,736,737,738],{"id":31,"depth":229,"text":32},{"id":78,"depth":229,"text":79},{"id":91,"depth":229,"text":87,"children":729},[730,731,732],{"id":110,"depth":237,"text":111},{"id":135,"depth":237,"text":136},{"id":156,"depth":237,"text":157},{"id":169,"depth":229,"text":170,"children":734},[735],{"id":465,"depth":237,"text":466},{"id":513,"depth":229,"text":514},{"id":529,"depth":229,"text":530},{"id":655,"depth":229,"text":656},"open-source","2022-06-08","A tutorial on deploying and monitoring an application in Kubernetes without leaving GitLab.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749682342/Blog/Hero%20Images/treasure.jpg",{},true,"/en-us/blog/configuring-your-cluster-with-kubernetes-integration",{"title":750,"description":741,"ogTitle":750,"ogDescription":741,"noIndex":744,"ogImage":745,"ogUrl":751,"ogSiteName":752,"ogType":753,"canonicalUrls":751},"Heroes journey: Working with GitLab's Kubernetes agent","https://about.gitlab.com/blog/configuring-your-cluster-with-kubernetes-integration","https://about.gitlab.com","article","configuring-your-cluster-with-kubernetes-integration","en-us/blog/configuring-your-cluster-with-kubernetes-integration",[757,758,759,760,761],"kubernetes","community","user stories","growth","contributors","BlogPost","fatFWIcioI0cPnkS1X-rroJenWA230eFrHo6NU8k1Ms",{"logo":765,"freeTrial":770,"sales":775,"login":780,"items":785,"search":1111,"minimal":1142,"duo":1161,"switchNav":1170,"pricingDeployment":1181},{"config":766},{"href":767,"dataGaName":768,"dataGaLocation":769},"/","gitlab logo","header",{"text":771,"config":772},"Get free trial",{"href":773,"dataGaName":774,"dataGaLocation":769},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":776,"config":777},"Request a demo",{"href":778,"dataGaName":779,"dataGaLocation":769},"/sales/?contact-topic=request-demo","sales",{"text":781,"config":782},"Sign in",{"href":783,"dataGaName":784,"dataGaLocation":769},"https://gitlab.com/users/sign_in/","sign in",[786,815,915,920,1033,1089],{"text":787,"config":788,"menu":790},"Platform",{"dataNavLevelOne":789},"platform",{"type":791,"columns":792},"cards",[793,799,807],{"title":787,"description":794,"link":795},"The intelligent orchestration platform for DevSecOps",{"text":796,"config":797},"Explore our Platform",{"href":798,"dataGaName":789,"dataGaLocation":769},"/platform/",{"title":800,"description":801,"link":802},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":803,"config":804},"Meet GitLab Duo",{"href":805,"dataGaName":806,"dataGaLocation":769},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":808,"description":809,"link":810},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":811,"config":812},"Learn more",{"href":813,"dataGaName":814,"dataGaLocation":769},"/why-gitlab/","why gitlab",{"text":816,"left":747,"config":817,"menu":819},"Product",{"dataNavLevelOne":818},"solutions",{"type":820,"link":821,"columns":825,"feature":894},"lists",{"text":822,"config":823},"View all Solutions",{"href":824,"dataGaName":818,"dataGaLocation":769},"/solutions/",[826,850,873],{"title":827,"description":828,"link":829,"items":834},"Automation","CI/CD and automation to accelerate deployment",{"config":830},{"icon":831,"href":832,"dataGaName":833,"dataGaLocation":769},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[835,839,842,846],{"text":836,"config":837},"CI/CD",{"href":838,"dataGaLocation":769,"dataGaName":836},"/solutions/continuous-integration/",{"text":800,"config":840},{"href":805,"dataGaLocation":769,"dataGaName":841},"gitlab duo agent platform - product menu",{"text":843,"config":844},"Source Code Management",{"href":845,"dataGaLocation":769,"dataGaName":843},"/solutions/source-code-management/",{"text":847,"config":848},"Automated Software Delivery",{"href":832,"dataGaLocation":769,"dataGaName":849},"Automated software delivery",{"title":851,"description":852,"link":853,"items":858},"Security","Deliver code faster without compromising security",{"config":854},{"href":855,"dataGaName":856,"dataGaLocation":769,"icon":857},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[859,863,868],{"text":860,"config":861},"Application Security Testing",{"href":855,"dataGaName":862,"dataGaLocation":769},"Application security testing",{"text":864,"config":865},"Software Supply Chain Security",{"href":866,"dataGaLocation":769,"dataGaName":867},"/solutions/supply-chain/","Software supply chain security",{"text":869,"config":870},"Software Compliance",{"href":871,"dataGaName":872,"dataGaLocation":769},"/solutions/software-compliance/","software compliance",{"title":874,"link":875,"items":880},"Measurement",{"config":876},{"icon":877,"href":878,"dataGaName":879,"dataGaLocation":769},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[881,885,889],{"text":882,"config":883},"Visibility & Measurement",{"href":878,"dataGaLocation":769,"dataGaName":884},"Visibility and Measurement",{"text":886,"config":887},"Value Stream Management",{"href":888,"dataGaLocation":769,"dataGaName":886},"/solutions/value-stream-management/",{"text":890,"config":891},"Analytics & Insights",{"href":892,"dataGaLocation":769,"dataGaName":893},"/solutions/analytics-and-insights/","Analytics and insights",{"title":895,"type":820,"items":896},"GitLab for",[897,903,909],{"text":898,"config":899},"Enterprise",{"icon":900,"href":901,"dataGaLocation":769,"dataGaName":902},"Building","/enterprise/","enterprise",{"text":904,"config":905},"Small Business",{"icon":906,"href":907,"dataGaLocation":769,"dataGaName":908},"Work","/small-business/","small business",{"text":910,"config":911},"Public Sector",{"icon":912,"href":913,"dataGaLocation":769,"dataGaName":914},"Organization","/solutions/public-sector/","public sector",{"text":916,"config":917},"Pricing",{"href":918,"dataGaName":919,"dataGaLocation":769,"dataNavLevelOne":919},"/pricing/","pricing",{"text":921,"config":922,"menu":924},"Resources",{"dataNavLevelOne":923},"resources",{"type":820,"link":925,"columns":929,"feature":1022},{"text":926,"config":927},"View all resources",{"href":928,"dataGaName":923,"dataGaLocation":769},"/resources/",[930,963,990],{"title":931,"items":932},"Getting started",[933,938,943,948,953,958],{"text":934,"config":935},"Install",{"href":936,"dataGaName":937,"dataGaLocation":769},"/install/","install",{"text":939,"config":940},"Quick start guides",{"href":941,"dataGaName":942,"dataGaLocation":769},"/get-started/","quick setup checklists",{"text":944,"config":945},"Learn",{"href":946,"dataGaLocation":769,"dataGaName":947},"https://university.gitlab.com/","learn",{"text":949,"config":950},"Product documentation",{"href":951,"dataGaName":952,"dataGaLocation":769},"https://docs.gitlab.com/","product documentation",{"text":954,"config":955},"Best practice videos",{"href":956,"dataGaName":957,"dataGaLocation":769},"/getting-started-videos/","best practice videos",{"text":959,"config":960},"Integrations",{"href":961,"dataGaName":962,"dataGaLocation":769},"/integrations/","integrations",{"title":964,"items":965},"Discover",[966,971,976,981,985],{"text":967,"config":968},"Customer success stories",{"href":969,"dataGaName":970,"dataGaLocation":769},"/customers/","customer success stories",{"text":972,"config":973},"Blog",{"href":974,"dataGaName":975,"dataGaLocation":769},"/blog/","blog",{"text":977,"config":978},"Demo Hub",{"href":979,"dataGaName":980,"dataGaLocation":769},"/demo-hub/","demo hub",{"text":982,"config":983},"The Source",{"href":984,"dataGaName":975,"dataGaLocation":769},"/the-source/",{"text":986,"config":987},"Remote",{"href":988,"dataGaName":989,"dataGaLocation":769},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":991,"items":992},"Connect",[993,998,1003,1007,1012,1017],{"text":994,"config":995},"GitLab Services",{"href":996,"dataGaName":997,"dataGaLocation":769},"/services/","services",{"text":999,"config":1000},"Contribute",{"href":1001,"dataGaName":1002,"dataGaLocation":769},"https://contributors.gitlab.com","contribute",{"text":1004,"config":1005},"Community",{"href":1006,"dataGaName":758,"dataGaLocation":769},"/community/",{"text":1008,"config":1009},"Forum",{"href":1010,"dataGaName":1011,"dataGaLocation":769},"https://forum.gitlab.com/","forum",{"text":1013,"config":1014},"Events",{"href":1015,"dataGaName":1016,"dataGaLocation":769},"/events/","events",{"text":1018,"config":1019},"Partners",{"href":1020,"dataGaName":1021,"dataGaLocation":769},"/partners/","partners",{"config":1023,"title":1026,"text":1027,"link":1028},{"background":1024,"textColor":1025},"url('https://res.cloudinary.com/about-gitlab-com/image/upload/v1777322348/qpq8yrgn8knii57omj0c.png')","#000","What’s new in GitLab","Stay updated with our latest features and improvements.",{"text":1029,"config":1030},"Read the latest",{"href":1031,"dataGaName":1032,"dataGaLocation":769},"/whats-new/","whats new",{"text":1034,"config":1035,"menu":1037},"Company",{"dataNavLevelOne":1036},"company",{"type":820,"columns":1038},[1039],{"items":1040},[1041,1046,1052,1054,1059,1064,1069,1074,1079,1084],{"text":1042,"config":1043},"About",{"href":1044,"dataGaName":1045,"dataGaLocation":769},"/company/","about",{"text":1047,"config":1048,"footerGa":1051},"Jobs",{"href":1049,"dataGaName":1050,"dataGaLocation":769},"/jobs/","jobs",{"dataGaName":1050},{"text":1013,"config":1053},{"href":1015,"dataGaName":1016,"dataGaLocation":769},{"text":1055,"config":1056},"Leadership",{"href":1057,"dataGaName":1058,"dataGaLocation":769},"/company/team/e-group/","leadership",{"text":1060,"config":1061},"Handbook",{"href":1062,"dataGaName":1063,"dataGaLocation":769},"https://handbook.gitlab.com/","handbook",{"text":1065,"config":1066},"Investor relations",{"href":1067,"dataGaName":1068,"dataGaLocation":769},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":1070,"config":1071},"Trust Center",{"href":1072,"dataGaName":1073,"dataGaLocation":769},"/security/","trust center",{"text":1075,"config":1076},"AI Transparency Center",{"href":1077,"dataGaName":1078,"dataGaLocation":769},"/ai-transparency-center/","ai transparency center",{"text":1080,"config":1081},"Newsletter",{"href":1082,"dataGaName":1083,"dataGaLocation":769},"/company/contact/#contact-forms","newsletter",{"text":1085,"config":1086},"Press",{"href":1087,"dataGaName":1088,"dataGaLocation":769},"/press/","press",{"text":1090,"config":1091,"menu":1092},"Contact us",{"dataNavLevelOne":1036},{"type":820,"columns":1093},[1094],{"items":1095},[1096,1101,1106],{"text":1097,"config":1098},"Talk to sales",{"href":1099,"dataGaName":1100,"dataGaLocation":769},"/sales/","talk to sales",{"text":1102,"config":1103},"Support portal",{"href":1104,"dataGaName":1105,"dataGaLocation":769},"https://support.gitlab.com/hc/en-us","support portal",{"text":1107,"config":1108},"Customer portal",{"href":1109,"dataGaName":1110,"dataGaLocation":769},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":1112,"login":1113,"suggestions":1120},"Close",{"text":1114,"link":1115},"To search repositories and projects, login to",{"text":1116,"config":1117},"gitlab.com",{"href":783,"dataGaName":1118,"dataGaLocation":1119},"search login","search",{"text":1121,"default":1122},"Suggestions",[1123,1125,1129,1131,1135,1139],{"text":800,"config":1124},{"href":805,"dataGaName":800,"dataGaLocation":1119},{"text":1126,"config":1127},"Code Suggestions (AI)",{"href":1128,"dataGaName":1126,"dataGaLocation":1119},"/solutions/code-suggestions/",{"text":836,"config":1130},{"href":838,"dataGaName":836,"dataGaLocation":1119},{"text":1132,"config":1133},"GitLab on AWS",{"href":1134,"dataGaName":1132,"dataGaLocation":1119},"/partners/technology-partners/aws/",{"text":1136,"config":1137},"GitLab on Google Cloud",{"href":1138,"dataGaName":1136,"dataGaLocation":1119},"/partners/technology-partners/google-cloud-platform/",{"text":1140,"config":1141},"Why GitLab?",{"href":813,"dataGaName":1140,"dataGaLocation":1119},{"freeTrial":1143,"mobileIcon":1148,"desktopIcon":1153,"secondaryButton":1156},{"text":1144,"config":1145},"Start free trial",{"href":1146,"dataGaName":774,"dataGaLocation":1147},"https://gitlab.com/-/trials/new/","nav",{"altText":1149,"config":1150},"Gitlab Icon",{"src":1151,"dataGaName":1152,"dataGaLocation":1147},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":1149,"config":1154},{"src":1155,"dataGaName":1152,"dataGaLocation":1147},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":1157,"config":1158},"Get Started",{"href":1159,"dataGaName":1160,"dataGaLocation":1147},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":1162,"mobileIcon":1166,"desktopIcon":1168},{"text":1163,"config":1164},"Learn more about GitLab Duo",{"href":805,"dataGaName":1165,"dataGaLocation":1147},"gitlab duo",{"altText":1149,"config":1167},{"src":1151,"dataGaName":1152,"dataGaLocation":1147},{"altText":1149,"config":1169},{"src":1155,"dataGaName":1152,"dataGaLocation":1147},{"button":1171,"mobileIcon":1176,"desktopIcon":1178},{"text":1172,"config":1173},"/switch",{"href":1174,"dataGaName":1175,"dataGaLocation":1147},"#contact","switch",{"altText":1149,"config":1177},{"src":1151,"dataGaName":1152,"dataGaLocation":1147},{"altText":1149,"config":1179},{"src":1180,"dataGaName":1152,"dataGaLocation":1147},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":1182,"mobileIcon":1187,"desktopIcon":1189},{"text":1183,"config":1184},"Back to pricing",{"href":918,"dataGaName":1185,"dataGaLocation":1147,"icon":1186},"back to pricing","GoBack",{"altText":1149,"config":1188},{"src":1151,"dataGaName":1152,"dataGaLocation":1147},{"altText":1149,"config":1190},{"src":1155,"dataGaName":1152,"dataGaLocation":1147},{"title":1192,"titleMobile":1193,"button":1194,"config":1199},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":811,"config":1195},{"href":1196,"dataGaName":1197,"dataGaLocation":1198},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":1200,"disabled":744},"release",{"data":1202},{"text":1203,"source":1204,"edit":1210,"contribute":1215,"config":1220,"items":1225,"minimal":1432},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":1205,"config":1206},"View page source",{"href":1207,"dataGaName":1208,"dataGaLocation":1209},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1211,"config":1212},"Edit this page",{"href":1213,"dataGaName":1214,"dataGaLocation":1209},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1216,"config":1217},"Please contribute",{"href":1218,"dataGaName":1219,"dataGaLocation":1209},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1221,"facebook":1222,"youtube":1223,"linkedin":1224},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[1226,1273,1324,1368,1400],{"title":916,"links":1227,"subMenu":1242},[1228,1232,1237],{"text":1229,"config":1230},"View plans",{"href":918,"dataGaName":1231,"dataGaLocation":1209},"view plans",{"text":1233,"config":1234},"Why Premium?",{"href":1235,"dataGaName":1236,"dataGaLocation":1209},"/pricing/premium/","why premium",{"text":1238,"config":1239},"Why Ultimate?",{"href":1240,"dataGaName":1241,"dataGaLocation":1209},"/pricing/ultimate/","why ultimate",[1243],{"title":1244,"links":1245},"Contact Us",[1246,1249,1251,1253,1258,1263,1268],{"text":1247,"config":1248},"Contact sales",{"href":1099,"dataGaName":779,"dataGaLocation":1209},{"text":1102,"config":1250},{"href":1104,"dataGaName":1105,"dataGaLocation":1209},{"text":1107,"config":1252},{"href":1109,"dataGaName":1110,"dataGaLocation":1209},{"text":1254,"config":1255},"Status",{"href":1256,"dataGaName":1257,"dataGaLocation":1209},"https://status.gitlab.com/","status",{"text":1259,"config":1260},"Terms of use",{"href":1261,"dataGaName":1262,"dataGaLocation":1209},"/terms/","terms of use",{"text":1264,"config":1265},"Privacy statement",{"href":1266,"dataGaName":1267,"dataGaLocation":1209},"/privacy/","privacy statement",{"text":1269,"config":1270},"Cookie preferences",{"dataGaName":1271,"dataGaLocation":1209,"id":1272,"isOneTrustButton":747},"cookie preferences","ot-sdk-btn",{"title":816,"links":1274,"subMenu":1283},[1275,1279],{"text":1276,"config":1277},"DevSecOps platform",{"href":798,"dataGaName":1278,"dataGaLocation":1209},"devsecops platform",{"text":1280,"config":1281},"AI-Assisted Development",{"href":805,"dataGaName":1282,"dataGaLocation":1209},"ai-assisted development",[1284],{"title":1285,"links":1286},"Topics",[1287,1292,1294,1299,1304,1309,1314,1319],{"text":1288,"config":1289},"CICD",{"href":1290,"dataGaName":1291,"dataGaLocation":1209},"/topics/ci-cd/","cicd",{"text":118,"config":1293},{"href":117,"dataGaName":222,"dataGaLocation":1209},{"text":1295,"config":1296},"DevOps",{"href":1297,"dataGaName":1298,"dataGaLocation":1209},"/topics/devops/","devops",{"text":1300,"config":1301},"Version Control",{"href":1302,"dataGaName":1303,"dataGaLocation":1209},"/topics/version-control/","version control",{"text":1305,"config":1306},"DevSecOps",{"href":1307,"dataGaName":1308,"dataGaLocation":1209},"/topics/devsecops/","devsecops",{"text":1310,"config":1311},"Cloud Native",{"href":1312,"dataGaName":1313,"dataGaLocation":1209},"/topics/cloud-native/","cloud native",{"text":1315,"config":1316},"AI for Coding",{"href":1317,"dataGaName":1318,"dataGaLocation":1209},"/topics/devops/ai-for-coding/","ai for coding",{"text":1320,"config":1321},"Agentic AI",{"href":1322,"dataGaName":1323,"dataGaLocation":1209},"/topics/agentic-ai/","agentic ai",{"title":1325,"links":1326},"Solutions",[1327,1329,1331,1336,1340,1343,1347,1350,1352,1355,1358,1363],{"text":860,"config":1328},{"href":855,"dataGaName":860,"dataGaLocation":1209},{"text":849,"config":1330},{"href":832,"dataGaName":833,"dataGaLocation":1209},{"text":1332,"config":1333},"Agile development",{"href":1334,"dataGaName":1335,"dataGaLocation":1209},"/solutions/agile-delivery/","agile delivery",{"text":1337,"config":1338},"SCM",{"href":845,"dataGaName":1339,"dataGaLocation":1209},"source code management",{"text":1288,"config":1341},{"href":838,"dataGaName":1342,"dataGaLocation":1209},"continuous integration & delivery",{"text":1344,"config":1345},"Value stream management",{"href":888,"dataGaName":1346,"dataGaLocation":1209},"value stream management",{"text":118,"config":1348},{"href":1349,"dataGaName":222,"dataGaLocation":1209},"/solutions/gitops/",{"text":898,"config":1351},{"href":901,"dataGaName":902,"dataGaLocation":1209},{"text":1353,"config":1354},"Small business",{"href":907,"dataGaName":908,"dataGaLocation":1209},{"text":1356,"config":1357},"Public sector",{"href":913,"dataGaName":914,"dataGaLocation":1209},{"text":1359,"config":1360},"Education",{"href":1361,"dataGaName":1362,"dataGaLocation":1209},"/solutions/education/","education",{"text":1364,"config":1365},"Financial services",{"href":1366,"dataGaName":1367,"dataGaLocation":1209},"/solutions/finance/","financial services",{"title":921,"links":1369},[1370,1372,1374,1376,1379,1381,1384,1386,1388,1390,1392,1394,1396,1398],{"text":934,"config":1371},{"href":936,"dataGaName":937,"dataGaLocation":1209},{"text":939,"config":1373},{"href":941,"dataGaName":942,"dataGaLocation":1209},{"text":944,"config":1375},{"href":946,"dataGaName":947,"dataGaLocation":1209},{"text":949,"config":1377},{"href":951,"dataGaName":1378,"dataGaLocation":1209},"docs",{"text":972,"config":1380},{"href":974,"dataGaName":975,"dataGaLocation":1209},{"text":1382,"config":1383},"What's new",{"href":1031,"dataGaName":1032,"dataGaLocation":1209},{"text":967,"config":1385},{"href":969,"dataGaName":970,"dataGaLocation":1209},{"text":986,"config":1387},{"href":988,"dataGaName":989,"dataGaLocation":1209},{"text":994,"config":1389},{"href":996,"dataGaName":997,"dataGaLocation":1209},{"text":999,"config":1391},{"href":1001,"dataGaName":1002,"dataGaLocation":1209},{"text":1004,"config":1393},{"href":1006,"dataGaName":758,"dataGaLocation":1209},{"text":1008,"config":1395},{"href":1010,"dataGaName":1011,"dataGaLocation":1209},{"text":1013,"config":1397},{"href":1015,"dataGaName":1016,"dataGaLocation":1209},{"text":1018,"config":1399},{"href":1020,"dataGaName":1021,"dataGaLocation":1209},{"title":1034,"links":1401},[1402,1404,1406,1408,1410,1412,1416,1421,1423,1425,1427],{"text":1042,"config":1403},{"href":1044,"dataGaName":1036,"dataGaLocation":1209},{"text":1047,"config":1405},{"href":1049,"dataGaName":1050,"dataGaLocation":1209},{"text":1055,"config":1407},{"href":1057,"dataGaName":1058,"dataGaLocation":1209},{"text":1060,"config":1409},{"href":1062,"dataGaName":1063,"dataGaLocation":1209},{"text":1065,"config":1411},{"href":1067,"dataGaName":1068,"dataGaLocation":1209},{"text":1413,"config":1414},"Sustainability",{"href":1415,"dataGaName":1413,"dataGaLocation":1209},"/sustainability/",{"text":1417,"config":1418},"Diversity, inclusion and belonging (DIB)",{"href":1419,"dataGaName":1420,"dataGaLocation":1209},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":1070,"config":1422},{"href":1072,"dataGaName":1073,"dataGaLocation":1209},{"text":1080,"config":1424},{"href":1082,"dataGaName":1083,"dataGaLocation":1209},{"text":1085,"config":1426},{"href":1087,"dataGaName":1088,"dataGaLocation":1209},{"text":1428,"config":1429},"Modern Slavery Transparency Statement",{"href":1430,"dataGaName":1431,"dataGaLocation":1209},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1433},[1434,1437,1440],{"text":1435,"config":1436},"Terms",{"href":1261,"dataGaName":1262,"dataGaLocation":1209},{"text":1438,"config":1439},"Cookies",{"dataGaName":1271,"dataGaLocation":1209,"id":1272,"isOneTrustButton":747},{"text":1441,"config":1442},"Privacy",{"href":1266,"dataGaName":1267,"dataGaLocation":1209},[1444],{"id":1445,"title":1446,"body":743,"config":1447,"content":1449,"description":743,"extension":1452,"meta":1453,"navigation":747,"path":1454,"seo":1455,"stem":1456,"__hash__":1457},"blogAuthors/en-us/blog/authors/jean-philippe-baconnais.yml","Jean Philippe Baconnais",{"template":1448},"BlogAuthor",{"name":7,"config":1450},{"headshot":194,"ctfId":1451},"jeanphibaconnais","yml",{},"/en-us/blog/authors/jean-philippe-baconnais",{},"en-us/blog/authors/jean-philippe-baconnais","Dzu7ogLmLpJDe4VC7LxpG6bpG5G_WWAYg_5nii8-RpQ",[1459,1467,1475],{"title":1460,"description":1461,"heroImage":1462,"category":739,"date":1463,"authors":1464,"slug":1466,"externalUrl":743},"What's new in Git 2.55.0?","Learn about the new features and changes in Git 2.55, including a new git-history(1) fixup command, an fsmonitor daemon for Linux, pushing to remote groups, and more.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782732487/ztwgrvlolpifo01vj8qc.png","2026-06-29",[1465],"Toon Claes","whats-new-in-git-2-55-0",{"title":1468,"description":1469,"heroImage":1470,"category":739,"date":1471,"authors":1472,"slug":1474,"externalUrl":743},"GitLab AI Hackathon 2026: Meet the winners","Nearly 7,000 developers built 600+ AI agents and flows on GitLab Duo Agent Platform. Find out who won and what they created.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1776457632/llddiylsgwuze0u1rjks.png","2026-04-22",[1473],"Nick Veenhof","gitlab-ai-hackathon-2026-meet-the-winners",{"title":1476,"description":1477,"heroImage":1478,"category":739,"date":1479,"authors":1480,"slug":1482,"externalUrl":743},"What’s new in Git 2.54.0?","Learn about release contributions, including new repository maintenance, a new command to edit commit history, a replacement for git-sizer(1), and more.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782734716/ztwgrvlolpifo01vj8qc.png","2026-04-20",[1481],"Patrick Steinhardt","whats-new-in-git-2-54-0",{"promotions":1484},[1485,1499,1511,1523],{"id":1486,"categories":1487,"header":1489,"text":1490,"button":1491,"image":1496},"ai-modernization",[1488],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1492,"config":1493},"Get your AI maturity score",{"href":1494,"dataGaName":1495,"dataGaLocation":975},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1497},{"src":1498},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1500,"categories":1501,"header":1503,"text":1490,"button":1504,"image":1508},"devops-modernization",[1502,1308],"product","Are you just managing tools or shipping innovation?",{"text":1505,"config":1506},"Get your DevOps maturity score",{"href":1507,"dataGaName":1495,"dataGaLocation":975},"/assessments/devops-modernization-assessment/",{"config":1509},{"src":1510},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1512,"categories":1513,"header":1515,"text":1490,"button":1516,"image":1520},"security-modernization",[1514],"security","Are you trading speed for security?",{"text":1517,"config":1518},"Get your security maturity score",{"href":1519,"dataGaName":1495,"dataGaLocation":975},"/assessments/security-modernization-assessment/",{"config":1521},{"src":1522},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1524,"paths":1525,"header":1528,"text":1529,"button":1530,"image":1535},"github-azure-migration",[1526,1527],"migration-from-azure-devops-to-gitlab","integrating-azure-devops-scm-and-gitlab","Is your team ready for GitHub's Azure move?","GitHub is already rebuilding around Azure. Find out what it means for you.",{"text":1531,"config":1532},"See how GitLab compares to GitHub",{"href":1533,"dataGaName":1534,"dataGaLocation":975},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1536},{"src":1510},{"header":1538,"blurb":1539,"button":1540,"secondaryButton":1545},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1541,"config":1542},"Get your free trial",{"href":1543,"dataGaName":774,"dataGaLocation":1544},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":1247,"config":1546},{"href":1099,"dataGaName":779,"dataGaLocation":1544},1786803748095]