[{"data":1,"prerenderedAt":1670},["ShallowReactive",2],{"/blog/gitlab-eks-integration-how-to":3,"navigation-en-us":882,"banner-en-us":1310,"footer-en-us":1320,"blog-post-authors-en-us-Abubakar Siddiq Ango":1565,"blog-related-posts-en-us-gitlab-eks-integration-how-to":1580,"blog-promotions-en-us":1606,"next-steps-en-us":1660},{"id":4,"title":5,"authors":6,"body":8,"category":860,"date":861,"description":862,"extension":863,"externalUrl":864,"faq":864,"featured":865,"heroImage":866,"meta":867,"navigation":868,"path":869,"seo":870,"slug":874,"stem":875,"tags":876,"template":880,"updatedDate":864,"__hash__":881},"blogPosts/en-us/blog/gitlab-eks-integration-how-to.md","How to create a Kubernetes cluster on Amazon EKS in GitLab",[7],"Abubakar Siddiq Ango",{"type":9,"value":10,"toc":852},"minimark",[11,15,18,21,71,74,79,82,87,90,620,624,627,650,654,657,838,842,845,848],[12,13,14],"p",{},"Kubernetes has created a whole new world for running infrastructure at scale. With the right setup, an application can go from serving a few users to millions effortlessly. Setting up Kubernetes can be tasking and can require a lot of expertise to put all the pieces together. You’ll need to set up virtual or bare metal machines to use as nodes and manage SSL certificates, networking, load balancers, and many other moving parts.",[12,16,17],{},"The introduction of Amazon Elastic Kubernetes Service (EKS) was widely applauded as it streamlines the abstraction of the complexities in an environment most organizations are already familiar with and on a provider they already trust. Amazon EKS makes creating and managing Kubernetes clusters easier with more granular controls around security and straightforward policies of how resources are used.",[12,19,20],{},"GitLab strives to increase developer productivity by automating repetitive tasks and allowing developers to focus on business logic. We recently introduced support for auto-creating Kubernetes clusters on Amazon EKS. In a few clicks with the right permissions, you’ll have a fully functional Kubernetes cluster on Amazon EKS. It doesn’t stop there however – GitLab also gives you the power to achieve the following use cases and more :",[22,23,24,34,55,63],"ul",{},[25,26,27,33],"li",{},[28,29,32],"a",{"href":30,"rel":31},"https://docs.gitlab.com/runner/",[],"Highly scalable CI/CD system using GitLab Runner",": There are times like holidays when little to no changes to code are pushed to production, so why keep resources tied down? With the Amazon EKS integration with GitLab, you can install GitLab Runner with just a click and your CI/CD will run effortlessly without worrying about running out of resources.",[25,35,36,37,42,43,48,49,54],{},"Shared Cluster: Maintaining multiple Kubernetes clusters can be a pain and capital intensive. With Amazon EKS, GitLab allows you to setup a cluster at ",[28,38,41],{"href":39,"rel":40},"https://docs.gitlab.com/user/instance/clusters/",[],"Instance",", ",[28,44,47],{"href":45,"rel":46},"https://docs.gitlab.com/user/group/clusters/",[],"Group"," and ",[28,50,53],{"href":51,"rel":52},"https://docs.gitlab.com/user/project/clusters/",[],"Project"," levels. Kubernetes Namespaces are created for each GitLab project when the Amazon EKS is integrated at Instance and Project level, allowing isolation and ensuring security.",[25,56,57,62],{},[28,58,61],{"href":59,"rel":60},"https://docs.gitlab.com/ci/review_apps/",[],"Review Apps",": Reviewing changes to code or design can be tricky, you’ll need to check out your branch and run the code in a test environment. GitLab integrated with Amazon EKS deploys your app with new changes to a dynamic environment and all you need to do is click on a “View App“ button to review changes.",[25,64,65,70],{},[28,66,69],{"href":67,"rel":68},"https://docs.gitlab.com/topics/autodevops/cloud_deployments/auto_devops_with_gke/",[],"AutoDevOps"," takes DevOps to a whole new level. AutoDevOps detects, builds, tests, deploys, and monitors your applications, leveraging the Amazon EKS integration. All you have to do is push your code and the magic happens. In this tutorial, we will deploy a sample application to the Amazon EKS cluster we will be creating using AutoDevOps.",[12,72,73],{},"To show you how easy it is to create an Amazon EKS cluster from GitLab, the rest of this tutorial will walk you through the steps of the integration, starting with a one-time setup of necessary resources on AWS.",[75,76,78],"h2",{"id":77},"one-time-setup-on-aws-to-access-resources","One-time setup on AWS to access resources",[12,80,81],{},"First, we need to create a “provision\" role and a “service” role on AWS to grant GitLab access to your AWS resources and set up the necessary permissions to create and manage EKS clusters. You only need to perform these steps once and you can reuse them anytime you want to perform another integration or create more clusters.",[83,84,86],"h3",{"id":85},"step-1-create-provision-role","Step 1 - Create Provision Role",[12,88,89],{},"To grant GitLab access to your AWS resources, a “provision role” is required. Let’s create one:",[91,92,93,96,99,110,113,122,608,611,614,617],"ol",{},[25,94,95],{},"Access GitLab Kubernetes Integration Page by clicking on the ”Kubernetes” menu for groups and Operations > Kubernetes menu for projects and click the “Add Kubernetes Cluster” button.",[25,97,98],{},"Select “Amazon EKS” in the options provided under the “Create new cluster on EKS” tab.",[25,100,101,102,105],{},"You are provided with an Account and External ID  to use for authentication. Make note of these values to be used in a later step.",[103,104],"br",{},[106,107],"img",{"alt":108,"src":109},"Gitlab EKS Integration Page","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398361/blog/Content%20Images/gitlab-eks-integration/gitlab_eks_integration_page.png",[25,111,112],{},"Open IAM Management Console in another tab and click on “Create Role”",[25,114,115,116,118],{},"Click on the “Another AWS account” tab and provide the Account and External ID obtained from GitLab and click Next to set permissions as shown below:",[103,117],{},[106,119],{"alt":120,"src":121},"AWS Provision Role","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398363/blog/Content%20Images/gitlab-eks-integration/provision_role.png",[25,123,124,125,278,280,281,283,287,289,290,599,601,602,604],{},"On the permissions page, click on “Create policy.” This will open a new tab where you can set either of the permissions below using JSON:",[126,127,132],"pre",{"className":128,"code":129,"language":130,"meta":131,"style":131},"language-json shiki shiki-themes github-light","{\n    \"Version\": \"2012-10-17\",\n    \"Statement\": [\n        {\n            \"Effect\": \"Allow\",\n            \"Action\": [\n                \"autoscaling:*\",\n                \"cloudformation:*\",\n                \"ec2:*\",\n                \"eks:*\",\n                \"iam:*\",\n                \"ssm:*\"\n            ],\n            \"Resource\": \"*\"\n        }\n    ]\n}\n","json","",[133,134,135,144,161,170,176,189,197,205,213,221,229,237,243,249,260,266,272],"code",{"__ignoreMap":131},[136,137,140],"span",{"class":138,"line":139},"line",1,[136,141,143],{"class":142},"sgsFI","{\n",[136,145,147,151,154,158],{"class":138,"line":146},2,[136,148,150],{"class":149},"sYu0t","    \"Version\"",[136,152,153],{"class":142},": ",[136,155,157],{"class":156},"sYBdl","\"2012-10-17\"",[136,159,160],{"class":142},",\n",[136,162,164,167],{"class":138,"line":163},3,[136,165,166],{"class":149},"    \"Statement\"",[136,168,169],{"class":142},": [\n",[136,171,173],{"class":138,"line":172},4,[136,174,175],{"class":142},"        {\n",[136,177,179,182,184,187],{"class":138,"line":178},5,[136,180,181],{"class":149},"            \"Effect\"",[136,183,153],{"class":142},[136,185,186],{"class":156},"\"Allow\"",[136,188,160],{"class":142},[136,190,192,195],{"class":138,"line":191},6,[136,193,194],{"class":149},"            \"Action\"",[136,196,169],{"class":142},[136,198,200,203],{"class":138,"line":199},7,[136,201,202],{"class":156},"                \"autoscaling:*\"",[136,204,160],{"class":142},[136,206,208,211],{"class":138,"line":207},8,[136,209,210],{"class":156},"                \"cloudformation:*\"",[136,212,160],{"class":142},[136,214,216,219],{"class":138,"line":215},9,[136,217,218],{"class":156},"                \"ec2:*\"",[136,220,160],{"class":142},[136,222,224,227],{"class":138,"line":223},10,[136,225,226],{"class":156},"                \"eks:*\"",[136,228,160],{"class":142},[136,230,232,235],{"class":138,"line":231},11,[136,233,234],{"class":156},"                \"iam:*\"",[136,236,160],{"class":142},[136,238,240],{"class":138,"line":239},12,[136,241,242],{"class":156},"                \"ssm:*\"\n",[136,244,246],{"class":138,"line":245},13,[136,247,248],{"class":142},"            ],\n",[136,250,252,255,257],{"class":138,"line":251},14,[136,253,254],{"class":149},"            \"Resource\"",[136,256,153],{"class":142},[136,258,259],{"class":156},"\"*\"\n",[136,261,263],{"class":138,"line":262},15,[136,264,265],{"class":142},"        }\n",[136,267,269],{"class":138,"line":268},16,[136,270,271],{"class":142},"    ]\n",[136,273,275],{"class":138,"line":274},17,[136,276,277],{"class":142},"}\n",[103,279],{},"This gives GitLab full access to create and manage resources, as seen in the image below:",[103,282],{},[106,284],{"alt":285,"src":286},"AWS Role Policy","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398361/blog/Content%20Images/gitlab-eks-integration/create_role_policy.png",[103,288],{},"If you prefer limited permission, you can give GitLab the ability to create resources, but not delete them with the JSON snippet below. The drawback here is if an error is encountered during the creation process, changes will not be rolled back and you must remove resources manually. You can do this by deleting the relevant CloudFormation stack.",[126,291,293],{"className":128,"code":292,"language":130,"meta":131,"style":131},"{\n    \"Version\": \"2012-10-17\",\n    \"Statement\": [\n        {\n            \"Effect\": \"Allow\",\n            \"Action\": [\n                \"autoscaling:CreateAutoScalingGroup\",\n                \"autoscaling:DescribeAutoScalingGroups\",\n                \"autoscaling:DescribeScalingActivities\",\n                \"autoscaling:UpdateAutoScalingGroup\",\n                \"autoscaling:CreateLaunchConfiguration\",\n                \"autoscaling:DescribeLaunchConfigurations\",\n                \"cloudformation:CreateStack\",\n                \"cloudformation:DescribeStacks\",\n                \"ec2:AuthorizeSecurityGroupEgress\",\n                \"ec2:AuthorizeSecurityGroupIngress\",\n                \"ec2:RevokeSecurityGroupEgress\",\n                \"ec2:RevokeSecurityGroupIngress\",\n                \"ec2:CreateSecurityGroup\",\n                \"ec2:createTags\",\n                \"ec2:DescribeImages\",\n                \"ec2:DescribeKeyPairs\",\n                \"ec2:DescribeRegions\",\n                \"ec2:DescribeSecurityGroups\",\n                \"ec2:DescribeSubnets\",\n                \"ec2:DescribeVpcs\",\n                \"eks:CreateCluster\",\n                \"eks:DescribeCluster\",\n                \"iam:AddRoleToInstanceProfile\",\n                \"iam:AttachRolePolicy\",\n                \"iam:CreateRole\",\n                \"iam:CreateInstanceProfile\",\n                \"iam:CreateServiceLinkedRole\",\n                \"iam:GetRole\",\n                \"iam:ListRoles\",\n                \"iam:PassRole\",\n                \"ssm:GetParameters\"\n            ],\n            \"Resource\": \"*\"\n        }\n    ]\n}\n",[133,294,295,299,309,315,319,329,335,342,349,356,363,370,377,384,391,398,405,412,420,428,436,444,452,460,468,476,484,492,500,508,516,524,532,540,548,556,564,570,575,584,589,594],{"__ignoreMap":131},[136,296,297],{"class":138,"line":139},[136,298,143],{"class":142},[136,300,301,303,305,307],{"class":138,"line":146},[136,302,150],{"class":149},[136,304,153],{"class":142},[136,306,157],{"class":156},[136,308,160],{"class":142},[136,310,311,313],{"class":138,"line":163},[136,312,166],{"class":149},[136,314,169],{"class":142},[136,316,317],{"class":138,"line":172},[136,318,175],{"class":142},[136,320,321,323,325,327],{"class":138,"line":178},[136,322,181],{"class":149},[136,324,153],{"class":142},[136,326,186],{"class":156},[136,328,160],{"class":142},[136,330,331,333],{"class":138,"line":191},[136,332,194],{"class":149},[136,334,169],{"class":142},[136,336,337,340],{"class":138,"line":199},[136,338,339],{"class":156},"                \"autoscaling:CreateAutoScalingGroup\"",[136,341,160],{"class":142},[136,343,344,347],{"class":138,"line":207},[136,345,346],{"class":156},"                \"autoscaling:DescribeAutoScalingGroups\"",[136,348,160],{"class":142},[136,350,351,354],{"class":138,"line":215},[136,352,353],{"class":156},"                \"autoscaling:DescribeScalingActivities\"",[136,355,160],{"class":142},[136,357,358,361],{"class":138,"line":223},[136,359,360],{"class":156},"                \"autoscaling:UpdateAutoScalingGroup\"",[136,362,160],{"class":142},[136,364,365,368],{"class":138,"line":231},[136,366,367],{"class":156},"                \"autoscaling:CreateLaunchConfiguration\"",[136,369,160],{"class":142},[136,371,372,375],{"class":138,"line":239},[136,373,374],{"class":156},"                \"autoscaling:DescribeLaunchConfigurations\"",[136,376,160],{"class":142},[136,378,379,382],{"class":138,"line":245},[136,380,381],{"class":156},"                \"cloudformation:CreateStack\"",[136,383,160],{"class":142},[136,385,386,389],{"class":138,"line":251},[136,387,388],{"class":156},"                \"cloudformation:DescribeStacks\"",[136,390,160],{"class":142},[136,392,393,396],{"class":138,"line":262},[136,394,395],{"class":156},"                \"ec2:AuthorizeSecurityGroupEgress\"",[136,397,160],{"class":142},[136,399,400,403],{"class":138,"line":268},[136,401,402],{"class":156},"                \"ec2:AuthorizeSecurityGroupIngress\"",[136,404,160],{"class":142},[136,406,407,410],{"class":138,"line":274},[136,408,409],{"class":156},"                \"ec2:RevokeSecurityGroupEgress\"",[136,411,160],{"class":142},[136,413,415,418],{"class":138,"line":414},18,[136,416,417],{"class":156},"                \"ec2:RevokeSecurityGroupIngress\"",[136,419,160],{"class":142},[136,421,423,426],{"class":138,"line":422},19,[136,424,425],{"class":156},"                \"ec2:CreateSecurityGroup\"",[136,427,160],{"class":142},[136,429,431,434],{"class":138,"line":430},20,[136,432,433],{"class":156},"                \"ec2:createTags\"",[136,435,160],{"class":142},[136,437,439,442],{"class":138,"line":438},21,[136,440,441],{"class":156},"                \"ec2:DescribeImages\"",[136,443,160],{"class":142},[136,445,447,450],{"class":138,"line":446},22,[136,448,449],{"class":156},"                \"ec2:DescribeKeyPairs\"",[136,451,160],{"class":142},[136,453,455,458],{"class":138,"line":454},23,[136,456,457],{"class":156},"                \"ec2:DescribeRegions\"",[136,459,160],{"class":142},[136,461,463,466],{"class":138,"line":462},24,[136,464,465],{"class":156},"                \"ec2:DescribeSecurityGroups\"",[136,467,160],{"class":142},[136,469,471,474],{"class":138,"line":470},25,[136,472,473],{"class":156},"                \"ec2:DescribeSubnets\"",[136,475,160],{"class":142},[136,477,479,482],{"class":138,"line":478},26,[136,480,481],{"class":156},"                \"ec2:DescribeVpcs\"",[136,483,160],{"class":142},[136,485,487,490],{"class":138,"line":486},27,[136,488,489],{"class":156},"                \"eks:CreateCluster\"",[136,491,160],{"class":142},[136,493,495,498],{"class":138,"line":494},28,[136,496,497],{"class":156},"                \"eks:DescribeCluster\"",[136,499,160],{"class":142},[136,501,503,506],{"class":138,"line":502},29,[136,504,505],{"class":156},"                \"iam:AddRoleToInstanceProfile\"",[136,507,160],{"class":142},[136,509,511,514],{"class":138,"line":510},30,[136,512,513],{"class":156},"                \"iam:AttachRolePolicy\"",[136,515,160],{"class":142},[136,517,519,522],{"class":138,"line":518},31,[136,520,521],{"class":156},"                \"iam:CreateRole\"",[136,523,160],{"class":142},[136,525,527,530],{"class":138,"line":526},32,[136,528,529],{"class":156},"                \"iam:CreateInstanceProfile\"",[136,531,160],{"class":142},[136,533,535,538],{"class":138,"line":534},33,[136,536,537],{"class":156},"                \"iam:CreateServiceLinkedRole\"",[136,539,160],{"class":142},[136,541,543,546],{"class":138,"line":542},34,[136,544,545],{"class":156},"                \"iam:GetRole\"",[136,547,160],{"class":142},[136,549,551,554],{"class":138,"line":550},35,[136,552,553],{"class":156},"                \"iam:ListRoles\"",[136,555,160],{"class":142},[136,557,559,562],{"class":138,"line":558},36,[136,560,561],{"class":156},"                \"iam:PassRole\"",[136,563,160],{"class":142},[136,565,567],{"class":138,"line":566},37,[136,568,569],{"class":156},"                \"ssm:GetParameters\"\n",[136,571,573],{"class":138,"line":572},38,[136,574,248],{"class":142},[136,576,578,580,582],{"class":138,"line":577},39,[136,579,254],{"class":149},[136,581,153],{"class":142},[136,583,259],{"class":156},[136,585,587],{"class":138,"line":586},40,[136,588,265],{"class":142},[136,590,592],{"class":138,"line":591},41,[136,593,271],{"class":142},[136,595,597],{"class":138,"line":596},42,[136,598,277],{"class":142},[103,600],{},"The image below visualizes what permissions are granted:",[103,603],{},[106,605],{"alt":606,"src":607},"Limited Role Policy","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398363/blog/Content%20Images/gitlab-eks-integration/limited_role_policy.png",[25,609,610],{},"Once the policy is created, return to the “Create Role” browser tab and refresh to see the policy we created listed. Select the policy and click “Next.”",[25,612,613],{},"In the Tags section, we don’t need to set any Tags, except if it’s required in your organization. Let’s proceed to Review.",[25,615,616],{},"Specify a Name for your new Role. You will see the policy we created listed under policies and click “Create Role” to complete the process.",[25,618,619],{},"Click on the new Role you created in the list of Roles to view its details. You may have to search for it in the list of Roles if it’s not listed in the first view. Copy the Role ARN provided – we will need it on the GitLab Kubernetes Integration page.",[83,621,623],{"id":622},"step-2-create-service-role","Step 2 - Create Service Role",[12,625,626],{},"The Service Role is required to allow Amazon EKS and the Kubernetes control plane to manage AWS resources on your behalf.",[91,628,629,632,641],{},[25,630,631],{},"In the IAM Management Console, click on “Create Role” and select the “AWS service” tab.",[25,633,634,635,637],{},"Select EKS in the list of services and Use Cases as shown below and click Next.",[103,636],{},[106,638],{"alt":639,"src":640},"Service Role","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398363/blog/Content%20Images/gitlab-eks-integration/service_role.png",[25,642,643,644,646],{},"You will notice the “AmazonEKSClusterPolicy” and “AmazonEKSServicePolicy” permissions are selected; these are all we need. Click through the Tags step and create if necessary, then click Next to get to the Review step. Click “Create Role” to complete the process.",[103,645],{},[106,647],{"alt":648,"src":649},"Role Summary","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398363/blog/Content%20Images/gitlab-eks-integration/role_summary.png",[75,651,653],{"id":652},"gitlab-eks-integration","GitLab EKS Integration",[12,655,656],{},"This is the easy part! As mentioned earlier, you only need to create the Provision and Service role once if you don’t already have them in your organization’s AWS setup. You can reuse the roles for other integrations or cluster creations.",[91,658,659,666,801,835],{},[25,660,661,662,664],{},"Return to the GitLab Kubernetes Integration page and provide the Role ARN of the Provision Role we created earlier and click “Authenticate with AWS.”",[103,663],{},[106,665],{"alt":108,"src":109},[25,667,668,669,671,672,796,798],{},"Once authenticated, you’ll have a page to set the parameters needed to set up your cluster as shown in the image below and click on “Create Kubernetes Cluster” to let GitLab do its magic!",[103,670],{},"The parameters you’ll need to provide are:",[22,673,674,681,697,703,709,720,732,743,755,766,778,784],{},[25,675,676,680],{},[677,678,679],"strong",{},"Kubernetes cluster name"," - The name you wish to give the cluster.",[25,682,683,686,687,692,693,696],{},[677,684,685],{},"Environment scope"," - The ",[28,688,691],{"href":689,"rel":690},"https://docs.gitlab.com/user/project/clusters/#setting-the-environment-scope",[],"GitLab environment"," associated with this cluster; ",[133,694,695],{},"*"," denotes the cluster will be used for deployments to all environments.",[25,698,699,702],{},[677,700,701],{},"Kubernetes version"," - The Kubernetes version to use. Currently, the only version supported is 1.14.",[25,704,705,708],{},[677,706,707],{},"Role name"," - The service role we created earlier.",[25,710,711,686,714,719],{},[677,712,713],{},"Region",[28,715,718],{"href":716,"rel":717},"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html",[],"AWS region"," in which the cluster will be created.",[25,721,722,725,726,731],{},[677,723,724],{},"Key pair name"," - Select the ",[28,727,730],{"href":728,"rel":729},"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html",[],"key pair"," that you can use to connect to your worker nodes if required.",[25,733,734,737,738,742],{},[677,735,736],{},"VPC"," - Select a ",[28,739,736],{"href":740,"rel":741},"https://docs.aws.amazon.com/vpc/latest/userguide/what-is-amazon-vpc.html",[]," to use for your EKS Cluster resources.",[25,744,745,748,749,754],{},[677,746,747],{},"Subnets"," - Choose the ",[28,750,753],{"href":751,"rel":752},"https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Subnets.html",[],"subnets"," in your VPC where your worker nodes will run.",[25,756,757,748,760,765],{},[677,758,759],{},"Security group",[28,761,764],{"href":762,"rel":763},"https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html",[],"security group"," to apply to the EKS-managed Elastic Network Interfaces that are created in your worker node subnets. AWS provides a default group, which can be used for the purpose of this guide. However, you are advised to setup up the right rules required for your resources.",[25,767,768,771,772,777],{},[677,769,770],{},"Instance type"," - The AWS ",[28,773,776],{"href":774,"rel":775},"https://aws.amazon.com/ec2/instance-types/",[],"instance type"," of your worker nodes.",[25,779,780,783],{},[677,781,782],{},"Node count"," - The number of worker nodes.",[25,785,786,789,790,795],{},[677,787,788],{},"GitLab-managed cluster"," - Leave this checked if you want ",[28,791,794],{"href":792,"rel":793},"https://docs.gitlab.com/user/project/clusters/#gitlab-managed-clusters",[],"GitLab to manage namespaces and service accounts"," for this cluster.",[103,797],{},[106,799],{"alt":108,"src":800},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398362/blog/Content%20Images/gitlab-eks-integration/gitlab_eks_integration_post_auth.png",[25,802,803,804,830,832],{},"The cluster creation process will take approximately 10 minutes. Once done you can proceed to install some predefined applications. At the very least, you need to install the following:",[22,805,806,812,818,824],{},[25,807,808,811],{},[677,809,810],{},"Helm Tiller",": This is required to install the other applications.",[25,813,814,817],{},[677,815,816],{},"Ingress",": This provides SSL termination, load balancing and name-based virtual hosting you your applications. It acts as a web proxy for your application, which is useful when using AutoDevOps or deploying your own apps.",[25,819,820,823],{},[677,821,822],{},"Cert Manager",": This is a native Kubernetes certificate management controller, which helps in issuing certificates using Let’s Encrypt. You don’t need this if you want to use a custom Certificate issuer.",[25,825,826,829],{},[677,827,828],{},"Prometheus",": GitLab uses the Prometheus integration for automatic monitoring of your applications to collect metrics from Kubernetes containers allowing you to understand what is going on from within the GitLab UI.",[103,831],{},[106,833],{"alt":108,"src":834},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398362/blog/Content%20Images/gitlab-eks-integration/gitlab_eks_integration_post_cluster.png",[25,836,837],{},"To make use of Auto Review Apps and Auto Deploy stages of AutoDevOps, you will need to specify a Base Domain name with a wild card DNS pointing to the Ingress Endpoint generated when you Install Ingress in the list of predefined apps.",[75,839,841],{"id":840},"summary","Summary",[12,843,844],{},"In this tutorial, we looked at how GitLab integrates with Amazon EKS, allowing Kubernetes clusters to be created easily from the GitLab UI after setting the right permissions. As we’ve seen, developer productivity is greatly improved by no longer having to manually set up clusters. Also, the same cluster can be used for multiple projects when Amazon EKS is integrated with GitLab at the Group and Instance levels, thus making onboarding new projects a breeze. After integration, the possibilities of what developers can achieve is enormous.",[12,846,847],{},"In the next part of this tutorial, we will look at how to deploy your applications on an Amazon EKS cluster using AutoDevOps.",[849,850,851],"style",{},"html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}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);}",{"title":131,"searchDepth":146,"depth":146,"links":853},[854,858,859],{"id":77,"depth":146,"text":78,"children":855},[856,857],{"id":85,"depth":163,"text":86},{"id":622,"depth":163,"text":623},{"id":652,"depth":146,"text":653},{"id":840,"depth":146,"text":841},"engineering","2020-03-09","A Kubernetes tutorial: Create clusters in a few clicks with GitLab and Amazon EKS.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749666959/Blog/Hero%20Images/gitlab-aws-cover.png",{},true,"/en-us/blog/gitlab-eks-integration-how-to",{"title":5,"description":862,"ogTitle":5,"ogDescription":862,"noIndex":865,"ogImage":866,"ogUrl":871,"ogSiteName":872,"ogType":873,"canonicalUrls":871},"https://about.gitlab.com/blog/gitlab-eks-integration-how-to","https://about.gitlab.com","article","gitlab-eks-integration-how-to","en-us/blog/gitlab-eks-integration-how-to",[877,878,879],"kubernetes","features","demo","BlogPost","V3Dtr91xLhdaPKqXoi-3UXAQJPXTLU6D7EINf0B_s5A",{"logo":883,"freeTrial":888,"sales":893,"login":898,"items":903,"search":1230,"minimal":1261,"duo":1280,"switchNav":1289,"pricingDeployment":1300},{"config":884},{"href":885,"dataGaName":886,"dataGaLocation":887},"/","gitlab logo","header",{"text":889,"config":890},"Get free trial",{"href":891,"dataGaName":892,"dataGaLocation":887},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":894,"config":895},"Request a demo",{"href":896,"dataGaName":897,"dataGaLocation":887},"/sales/?contact-topic=request-demo","sales",{"text":899,"config":900},"Sign in",{"href":901,"dataGaName":902,"dataGaLocation":887},"https://gitlab.com/users/sign_in/","sign in",[904,933,1033,1038,1152,1208],{"text":905,"config":906,"menu":908},"Platform",{"dataNavLevelOne":907},"platform",{"type":909,"columns":910},"cards",[911,917,925],{"title":905,"description":912,"link":913},"The intelligent orchestration platform for DevSecOps",{"text":914,"config":915},"Explore our Platform",{"href":916,"dataGaName":907,"dataGaLocation":887},"/platform/",{"title":918,"description":919,"link":920},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":921,"config":922},"Meet GitLab Duo",{"href":923,"dataGaName":924,"dataGaLocation":887},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":926,"description":927,"link":928},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":929,"config":930},"Learn more",{"href":931,"dataGaName":932,"dataGaLocation":887},"/why-gitlab/","why gitlab",{"text":934,"left":868,"config":935,"menu":937},"Product",{"dataNavLevelOne":936},"solutions",{"type":938,"link":939,"columns":943,"feature":1012},"lists",{"text":940,"config":941},"View all Solutions",{"href":942,"dataGaName":936,"dataGaLocation":887},"/solutions/",[944,968,991],{"title":945,"description":946,"link":947,"items":952},"Automation","CI/CD and automation to accelerate deployment",{"config":948},{"icon":949,"href":950,"dataGaName":951,"dataGaLocation":887},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[953,957,960,964],{"text":954,"config":955},"CI/CD",{"href":956,"dataGaLocation":887,"dataGaName":954},"/solutions/continuous-integration/",{"text":918,"config":958},{"href":923,"dataGaLocation":887,"dataGaName":959},"gitlab duo agent platform - product menu",{"text":961,"config":962},"Source Code Management",{"href":963,"dataGaLocation":887,"dataGaName":961},"/solutions/source-code-management/",{"text":965,"config":966},"Automated Software Delivery",{"href":950,"dataGaLocation":887,"dataGaName":967},"Automated software delivery",{"title":969,"description":970,"link":971,"items":976},"Security","Deliver code faster without compromising security",{"config":972},{"href":973,"dataGaName":974,"dataGaLocation":887,"icon":975},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[977,981,986],{"text":978,"config":979},"Application Security Testing",{"href":973,"dataGaName":980,"dataGaLocation":887},"Application security testing",{"text":982,"config":983},"Software Supply Chain Security",{"href":984,"dataGaLocation":887,"dataGaName":985},"/solutions/supply-chain/","Software supply chain security",{"text":987,"config":988},"Software Compliance",{"href":989,"dataGaName":990,"dataGaLocation":887},"/solutions/software-compliance/","software compliance",{"title":992,"link":993,"items":998},"Measurement",{"config":994},{"icon":995,"href":996,"dataGaName":997,"dataGaLocation":887},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[999,1003,1007],{"text":1000,"config":1001},"Visibility & Measurement",{"href":996,"dataGaLocation":887,"dataGaName":1002},"Visibility and Measurement",{"text":1004,"config":1005},"Value Stream Management",{"href":1006,"dataGaLocation":887,"dataGaName":1004},"/solutions/value-stream-management/",{"text":1008,"config":1009},"Analytics & Insights",{"href":1010,"dataGaLocation":887,"dataGaName":1011},"/solutions/analytics-and-insights/","Analytics and insights",{"title":1013,"type":938,"items":1014},"GitLab for",[1015,1021,1027],{"text":1016,"config":1017},"Enterprise",{"icon":1018,"href":1019,"dataGaLocation":887,"dataGaName":1020},"Building","/enterprise/","enterprise",{"text":1022,"config":1023},"Small Business",{"icon":1024,"href":1025,"dataGaLocation":887,"dataGaName":1026},"Work","/small-business/","small business",{"text":1028,"config":1029},"Public Sector",{"icon":1030,"href":1031,"dataGaLocation":887,"dataGaName":1032},"Organization","/solutions/public-sector/","public sector",{"text":1034,"config":1035},"Pricing",{"href":1036,"dataGaName":1037,"dataGaLocation":887,"dataNavLevelOne":1037},"/pricing/","pricing",{"text":1039,"config":1040,"menu":1042},"Resources",{"dataNavLevelOne":1041},"resources",{"type":938,"link":1043,"columns":1047,"feature":1141},{"text":1044,"config":1045},"View all resources",{"href":1046,"dataGaName":1041,"dataGaLocation":887},"/resources/",[1048,1081,1108],{"title":1049,"items":1050},"Getting started",[1051,1056,1061,1066,1071,1076],{"text":1052,"config":1053},"Install",{"href":1054,"dataGaName":1055,"dataGaLocation":887},"/install/","install",{"text":1057,"config":1058},"Quick start guides",{"href":1059,"dataGaName":1060,"dataGaLocation":887},"/get-started/","quick setup checklists",{"text":1062,"config":1063},"Learn",{"href":1064,"dataGaLocation":887,"dataGaName":1065},"https://university.gitlab.com/","learn",{"text":1067,"config":1068},"Product documentation",{"href":1069,"dataGaName":1070,"dataGaLocation":887},"https://docs.gitlab.com/","product documentation",{"text":1072,"config":1073},"Best practice videos",{"href":1074,"dataGaName":1075,"dataGaLocation":887},"/getting-started-videos/","best practice videos",{"text":1077,"config":1078},"Integrations",{"href":1079,"dataGaName":1080,"dataGaLocation":887},"/integrations/","integrations",{"title":1082,"items":1083},"Discover",[1084,1089,1094,1099,1103],{"text":1085,"config":1086},"Customer success stories",{"href":1087,"dataGaName":1088,"dataGaLocation":887},"/customers/","customer success stories",{"text":1090,"config":1091},"Blog",{"href":1092,"dataGaName":1093,"dataGaLocation":887},"/blog/","blog",{"text":1095,"config":1096},"Demo Hub",{"href":1097,"dataGaName":1098,"dataGaLocation":887},"/demo-hub/","demo hub",{"text":1100,"config":1101},"The Source",{"href":1102,"dataGaName":1093,"dataGaLocation":887},"/the-source/",{"text":1104,"config":1105},"Remote",{"href":1106,"dataGaName":1107,"dataGaLocation":887},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":1109,"items":1110},"Connect",[1111,1116,1121,1126,1131,1136],{"text":1112,"config":1113},"GitLab Services",{"href":1114,"dataGaName":1115,"dataGaLocation":887},"/services/","services",{"text":1117,"config":1118},"Contribute",{"href":1119,"dataGaName":1120,"dataGaLocation":887},"https://contributors.gitlab.com","contribute",{"text":1122,"config":1123},"Community",{"href":1124,"dataGaName":1125,"dataGaLocation":887},"/community/","community",{"text":1127,"config":1128},"Forum",{"href":1129,"dataGaName":1130,"dataGaLocation":887},"https://forum.gitlab.com/","forum",{"text":1132,"config":1133},"Events",{"href":1134,"dataGaName":1135,"dataGaLocation":887},"/events/","events",{"text":1137,"config":1138},"Partners",{"href":1139,"dataGaName":1140,"dataGaLocation":887},"/partners/","partners",{"config":1142,"title":1145,"text":1146,"link":1147},{"background":1143,"textColor":1144},"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":1148,"config":1149},"Read the latest",{"href":1150,"dataGaName":1151,"dataGaLocation":887},"/whats-new/","whats new",{"text":1153,"config":1154,"menu":1156},"Company",{"dataNavLevelOne":1155},"company",{"type":938,"columns":1157},[1158],{"items":1159},[1160,1165,1171,1173,1178,1183,1188,1193,1198,1203],{"text":1161,"config":1162},"About",{"href":1163,"dataGaName":1164,"dataGaLocation":887},"/company/","about",{"text":1166,"config":1167,"footerGa":1170},"Jobs",{"href":1168,"dataGaName":1169,"dataGaLocation":887},"/jobs/","jobs",{"dataGaName":1169},{"text":1132,"config":1172},{"href":1134,"dataGaName":1135,"dataGaLocation":887},{"text":1174,"config":1175},"Leadership",{"href":1176,"dataGaName":1177,"dataGaLocation":887},"/company/team/e-group/","leadership",{"text":1179,"config":1180},"Handbook",{"href":1181,"dataGaName":1182,"dataGaLocation":887},"https://handbook.gitlab.com/","handbook",{"text":1184,"config":1185},"Investor relations",{"href":1186,"dataGaName":1187,"dataGaLocation":887},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":1189,"config":1190},"Trust Center",{"href":1191,"dataGaName":1192,"dataGaLocation":887},"/security/","trust center",{"text":1194,"config":1195},"AI Transparency Center",{"href":1196,"dataGaName":1197,"dataGaLocation":887},"/ai-transparency-center/","ai transparency center",{"text":1199,"config":1200},"Newsletter",{"href":1201,"dataGaName":1202,"dataGaLocation":887},"/company/contact/#contact-forms","newsletter",{"text":1204,"config":1205},"Press",{"href":1206,"dataGaName":1207,"dataGaLocation":887},"/press/","press",{"text":1209,"config":1210,"menu":1211},"Contact us",{"dataNavLevelOne":1155},{"type":938,"columns":1212},[1213],{"items":1214},[1215,1220,1225],{"text":1216,"config":1217},"Talk to sales",{"href":1218,"dataGaName":1219,"dataGaLocation":887},"/sales/","talk to sales",{"text":1221,"config":1222},"Support portal",{"href":1223,"dataGaName":1224,"dataGaLocation":887},"https://support.gitlab.com/hc/en-us","support portal",{"text":1226,"config":1227},"Customer portal",{"href":1228,"dataGaName":1229,"dataGaLocation":887},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":1231,"login":1232,"suggestions":1239},"Close",{"text":1233,"link":1234},"To search repositories and projects, login to",{"text":1235,"config":1236},"gitlab.com",{"href":901,"dataGaName":1237,"dataGaLocation":1238},"search login","search",{"text":1240,"default":1241},"Suggestions",[1242,1244,1248,1250,1254,1258],{"text":918,"config":1243},{"href":923,"dataGaName":918,"dataGaLocation":1238},{"text":1245,"config":1246},"Code Suggestions (AI)",{"href":1247,"dataGaName":1245,"dataGaLocation":1238},"/solutions/code-suggestions/",{"text":954,"config":1249},{"href":956,"dataGaName":954,"dataGaLocation":1238},{"text":1251,"config":1252},"GitLab on AWS",{"href":1253,"dataGaName":1251,"dataGaLocation":1238},"/partners/technology-partners/aws/",{"text":1255,"config":1256},"GitLab on Google Cloud",{"href":1257,"dataGaName":1255,"dataGaLocation":1238},"/partners/technology-partners/google-cloud-platform/",{"text":1259,"config":1260},"Why GitLab?",{"href":931,"dataGaName":1259,"dataGaLocation":1238},{"freeTrial":1262,"mobileIcon":1267,"desktopIcon":1272,"secondaryButton":1275},{"text":1263,"config":1264},"Start free trial",{"href":1265,"dataGaName":892,"dataGaLocation":1266},"https://gitlab.com/-/trials/new/","nav",{"altText":1268,"config":1269},"Gitlab Icon",{"src":1270,"dataGaName":1271,"dataGaLocation":1266},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":1268,"config":1273},{"src":1274,"dataGaName":1271,"dataGaLocation":1266},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":1276,"config":1277},"Get Started",{"href":1278,"dataGaName":1279,"dataGaLocation":1266},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":1281,"mobileIcon":1285,"desktopIcon":1287},{"text":1282,"config":1283},"Learn more about GitLab Duo",{"href":923,"dataGaName":1284,"dataGaLocation":1266},"gitlab duo",{"altText":1268,"config":1286},{"src":1270,"dataGaName":1271,"dataGaLocation":1266},{"altText":1268,"config":1288},{"src":1274,"dataGaName":1271,"dataGaLocation":1266},{"button":1290,"mobileIcon":1295,"desktopIcon":1297},{"text":1291,"config":1292},"/switch",{"href":1293,"dataGaName":1294,"dataGaLocation":1266},"#contact","switch",{"altText":1268,"config":1296},{"src":1270,"dataGaName":1271,"dataGaLocation":1266},{"altText":1268,"config":1298},{"src":1299,"dataGaName":1271,"dataGaLocation":1266},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":1301,"mobileIcon":1306,"desktopIcon":1308},{"text":1302,"config":1303},"Back to pricing",{"href":1036,"dataGaName":1304,"dataGaLocation":1266,"icon":1305},"back to pricing","GoBack",{"altText":1268,"config":1307},{"src":1270,"dataGaName":1271,"dataGaLocation":1266},{"altText":1268,"config":1309},{"src":1274,"dataGaName":1271,"dataGaLocation":1266},{"title":1311,"titleMobile":1312,"button":1313,"config":1318},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":929,"config":1314},{"href":1315,"dataGaName":1316,"dataGaLocation":1317},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":1319,"disabled":865},"release",{"data":1321},{"text":1322,"source":1323,"edit":1329,"contribute":1334,"config":1339,"items":1344,"minimal":1554},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":1324,"config":1325},"View page source",{"href":1326,"dataGaName":1327,"dataGaLocation":1328},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1330,"config":1331},"Edit this page",{"href":1332,"dataGaName":1333,"dataGaLocation":1328},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1335,"config":1336},"Please contribute",{"href":1337,"dataGaName":1338,"dataGaLocation":1328},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1340,"facebook":1341,"youtube":1342,"linkedin":1343},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[1345,1392,1446,1490,1522],{"title":1034,"links":1346,"subMenu":1361},[1347,1351,1356],{"text":1348,"config":1349},"View plans",{"href":1036,"dataGaName":1350,"dataGaLocation":1328},"view plans",{"text":1352,"config":1353},"Why Premium?",{"href":1354,"dataGaName":1355,"dataGaLocation":1328},"/pricing/premium/","why premium",{"text":1357,"config":1358},"Why Ultimate?",{"href":1359,"dataGaName":1360,"dataGaLocation":1328},"/pricing/ultimate/","why ultimate",[1362],{"title":1363,"links":1364},"Contact Us",[1365,1368,1370,1372,1377,1382,1387],{"text":1366,"config":1367},"Contact sales",{"href":1218,"dataGaName":897,"dataGaLocation":1328},{"text":1221,"config":1369},{"href":1223,"dataGaName":1224,"dataGaLocation":1328},{"text":1226,"config":1371},{"href":1228,"dataGaName":1229,"dataGaLocation":1328},{"text":1373,"config":1374},"Status",{"href":1375,"dataGaName":1376,"dataGaLocation":1328},"https://status.gitlab.com/","status",{"text":1378,"config":1379},"Terms of use",{"href":1380,"dataGaName":1381,"dataGaLocation":1328},"/terms/","terms of use",{"text":1383,"config":1384},"Privacy statement",{"href":1385,"dataGaName":1386,"dataGaLocation":1328},"/privacy/","privacy statement",{"text":1388,"config":1389},"Cookie preferences",{"dataGaName":1390,"dataGaLocation":1328,"id":1391,"isOneTrustButton":868},"cookie preferences","ot-sdk-btn",{"title":934,"links":1393,"subMenu":1402},[1394,1398],{"text":1395,"config":1396},"DevSecOps platform",{"href":916,"dataGaName":1397,"dataGaLocation":1328},"devsecops platform",{"text":1399,"config":1400},"AI-Assisted Development",{"href":923,"dataGaName":1401,"dataGaLocation":1328},"ai-assisted development",[1403],{"title":1404,"links":1405},"Topics",[1406,1411,1416,1421,1426,1431,1436,1441],{"text":1407,"config":1408},"CICD",{"href":1409,"dataGaName":1410,"dataGaLocation":1328},"/topics/ci-cd/","cicd",{"text":1412,"config":1413},"GitOps",{"href":1414,"dataGaName":1415,"dataGaLocation":1328},"/topics/gitops/","gitops",{"text":1417,"config":1418},"DevOps",{"href":1419,"dataGaName":1420,"dataGaLocation":1328},"/topics/devops/","devops",{"text":1422,"config":1423},"Version Control",{"href":1424,"dataGaName":1425,"dataGaLocation":1328},"/topics/version-control/","version control",{"text":1427,"config":1428},"DevSecOps",{"href":1429,"dataGaName":1430,"dataGaLocation":1328},"/topics/devsecops/","devsecops",{"text":1432,"config":1433},"Cloud Native",{"href":1434,"dataGaName":1435,"dataGaLocation":1328},"/topics/cloud-native/","cloud native",{"text":1437,"config":1438},"AI for Coding",{"href":1439,"dataGaName":1440,"dataGaLocation":1328},"/topics/devops/ai-for-coding/","ai for coding",{"text":1442,"config":1443},"Agentic AI",{"href":1444,"dataGaName":1445,"dataGaLocation":1328},"/topics/agentic-ai/","agentic ai",{"title":1447,"links":1448},"Solutions",[1449,1451,1453,1458,1462,1465,1469,1472,1474,1477,1480,1485],{"text":978,"config":1450},{"href":973,"dataGaName":978,"dataGaLocation":1328},{"text":967,"config":1452},{"href":950,"dataGaName":951,"dataGaLocation":1328},{"text":1454,"config":1455},"Agile development",{"href":1456,"dataGaName":1457,"dataGaLocation":1328},"/solutions/agile-delivery/","agile delivery",{"text":1459,"config":1460},"SCM",{"href":963,"dataGaName":1461,"dataGaLocation":1328},"source code management",{"text":1407,"config":1463},{"href":956,"dataGaName":1464,"dataGaLocation":1328},"continuous integration & delivery",{"text":1466,"config":1467},"Value stream management",{"href":1006,"dataGaName":1468,"dataGaLocation":1328},"value stream management",{"text":1412,"config":1470},{"href":1471,"dataGaName":1415,"dataGaLocation":1328},"/solutions/gitops/",{"text":1016,"config":1473},{"href":1019,"dataGaName":1020,"dataGaLocation":1328},{"text":1475,"config":1476},"Small business",{"href":1025,"dataGaName":1026,"dataGaLocation":1328},{"text":1478,"config":1479},"Public sector",{"href":1031,"dataGaName":1032,"dataGaLocation":1328},{"text":1481,"config":1482},"Education",{"href":1483,"dataGaName":1484,"dataGaLocation":1328},"/solutions/education/","education",{"text":1486,"config":1487},"Financial services",{"href":1488,"dataGaName":1489,"dataGaLocation":1328},"/solutions/finance/","financial services",{"title":1039,"links":1491},[1492,1494,1496,1498,1501,1503,1506,1508,1510,1512,1514,1516,1518,1520],{"text":1052,"config":1493},{"href":1054,"dataGaName":1055,"dataGaLocation":1328},{"text":1057,"config":1495},{"href":1059,"dataGaName":1060,"dataGaLocation":1328},{"text":1062,"config":1497},{"href":1064,"dataGaName":1065,"dataGaLocation":1328},{"text":1067,"config":1499},{"href":1069,"dataGaName":1500,"dataGaLocation":1328},"docs",{"text":1090,"config":1502},{"href":1092,"dataGaName":1093,"dataGaLocation":1328},{"text":1504,"config":1505},"What's new",{"href":1150,"dataGaName":1151,"dataGaLocation":1328},{"text":1085,"config":1507},{"href":1087,"dataGaName":1088,"dataGaLocation":1328},{"text":1104,"config":1509},{"href":1106,"dataGaName":1107,"dataGaLocation":1328},{"text":1112,"config":1511},{"href":1114,"dataGaName":1115,"dataGaLocation":1328},{"text":1117,"config":1513},{"href":1119,"dataGaName":1120,"dataGaLocation":1328},{"text":1122,"config":1515},{"href":1124,"dataGaName":1125,"dataGaLocation":1328},{"text":1127,"config":1517},{"href":1129,"dataGaName":1130,"dataGaLocation":1328},{"text":1132,"config":1519},{"href":1134,"dataGaName":1135,"dataGaLocation":1328},{"text":1137,"config":1521},{"href":1139,"dataGaName":1140,"dataGaLocation":1328},{"title":1153,"links":1523},[1524,1526,1528,1530,1532,1534,1538,1543,1545,1547,1549],{"text":1161,"config":1525},{"href":1163,"dataGaName":1155,"dataGaLocation":1328},{"text":1166,"config":1527},{"href":1168,"dataGaName":1169,"dataGaLocation":1328},{"text":1174,"config":1529},{"href":1176,"dataGaName":1177,"dataGaLocation":1328},{"text":1179,"config":1531},{"href":1181,"dataGaName":1182,"dataGaLocation":1328},{"text":1184,"config":1533},{"href":1186,"dataGaName":1187,"dataGaLocation":1328},{"text":1535,"config":1536},"Sustainability",{"href":1537,"dataGaName":1535,"dataGaLocation":1328},"/sustainability/",{"text":1539,"config":1540},"Diversity, inclusion and belonging (DIB)",{"href":1541,"dataGaName":1542,"dataGaLocation":1328},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":1189,"config":1544},{"href":1191,"dataGaName":1192,"dataGaLocation":1328},{"text":1199,"config":1546},{"href":1201,"dataGaName":1202,"dataGaLocation":1328},{"text":1204,"config":1548},{"href":1206,"dataGaName":1207,"dataGaLocation":1328},{"text":1550,"config":1551},"Modern Slavery Transparency Statement",{"href":1552,"dataGaName":1553,"dataGaLocation":1328},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1555},[1556,1559,1562],{"text":1557,"config":1558},"Terms",{"href":1380,"dataGaName":1381,"dataGaLocation":1328},{"text":1560,"config":1561},"Cookies",{"dataGaName":1390,"dataGaLocation":1328,"id":1391,"isOneTrustButton":868},{"text":1563,"config":1564},"Privacy",{"href":1385,"dataGaName":1386,"dataGaLocation":1328},[1566],{"id":1567,"title":7,"body":864,"config":1568,"content":1570,"description":864,"extension":1574,"meta":1575,"navigation":868,"path":1576,"seo":1577,"stem":1578,"__hash__":1579},"blogAuthors/en-us/blog/authors/abubakar-siddiq-ango.yml",{"template":1569},"BlogAuthor",{"name":7,"config":1571},{"headshot":1572,"ctfId":1573},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749660104/Blog/Author%20Headshots/abuango-headshot.jpg","abuango","yml",{},"/en-us/blog/authors/abubakar-siddiq-ango",{},"en-us/blog/authors/abubakar-siddiq-ango","u5Jv4JxCpfmcGQuXEU4Lr5xVBJP9LAB2NkXRMLeYwPE",[1581,1590,1598],{"title":1582,"description":1583,"heroImage":1584,"category":860,"date":1585,"authors":1586,"slug":1589,"externalUrl":864},"Confidential AI for GitLab Self-Hosted","Give developers AI coding agents in GitLab Duo without source code leaving a hardware-encrypted boundary — no GPUs needed.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1773866173/vte9qh8rriznvyclhkes.png","2026-08-06",[1587,1588],"Mathias Ewald","Martin Paloncy, Edgeless Systems","confidential-ai-for-gitlab-self-hosted",{"title":1591,"description":1592,"heroImage":1593,"category":860,"date":1594,"authors":1595,"slug":1597,"externalUrl":864},"Green DevOps: Why carbon measurement belongs in your CI/CD pipeline","CI/CD pipelines have a hidden carbon cost. Here's why measuring it matters, and how you can get started with Eco CI and Carmen in GitLab.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1765809212/noh0mdfn9o94ry9ykura.png","2026-07-09",[1596],"Lysanne Pinto","green-devops-carbon-measurement-cicd-pipeline",{"title":1599,"description":1600,"heroImage":1601,"category":860,"date":1602,"authors":1603,"slug":1605,"externalUrl":864},"How to build CI/CD observability at scale","This practical guide to GitLab pipeline analytics helps self-managed users gain operational insights using Prometheus and Grafana.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1774465167/n5hlvrsrheadeccyr1oz.png","2026-04-28",[1604],"Paul Meresanu","how-to-build-ci-cd-observability-at-scale",{"promotions":1607},[1608,1622,1634,1646],{"id":1609,"categories":1610,"header":1612,"text":1613,"button":1614,"image":1619},"ai-modernization",[1611],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1615,"config":1616},"Get your AI maturity score",{"href":1617,"dataGaName":1618,"dataGaLocation":1093},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1620},{"src":1621},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1623,"categories":1624,"header":1626,"text":1613,"button":1627,"image":1631},"devops-modernization",[1625,1430],"product","Are you just managing tools or shipping innovation?",{"text":1628,"config":1629},"Get your DevOps maturity score",{"href":1630,"dataGaName":1618,"dataGaLocation":1093},"/assessments/devops-modernization-assessment/",{"config":1632},{"src":1633},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1635,"categories":1636,"header":1638,"text":1613,"button":1639,"image":1643},"security-modernization",[1637],"security","Are you trading speed for security?",{"text":1640,"config":1641},"Get your security maturity score",{"href":1642,"dataGaName":1618,"dataGaLocation":1093},"/assessments/security-modernization-assessment/",{"config":1644},{"src":1645},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1647,"paths":1648,"header":1651,"text":1652,"button":1653,"image":1658},"github-azure-migration",[1649,1650],"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":1654,"config":1655},"See how GitLab compares to GitHub",{"href":1656,"dataGaName":1657,"dataGaLocation":1093},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1659},{"src":1633},{"header":1661,"blurb":1662,"button":1663,"secondaryButton":1668},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1664,"config":1665},"Get your free trial",{"href":1666,"dataGaName":892,"dataGaLocation":1667},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":1366,"config":1669},{"href":1218,"dataGaName":897,"dataGaLocation":1667},1786803748124]