[{"data":1,"prerenderedAt":4294},["ShallowReactive",2],{"/blog/setting-up-the-k-agent":3,"navigation-en-us":3511,"banner-en-us":3938,"footer-en-us":3948,"blog-post-authors-en-us-Fernando Diaz":4191,"blog-related-posts-en-us-setting-up-the-k-agent":4206,"blog-promotions-en-us":4231,"next-steps-en-us":4284},{"id":4,"title":5,"authors":6,"body":8,"category":3491,"date":3492,"description":3493,"extension":3494,"externalUrl":3495,"faq":3495,"featured":3496,"heroImage":3497,"meta":3498,"navigation":51,"path":3499,"seo":3500,"slug":3504,"stem":3505,"tags":3506,"template":3509,"updatedDate":3495,"__hash__":3510},"blogPosts/en-us/blog/setting-up-the-k-agent.md","How to deploy the GitLab Agent for Kubernetes with limited permissions",[7],"Fernando Diaz",{"type":9,"value":10,"toc":3478},"minimark",[11,36,39,42,52,57,60,68,73,80,112,116,119,133,140,154,164,171,178,186,189,198,205,213,220,229,235,240,247,252,259,264,269,359,364,397,402,405,450,455,458,463,483,487,494,498,505,509,523,527,553,560,2453,2456,2592,2606,2665,2668,2672,2675,2680,2691,2849,2860,3012,3017,3022,3073,3076,3081,3125,3128,3133,3370,3373,3378,3384,3389,3395,3410,3414,3417,3426,3438,3442,3474],[12,13,14,15,26,27,29,30,35],"p",{},"The ",[16,17,20,21,25],"a",{"href":18,"rel":19},"https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent",[],"GitLab Agent for Kubernetes (",[22,23,24],"code",{},"agentk",")"," is an active in-cluster component for solving GitLab and Kubernetes integration tasks in a secure and cloud-native way. The ",[22,28,24],{}," communicates to the GitLab Agent Server (KAS) to perform ",[16,31,34],{"href":32,"rel":33},"https://about.gitlab.com/topics/gitops/",[],"GitOps"," operations.",[12,37,38],{},"In many examples, we see the agent being deployed with global-level permissions on your Kubernetes cluster. There are use cases where we want to reduce the scope of what agentk has access to. In this guide I will provide information on deploying agentk on your cluster, limiting what namespaces it can access, as well as using it to deploy your applications.",[12,40,41],{},"Prefer a video? Watch the walkthrough below to learn how to deploy agentk to your cluster:",[43,44],"iframe",{"width":45,"height":46,"src":47,"title":48,"frameBorder":49,"allow":50,"allowFullScreen":51},560,315,"https://www.youtube-nocookie.com/embed/Sr3X5-O9HWA","YouTube video player","0","accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",true,[53,54,56],"h2",{"id":55},"how-it-works","How it works",[12,58,59],{},"Anytime a developer performs changes to a manifest file managed within GitLab, the agentk will apply these changes to the Kubernetes cluster.",[12,61,62,67],{},[63,64],"img",{"alt":65,"src":66},"Kagent flowchart","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398594/blog/Content%20Images/kagent-limited/1.png","\nHow a change to a manifest file in GitLab is applied to the Kubernetes cluster.",[12,69,14,70,72],{},[22,71,24],{}," and the KAS use bidirectional streaming to allow the connection acceptor (the gRPC server, GitLab Agent Server) to act as a client. The connection acceptor sends requests as gRPC replies.",[12,74,75,79],{},[63,76],{"alt":77,"src":78},"Bidirectional streaming flowchart","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398595/blog/Content%20Images/kagent-limited/2.png","\nHow bidirectional streaming with agentk works.",[81,82,83,87,92],"ul",{},[84,85,86],"li",{},"GitLab RoR is the main GitLab application. It uses gRPC to talk to kas.",[84,88,89,91],{},[22,90,24],{}," is the GitLab Agent for Kubernetes. It keeps a connection established to a\nkas instance, waiting for requests to process. It may also actively send information\nabout things happening in the cluster.",[84,93,94,95],{},"KAS is the GitLab Agent Server, and is responsible for:",[81,96,97,100,103,106,109],{},[84,98,99],{},"Accepting requests from agentk",[84,101,102],{},"Authentication of requests from agentk by querying GitLab RoR",[84,104,105],{},"Fetching the agent's configuration file from a corresponding Git repository by querying Gitaly",[84,107,108],{},"Matching incoming requests from GitLab RoR with existing connections from the right agentk, forwarding requests to it, and forwarding responses back",[84,110,111],{},"Polling manifest repositories for GitOps support by communicating with Gitaly",[53,113,115],{"id":114},"how-to-deploy-the-gitlab-agent","How to deploy the GitLab Agent",[12,117,118],{},"In order to deploy the agent, we require the following:",[81,120,121,124],{},[84,122,123],{},"Kubernetes cluster (I am using Google Kubernetes Engine, or GKE)",[84,125,126,127,132],{},"The GitLab project which will hold the agentk configuration and deployment manifest, you can import ",[16,128,131],{"href":129,"rel":130},"https://gitlab.com/tech-marketing/devsecops/kubernetes-agent/simple-agent-k",[],"Simple Agent K"," which includes an application and CICD configured",[12,134,135,139],{},[136,137,138],"strong",{},"Note:"," The agentk configuration file and deployment manifests can be located in different projects. It just depends how you want to organize the GitOps workflow.",[12,141,142,149,150,153],{},[136,143,144,145,148],{},"1. Create ",[22,146,147],{},".gitlab/agent/agent-name/config.yaml"," directory in your project"," and replace ",[22,151,152],{},"agent-name"," with whatever you want to name your agent.",[155,156,162],"pre",{"className":157,"code":159,"language":160,"meta":161},[158],"language-text","gitops:\n  manifest_projects:\n  - id: \"Your Project ID\"\n    paths:\n    - glob: '/manifests/*.{yaml,yml,json}'\n","text","",[22,163,159],{"__ignoreMap":161},[12,165,166,167,170],{},"Remember to replace ",[22,168,169],{},"Your Project ID"," with the projectID of your project, seen below:",[12,172,173,177],{},[63,174],{"alt":175,"src":176},"Replace projectID for your project","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398595/blog/Content%20Images/kagent-limited/3.png","\nFill in the projectID section with your information.",[12,179,180,182,183],{},[136,181,138],{}," You can also use the path to the project in GitLab, i.e., mygroup/mysub/myproject.\n",[136,184,185],{},"2. Create agent record in GitLab",[12,187,188],{},"A GitLab Rails Agent record is used to associate the cluster with the configuration repository project.",[81,190,191],{},[84,192,193,194,197],{},"Go to ",[136,195,196],{},"Infrastructure > Kubernetes"," tab",[12,199,200,204],{},[63,201],{"alt":202,"src":203},"Click Kubernetes cluster tab","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398595/blog/Content%20Images/kagent-limited/4.png","\nClick the Kubernetes cluster tab in GitLab.",[81,206,207],{},[84,208,209,210,197],{},"Click on the ",[136,211,212],{},"GitLab Agent managed clusters",[12,214,215,219],{},[63,216],{"alt":217,"src":218},"Click GitLab Agent tab","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398596/blog/Content%20Images/kagent-limited/5.png","\nWhat the GitLab Agent tab looks like",[81,221,222],{},[84,223,224,225,228],{},"Click the ",[136,226,227],{},"Install a new GitLab Agent"," button",[12,230,231,234],{},[63,232],{"alt":233,"src":218},"Click Install new GitLab Agent button","\nWhat the \"Install new GitLab agent\" button looks like.",[81,236,237],{},[84,238,239],{},"Select your agent",[12,241,242,246],{},[63,243],{"alt":244,"src":245},"How to select your agent in GitLab","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398596/blog/Content%20Images/kagent-limited/6.png","\nHow to select your agent in GitLab",[81,248,249],{},[84,250,251],{},"Save the provided token",[12,253,254,258],{},[63,255],{"alt":256,"src":257},"How to save your provided token","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398596/blog/Content%20Images/kagent-limited/7.png","\nClick here to save your provided token.",[12,260,261],{},[136,262,263],{},"3. Open a Terminal window",[12,265,266],{},[136,267,268],{},"4. Scope kubectl to your cluster",[155,270,274],{"className":271,"code":272,"language":273,"meta":161,"style":161},"language-shell shiki shiki-themes github-light","$ gcloud container clusters get-credentials fern-gitops-2 --zone us-central1-c --project group-cs-9b54eb\n\nFetching cluster endpoint and auth data.\nkubeconfig entry generated for fern-gitops-2.\n","shell",[22,275,276,314,320,341],{"__ignoreMap":161},[277,278,281,285,289,292,295,298,301,305,308,311],"span",{"class":279,"line":280},"line",1,[277,282,284],{"class":283},"s7eDp","$",[277,286,288],{"class":287},"sYBdl"," gcloud",[277,290,291],{"class":287}," container",[277,293,294],{"class":287}," clusters",[277,296,297],{"class":287}," get-credentials",[277,299,300],{"class":287}," fern-gitops-2",[277,302,304],{"class":303},"sYu0t"," --zone",[277,306,307],{"class":287}," us-central1-c",[277,309,310],{"class":303}," --project",[277,312,313],{"class":287}," group-cs-9b54eb\n",[277,315,317],{"class":279,"line":316},2,[277,318,319],{"emptyLinePlaceholder":51},"\n",[277,321,323,326,329,332,335,338],{"class":279,"line":322},3,[277,324,325],{"class":283},"Fetching",[277,327,328],{"class":287}," cluster",[277,330,331],{"class":287}," endpoint",[277,333,334],{"class":287}," and",[277,336,337],{"class":287}," auth",[277,339,340],{"class":287}," data.\n",[277,342,344,347,350,353,356],{"class":279,"line":343},4,[277,345,346],{"class":283},"kubeconfig",[277,348,349],{"class":287}," entry",[277,351,352],{"class":287}," generated",[277,354,355],{"class":287}," for",[277,357,358],{"class":287}," fern-gitops-2.\n",[12,360,361],{},[136,362,363],{},"5. Create the namespace for the Kubernetes agent",[155,365,367],{"className":271,"code":366,"language":273,"meta":161,"style":161},"$ kubectl create ns gitlab-kubernetes-agent\n\nnamespace/gitlab-kubernetes-agent created\n",[22,368,369,385,389],{"__ignoreMap":161},[277,370,371,373,376,379,382],{"class":279,"line":280},[277,372,284],{"class":283},[277,374,375],{"class":287}," kubectl",[277,377,378],{"class":287}," create",[277,380,381],{"class":287}," ns",[277,383,384],{"class":287}," gitlab-kubernetes-agent\n",[277,386,387],{"class":279,"line":316},[277,388,319],{"emptyLinePlaceholder":51},[277,390,391,394],{"class":279,"line":322},[277,392,393],{"class":283},"namespace/gitlab-kubernetes-agent",[277,395,396],{"class":287}," created\n",[12,398,399],{},[136,400,401],{},"6. Create agent secret",[12,403,404],{},"This secret is used to store the token needed to configure the agent.",[155,406,408],{"className":271,"code":407,"language":273,"meta":161,"style":161},"$ kubectl create secret generic -n gitlab-kubernetes-agent gitlab-kubernetes-agent-token --from-literal=token='YOUR_AGENT_TOKEN'\n\nsecret/gitlab-kubernetes-agent-token created\n",[22,409,410,439,443],{"__ignoreMap":161},[277,411,412,414,416,418,421,424,427,430,433,436],{"class":279,"line":280},[277,413,284],{"class":283},[277,415,375],{"class":287},[277,417,378],{"class":287},[277,419,420],{"class":287}," secret",[277,422,423],{"class":287}," generic",[277,425,426],{"class":303}," -n",[277,428,429],{"class":287}," gitlab-kubernetes-agent",[277,431,432],{"class":287}," gitlab-kubernetes-agent-token",[277,434,435],{"class":303}," --from-literal=token=",[277,437,438],{"class":287},"'YOUR_AGENT_TOKEN'\n",[277,440,441],{"class":279,"line":316},[277,442,319],{"emptyLinePlaceholder":51},[277,444,445,448],{"class":279,"line":322},[277,446,447],{"class":283},"secret/gitlab-kubernetes-agent-token",[277,449,396],{"class":287},[12,451,452],{},[136,453,454],{},"7. Apply the agentk deployment with limited access",[12,456,457],{},"In this deployment below, we will create the following:",[459,460,462],"h3",{"id":461},"namespaces","Namespaces",[81,464,465,471,477],{},[84,466,467,470],{},[136,468,469],{},"gitlab-kubernetes-agent",": Where the agent will be deployed",[84,472,473,476],{},[136,474,475],{},"dude",": A namespace where agentk has permission to deploy",[84,478,479,482],{},[136,480,481],{},"naww",": A namespace where the agentk has no permissions",[459,484,486],{"id":485},"service-accounts","Service accounts",[81,488,489],{},[84,490,491,493],{},[136,492,469],{},": Service account used for running agentk",[459,495,497],{"id":496},"deployments","Deployments",[81,499,500],{},[84,501,502,504],{},[136,503,469],{},": The actual agentk client application",[459,506,508],{"id":507},"cluster-roles-and-bindings","Cluster roles and bindings",[81,510,511,517],{},[84,512,513,516],{},[136,514,515],{},"gitlab-kubernetes-agent-write-cm:"," Permission for agentk to write all configmaps on the cluster",[84,518,519,522],{},[136,520,521],{},"gitlab-kubernetes-agent-read-cm:"," Permission for agentk to read all configmaps on the cluster",[459,524,526],{"id":525},"roles-and-bindings","Roles and bindings",[81,528,529,535,541,547],{},[84,530,531,534],{},[136,532,533],{},"gitlab-kubernetes-agent-write",": Permission for agentk to write all resources on gitlab-kubernetes-agent ns",[84,536,537,540],{},[136,538,539],{},"gitlab-kubernetes-agent-read",": Permission for agentk to read all resources on gitlab-kubernetes-agent ns",[84,542,543,546],{},[136,544,545],{},"gitlab-kubernetes-agent-write-dude",": Permission for agentk to write all resources on dude ns",[84,548,549,552],{},[136,550,551],{},"gitlab-kubernetes-agent-read-dude",": Permission for agentk to read all resources on dude ns",[12,554,555,556,559],{},"The next step is to create the deployment file ",[22,557,558],{},"agentk.yaml",":",[155,561,565],{"className":562,"code":563,"language":564,"meta":161,"style":161},"language-yaml shiki shiki-themes github-light","apiVersion: v1\nkind: Namespace\nmetadata:\n  name: dude\n---\napiVersion: v1\nkind: Namespace\nmetadata:\n  name: naww\n---\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: gitlab-kubernetes-agent\n  namespace: gitlab-kubernetes-agent\n---\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: gitlab-kubernetes-agent\n  namespace: gitlab-kubernetes-agent\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      app: gitlab-kubernetes-agent\n  template:\n    metadata:\n      labels:\n        app: gitlab-kubernetes-agent\n      namespace: gitlab-kubernetes-agent\n    spec:\n      serviceAccountName: gitlab-kubernetes-agent\n      containers:\n      - name: agent\n        image: \"registry.gitlab.com/gitlab-org/cluster-integration/gitlab-agent/agentk:stable\"\n        args:\n        - --token-file=/config/token\n        - --kas-address\n        - wss://kas.gitlab.com # for GitLab.com users, use this KAS.\n        volumeMounts:\n        - name: token-volume\n          mountPath: /config\n      volumes:\n      - name: token-volume\n        secret:\n          secretName: gitlab-kubernetes-agent-token\n  strategy:\n    type: RollingUpdate\n    rollingUpdate:\n      maxSurge: 0\n      maxUnavailable: 1\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRole\nmetadata:\n  name: gitlab-kubernetes-agent-write-cm\nrules:\n- resources:\n  - 'configmaps'\n  apiGroups:\n  - ''\n  verbs:\n  - create\n  - update\n  - delete\n  - patch\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRoleBinding\nmetadata:\n  name: gitlab-kubernetes-agent-write-binding-cm\nroleRef:\n  name: gitlab-kubernetes-agent-write-cm\n  kind: ClusterRole\n  apiGroup: rbac.authorization.k8s.io\nsubjects:\n- name: gitlab-kubernetes-agent\n  kind: ServiceAccount\n  namespace: gitlab-kubernetes-agent\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRole\nmetadata:\n  name: gitlab-kubernetes-agent-read-cm\nrules:\n- resources:\n  - 'configmaps'\n  apiGroups:\n  - ''\n  verbs:\n  - get\n  - list\n  - watch\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRoleBinding\nmetadata:\n  name: gitlab-kubernetes-agent-read-binding-cm\nroleRef:\n  name: gitlab-kubernetes-agent-read-cm\n  kind: ClusterRole\n  apiGroup: rbac.authorization.k8s.io\nsubjects:\n- name: gitlab-kubernetes-agent\n  kind: ServiceAccount\n  namespace: gitlab-kubernetes-agent\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: Role\nmetadata:\n  namespace: gitlab-kubernetes-agent\n  name: gitlab-kubernetes-agent-write\nrules:\n- resources:\n  - '*'\n  apiGroups:\n  - '*'\n  verbs:\n  - create\n  - update\n  - delete\n  - patch\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: RoleBinding\nmetadata:\n  namespace: gitlab-kubernetes-agent\n  name: gitlab-kubernetes-agent-write-binding\nroleRef:\n  name: gitlab-kubernetes-agent-write\n  kind: Role\n  apiGroup: rbac.authorization.k8s.io\nsubjects:\n- name: gitlab-kubernetes-agent\n  kind: ServiceAccount\n  namespace: gitlab-kubernetes-agent\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: Role\nmetadata:\n  namespace: gitlab-kubernetes-agent\n  name: gitlab-kubernetes-agent-read\nrules:\n- resources:\n  - '*'\n  apiGroups:\n  - '*'\n  verbs:\n  - get\n  - list\n  - watch\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: RoleBinding\nmetadata:\n  namespace: gitlab-kubernetes-agent\n  name: gitlab-kubernetes-agent-read-binding\nroleRef:\n  name: gitlab-kubernetes-agent-read\n  kind: Role\n  apiGroup: rbac.authorization.k8s.io\nsubjects:\n- name: gitlab-kubernetes-agent\n  kind: ServiceAccount\n  namespace: gitlab-kubernetes-agent\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: Role\nmetadata:\n  namespace: dude\n  name: gitlab-kubernetes-agent-write-dude\nrules:\n- resources:\n  - '*'\n  apiGroups:\n  - '*'\n  verbs:\n  - create\n  - update\n  - delete\n  - patch\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: RoleBinding\nmetadata:\n  namespace: dude\n  name: gitlab-kubernetes-agent-write-binding-dude\nroleRef:\n  name: gitlab-kubernetes-agent-write-dude\n  kind: Role\n  apiGroup: rbac.authorization.k8s.io\nsubjects:\n- name: gitlab-kubernetes-agent\n  kind: ServiceAccount\n  namespace: gitlab-kubernetes-agent\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: Role\nmetadata:\n  namespace: dude\n  name: gitlab-kubernetes-agent-read-dude\nrules:\n- resources:\n  - '*'\n  apiGroups:\n  - '*'\n  verbs:\n  - get\n  - list\n  - watch\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: RoleBinding\nmetadata:\n  namespace: dude\n  name: gitlab-kubernetes-agent-read-binding-dude\nroleRef:\n  name: gitlab-kubernetes-agent-read-dude\n  kind: Role\n  apiGroup: rbac.authorization.k8s.io\nsubjects:\n- name: gitlab-kubernetes-agent\n  kind: ServiceAccount\n  namespace: gitlab-kubernetes-agent\n","yaml",[22,566,567,580,590,598,608,614,623,632,639,649,654,663,673,680,690,700,705,715,725,732,741,750,758,769,777,785,795,803,811,819,829,839,847,857,865,879,890,898,907,915,927,935,947,958,966,977,985,996,1004,1015,1023,1034,1044,1049,1059,1069,1076,1086,1094,1105,1114,1122,1130,1138,1146,1154,1162,1170,1175,1184,1194,1201,1211,1219,1228,1238,1249,1257,1268,1277,1286,1291,1300,1309,1316,1326,1333,1342,1349,1356,1363,1370,1378,1386,1394,1399,1408,1417,1424,1434,1441,1450,1459,1468,1475,1486,1495,1504,1509,1518,1528,1535,1544,1554,1561,1570,1578,1585,1592,1599,1606,1613,1620,1627,1632,1641,1651,1658,1667,1677,1684,1693,1702,1711,1718,1729,1738,1747,1752,1761,1770,1777,1786,1796,1803,1812,1819,1826,1833,1840,1847,1854,1861,1866,1875,1884,1891,1900,1910,1917,1926,1935,1944,1951,1962,1971,1980,1985,1994,2003,2010,2019,2029,2036,2045,2052,2059,2066,2073,2080,2087,2094,2101,2106,2115,2124,2131,2140,2150,2157,2166,2175,2184,2191,2202,2211,2220,2225,2234,2243,2250,2259,2269,2276,2285,2292,2299,2306,2313,2320,2327,2334,2339,2348,2357,2364,2373,2383,2390,2399,2408,2417,2424,2435,2444],{"__ignoreMap":161},[277,568,569,573,577],{"class":279,"line":280},[277,570,572],{"class":571},"shJU0","apiVersion",[277,574,576],{"class":575},"sgsFI",": ",[277,578,579],{"class":287},"v1\n",[277,581,582,585,587],{"class":279,"line":316},[277,583,584],{"class":571},"kind",[277,586,576],{"class":575},[277,588,589],{"class":287},"Namespace\n",[277,591,592,595],{"class":279,"line":322},[277,593,594],{"class":571},"metadata",[277,596,597],{"class":575},":\n",[277,599,600,603,605],{"class":279,"line":343},[277,601,602],{"class":571},"  name",[277,604,576],{"class":575},[277,606,607],{"class":287},"dude\n",[277,609,611],{"class":279,"line":610},5,[277,612,613],{"class":283},"---\n",[277,615,617,619,621],{"class":279,"line":616},6,[277,618,572],{"class":571},[277,620,576],{"class":575},[277,622,579],{"class":287},[277,624,626,628,630],{"class":279,"line":625},7,[277,627,584],{"class":571},[277,629,576],{"class":575},[277,631,589],{"class":287},[277,633,635,637],{"class":279,"line":634},8,[277,636,594],{"class":571},[277,638,597],{"class":575},[277,640,642,644,646],{"class":279,"line":641},9,[277,643,602],{"class":571},[277,645,576],{"class":575},[277,647,648],{"class":287},"naww\n",[277,650,652],{"class":279,"line":651},10,[277,653,613],{"class":283},[277,655,657,659,661],{"class":279,"line":656},11,[277,658,572],{"class":571},[277,660,576],{"class":575},[277,662,579],{"class":287},[277,664,666,668,670],{"class":279,"line":665},12,[277,667,584],{"class":571},[277,669,576],{"class":575},[277,671,672],{"class":287},"ServiceAccount\n",[277,674,676,678],{"class":279,"line":675},13,[277,677,594],{"class":571},[277,679,597],{"class":575},[277,681,683,685,687],{"class":279,"line":682},14,[277,684,602],{"class":571},[277,686,576],{"class":575},[277,688,689],{"class":287},"gitlab-kubernetes-agent\n",[277,691,693,696,698],{"class":279,"line":692},15,[277,694,695],{"class":571},"  namespace",[277,697,576],{"class":575},[277,699,689],{"class":287},[277,701,703],{"class":279,"line":702},16,[277,704,613],{"class":283},[277,706,708,710,712],{"class":279,"line":707},17,[277,709,572],{"class":571},[277,711,576],{"class":575},[277,713,714],{"class":287},"apps/v1\n",[277,716,718,720,722],{"class":279,"line":717},18,[277,719,584],{"class":571},[277,721,576],{"class":575},[277,723,724],{"class":287},"Deployment\n",[277,726,728,730],{"class":279,"line":727},19,[277,729,594],{"class":571},[277,731,597],{"class":575},[277,733,735,737,739],{"class":279,"line":734},20,[277,736,602],{"class":571},[277,738,576],{"class":575},[277,740,689],{"class":287},[277,742,744,746,748],{"class":279,"line":743},21,[277,745,695],{"class":571},[277,747,576],{"class":575},[277,749,689],{"class":287},[277,751,753,756],{"class":279,"line":752},22,[277,754,755],{"class":571},"spec",[277,757,597],{"class":575},[277,759,761,764,766],{"class":279,"line":760},23,[277,762,763],{"class":571},"  replicas",[277,765,576],{"class":575},[277,767,768],{"class":303},"1\n",[277,770,772,775],{"class":279,"line":771},24,[277,773,774],{"class":571},"  selector",[277,776,597],{"class":575},[277,778,780,783],{"class":279,"line":779},25,[277,781,782],{"class":571},"    matchLabels",[277,784,597],{"class":575},[277,786,788,791,793],{"class":279,"line":787},26,[277,789,790],{"class":571},"      app",[277,792,576],{"class":575},[277,794,689],{"class":287},[277,796,798,801],{"class":279,"line":797},27,[277,799,800],{"class":571},"  template",[277,802,597],{"class":575},[277,804,806,809],{"class":279,"line":805},28,[277,807,808],{"class":571},"    metadata",[277,810,597],{"class":575},[277,812,814,817],{"class":279,"line":813},29,[277,815,816],{"class":571},"      labels",[277,818,597],{"class":575},[277,820,822,825,827],{"class":279,"line":821},30,[277,823,824],{"class":571},"        app",[277,826,576],{"class":575},[277,828,689],{"class":287},[277,830,832,835,837],{"class":279,"line":831},31,[277,833,834],{"class":571},"      namespace",[277,836,576],{"class":575},[277,838,689],{"class":287},[277,840,842,845],{"class":279,"line":841},32,[277,843,844],{"class":571},"    spec",[277,846,597],{"class":575},[277,848,850,853,855],{"class":279,"line":849},33,[277,851,852],{"class":571},"      serviceAccountName",[277,854,576],{"class":575},[277,856,689],{"class":287},[277,858,860,863],{"class":279,"line":859},34,[277,861,862],{"class":571},"      containers",[277,864,597],{"class":575},[277,866,868,871,874,876],{"class":279,"line":867},35,[277,869,870],{"class":575},"      - ",[277,872,873],{"class":571},"name",[277,875,576],{"class":575},[277,877,878],{"class":287},"agent\n",[277,880,882,885,887],{"class":279,"line":881},36,[277,883,884],{"class":571},"        image",[277,886,576],{"class":575},[277,888,889],{"class":287},"\"registry.gitlab.com/gitlab-org/cluster-integration/gitlab-agent/agentk:stable\"\n",[277,891,893,896],{"class":279,"line":892},37,[277,894,895],{"class":571},"        args",[277,897,597],{"class":575},[277,899,901,904],{"class":279,"line":900},38,[277,902,903],{"class":575},"        - ",[277,905,906],{"class":287},"--token-file=/config/token\n",[277,908,910,912],{"class":279,"line":909},39,[277,911,903],{"class":575},[277,913,914],{"class":287},"--kas-address\n",[277,916,918,920,923],{"class":279,"line":917},40,[277,919,903],{"class":575},[277,921,922],{"class":287},"wss://kas.gitlab.com",[277,924,926],{"class":925},"sAwPA"," # for GitLab.com users, use this KAS.\n",[277,928,930,933],{"class":279,"line":929},41,[277,931,932],{"class":571},"        volumeMounts",[277,934,597],{"class":575},[277,936,938,940,942,944],{"class":279,"line":937},42,[277,939,903],{"class":575},[277,941,873],{"class":571},[277,943,576],{"class":575},[277,945,946],{"class":287},"token-volume\n",[277,948,950,953,955],{"class":279,"line":949},43,[277,951,952],{"class":571},"          mountPath",[277,954,576],{"class":575},[277,956,957],{"class":287},"/config\n",[277,959,961,964],{"class":279,"line":960},44,[277,962,963],{"class":571},"      volumes",[277,965,597],{"class":575},[277,967,969,971,973,975],{"class":279,"line":968},45,[277,970,870],{"class":575},[277,972,873],{"class":571},[277,974,576],{"class":575},[277,976,946],{"class":287},[277,978,980,983],{"class":279,"line":979},46,[277,981,982],{"class":571},"        secret",[277,984,597],{"class":575},[277,986,988,991,993],{"class":279,"line":987},47,[277,989,990],{"class":571},"          secretName",[277,992,576],{"class":575},[277,994,995],{"class":287},"gitlab-kubernetes-agent-token\n",[277,997,999,1002],{"class":279,"line":998},48,[277,1000,1001],{"class":571},"  strategy",[277,1003,597],{"class":575},[277,1005,1007,1010,1012],{"class":279,"line":1006},49,[277,1008,1009],{"class":571},"    type",[277,1011,576],{"class":575},[277,1013,1014],{"class":287},"RollingUpdate\n",[277,1016,1018,1021],{"class":279,"line":1017},50,[277,1019,1020],{"class":571},"    rollingUpdate",[277,1022,597],{"class":575},[277,1024,1026,1029,1031],{"class":279,"line":1025},51,[277,1027,1028],{"class":571},"      maxSurge",[277,1030,576],{"class":575},[277,1032,1033],{"class":303},"0\n",[277,1035,1037,1040,1042],{"class":279,"line":1036},52,[277,1038,1039],{"class":571},"      maxUnavailable",[277,1041,576],{"class":575},[277,1043,768],{"class":303},[277,1045,1047],{"class":279,"line":1046},53,[277,1048,613],{"class":283},[277,1050,1052,1054,1056],{"class":279,"line":1051},54,[277,1053,572],{"class":571},[277,1055,576],{"class":575},[277,1057,1058],{"class":287},"rbac.authorization.k8s.io/v1\n",[277,1060,1062,1064,1066],{"class":279,"line":1061},55,[277,1063,584],{"class":571},[277,1065,576],{"class":575},[277,1067,1068],{"class":287},"ClusterRole\n",[277,1070,1072,1074],{"class":279,"line":1071},56,[277,1073,594],{"class":571},[277,1075,597],{"class":575},[277,1077,1079,1081,1083],{"class":279,"line":1078},57,[277,1080,602],{"class":571},[277,1082,576],{"class":575},[277,1084,1085],{"class":287},"gitlab-kubernetes-agent-write-cm\n",[277,1087,1089,1092],{"class":279,"line":1088},58,[277,1090,1091],{"class":571},"rules",[277,1093,597],{"class":575},[277,1095,1097,1100,1103],{"class":279,"line":1096},59,[277,1098,1099],{"class":575},"- ",[277,1101,1102],{"class":571},"resources",[277,1104,597],{"class":575},[277,1106,1108,1111],{"class":279,"line":1107},60,[277,1109,1110],{"class":575},"  - ",[277,1112,1113],{"class":287},"'configmaps'\n",[277,1115,1117,1120],{"class":279,"line":1116},61,[277,1118,1119],{"class":571},"  apiGroups",[277,1121,597],{"class":575},[277,1123,1125,1127],{"class":279,"line":1124},62,[277,1126,1110],{"class":575},[277,1128,1129],{"class":287},"''\n",[277,1131,1133,1136],{"class":279,"line":1132},63,[277,1134,1135],{"class":571},"  verbs",[277,1137,597],{"class":575},[277,1139,1141,1143],{"class":279,"line":1140},64,[277,1142,1110],{"class":575},[277,1144,1145],{"class":287},"create\n",[277,1147,1149,1151],{"class":279,"line":1148},65,[277,1150,1110],{"class":575},[277,1152,1153],{"class":287},"update\n",[277,1155,1157,1159],{"class":279,"line":1156},66,[277,1158,1110],{"class":575},[277,1160,1161],{"class":287},"delete\n",[277,1163,1165,1167],{"class":279,"line":1164},67,[277,1166,1110],{"class":575},[277,1168,1169],{"class":287},"patch\n",[277,1171,1173],{"class":279,"line":1172},68,[277,1174,613],{"class":283},[277,1176,1178,1180,1182],{"class":279,"line":1177},69,[277,1179,572],{"class":571},[277,1181,576],{"class":575},[277,1183,1058],{"class":287},[277,1185,1187,1189,1191],{"class":279,"line":1186},70,[277,1188,584],{"class":571},[277,1190,576],{"class":575},[277,1192,1193],{"class":287},"ClusterRoleBinding\n",[277,1195,1197,1199],{"class":279,"line":1196},71,[277,1198,594],{"class":571},[277,1200,597],{"class":575},[277,1202,1204,1206,1208],{"class":279,"line":1203},72,[277,1205,602],{"class":571},[277,1207,576],{"class":575},[277,1209,1210],{"class":287},"gitlab-kubernetes-agent-write-binding-cm\n",[277,1212,1214,1217],{"class":279,"line":1213},73,[277,1215,1216],{"class":571},"roleRef",[277,1218,597],{"class":575},[277,1220,1222,1224,1226],{"class":279,"line":1221},74,[277,1223,602],{"class":571},[277,1225,576],{"class":575},[277,1227,1085],{"class":287},[277,1229,1231,1234,1236],{"class":279,"line":1230},75,[277,1232,1233],{"class":571},"  kind",[277,1235,576],{"class":575},[277,1237,1068],{"class":287},[277,1239,1241,1244,1246],{"class":279,"line":1240},76,[277,1242,1243],{"class":571},"  apiGroup",[277,1245,576],{"class":575},[277,1247,1248],{"class":287},"rbac.authorization.k8s.io\n",[277,1250,1252,1255],{"class":279,"line":1251},77,[277,1253,1254],{"class":571},"subjects",[277,1256,597],{"class":575},[277,1258,1260,1262,1264,1266],{"class":279,"line":1259},78,[277,1261,1099],{"class":575},[277,1263,873],{"class":571},[277,1265,576],{"class":575},[277,1267,689],{"class":287},[277,1269,1271,1273,1275],{"class":279,"line":1270},79,[277,1272,1233],{"class":571},[277,1274,576],{"class":575},[277,1276,672],{"class":287},[277,1278,1280,1282,1284],{"class":279,"line":1279},80,[277,1281,695],{"class":571},[277,1283,576],{"class":575},[277,1285,689],{"class":287},[277,1287,1289],{"class":279,"line":1288},81,[277,1290,613],{"class":283},[277,1292,1294,1296,1298],{"class":279,"line":1293},82,[277,1295,572],{"class":571},[277,1297,576],{"class":575},[277,1299,1058],{"class":287},[277,1301,1303,1305,1307],{"class":279,"line":1302},83,[277,1304,584],{"class":571},[277,1306,576],{"class":575},[277,1308,1068],{"class":287},[277,1310,1312,1314],{"class":279,"line":1311},84,[277,1313,594],{"class":571},[277,1315,597],{"class":575},[277,1317,1319,1321,1323],{"class":279,"line":1318},85,[277,1320,602],{"class":571},[277,1322,576],{"class":575},[277,1324,1325],{"class":287},"gitlab-kubernetes-agent-read-cm\n",[277,1327,1329,1331],{"class":279,"line":1328},86,[277,1330,1091],{"class":571},[277,1332,597],{"class":575},[277,1334,1336,1338,1340],{"class":279,"line":1335},87,[277,1337,1099],{"class":575},[277,1339,1102],{"class":571},[277,1341,597],{"class":575},[277,1343,1345,1347],{"class":279,"line":1344},88,[277,1346,1110],{"class":575},[277,1348,1113],{"class":287},[277,1350,1352,1354],{"class":279,"line":1351},89,[277,1353,1119],{"class":571},[277,1355,597],{"class":575},[277,1357,1359,1361],{"class":279,"line":1358},90,[277,1360,1110],{"class":575},[277,1362,1129],{"class":287},[277,1364,1366,1368],{"class":279,"line":1365},91,[277,1367,1135],{"class":571},[277,1369,597],{"class":575},[277,1371,1373,1375],{"class":279,"line":1372},92,[277,1374,1110],{"class":575},[277,1376,1377],{"class":287},"get\n",[277,1379,1381,1383],{"class":279,"line":1380},93,[277,1382,1110],{"class":575},[277,1384,1385],{"class":287},"list\n",[277,1387,1389,1391],{"class":279,"line":1388},94,[277,1390,1110],{"class":575},[277,1392,1393],{"class":287},"watch\n",[277,1395,1397],{"class":279,"line":1396},95,[277,1398,613],{"class":283},[277,1400,1402,1404,1406],{"class":279,"line":1401},96,[277,1403,572],{"class":571},[277,1405,576],{"class":575},[277,1407,1058],{"class":287},[277,1409,1411,1413,1415],{"class":279,"line":1410},97,[277,1412,584],{"class":571},[277,1414,576],{"class":575},[277,1416,1193],{"class":287},[277,1418,1420,1422],{"class":279,"line":1419},98,[277,1421,594],{"class":571},[277,1423,597],{"class":575},[277,1425,1427,1429,1431],{"class":279,"line":1426},99,[277,1428,602],{"class":571},[277,1430,576],{"class":575},[277,1432,1433],{"class":287},"gitlab-kubernetes-agent-read-binding-cm\n",[277,1435,1437,1439],{"class":279,"line":1436},100,[277,1438,1216],{"class":571},[277,1440,597],{"class":575},[277,1442,1444,1446,1448],{"class":279,"line":1443},101,[277,1445,602],{"class":571},[277,1447,576],{"class":575},[277,1449,1325],{"class":287},[277,1451,1453,1455,1457],{"class":279,"line":1452},102,[277,1454,1233],{"class":571},[277,1456,576],{"class":575},[277,1458,1068],{"class":287},[277,1460,1462,1464,1466],{"class":279,"line":1461},103,[277,1463,1243],{"class":571},[277,1465,576],{"class":575},[277,1467,1248],{"class":287},[277,1469,1471,1473],{"class":279,"line":1470},104,[277,1472,1254],{"class":571},[277,1474,597],{"class":575},[277,1476,1478,1480,1482,1484],{"class":279,"line":1477},105,[277,1479,1099],{"class":575},[277,1481,873],{"class":571},[277,1483,576],{"class":575},[277,1485,689],{"class":287},[277,1487,1489,1491,1493],{"class":279,"line":1488},106,[277,1490,1233],{"class":571},[277,1492,576],{"class":575},[277,1494,672],{"class":287},[277,1496,1498,1500,1502],{"class":279,"line":1497},107,[277,1499,695],{"class":571},[277,1501,576],{"class":575},[277,1503,689],{"class":287},[277,1505,1507],{"class":279,"line":1506},108,[277,1508,613],{"class":283},[277,1510,1512,1514,1516],{"class":279,"line":1511},109,[277,1513,572],{"class":571},[277,1515,576],{"class":575},[277,1517,1058],{"class":287},[277,1519,1521,1523,1525],{"class":279,"line":1520},110,[277,1522,584],{"class":571},[277,1524,576],{"class":575},[277,1526,1527],{"class":287},"Role\n",[277,1529,1531,1533],{"class":279,"line":1530},111,[277,1532,594],{"class":571},[277,1534,597],{"class":575},[277,1536,1538,1540,1542],{"class":279,"line":1537},112,[277,1539,695],{"class":571},[277,1541,576],{"class":575},[277,1543,689],{"class":287},[277,1545,1547,1549,1551],{"class":279,"line":1546},113,[277,1548,602],{"class":571},[277,1550,576],{"class":575},[277,1552,1553],{"class":287},"gitlab-kubernetes-agent-write\n",[277,1555,1557,1559],{"class":279,"line":1556},114,[277,1558,1091],{"class":571},[277,1560,597],{"class":575},[277,1562,1564,1566,1568],{"class":279,"line":1563},115,[277,1565,1099],{"class":575},[277,1567,1102],{"class":571},[277,1569,597],{"class":575},[277,1571,1573,1575],{"class":279,"line":1572},116,[277,1574,1110],{"class":575},[277,1576,1577],{"class":287},"'*'\n",[277,1579,1581,1583],{"class":279,"line":1580},117,[277,1582,1119],{"class":571},[277,1584,597],{"class":575},[277,1586,1588,1590],{"class":279,"line":1587},118,[277,1589,1110],{"class":575},[277,1591,1577],{"class":287},[277,1593,1595,1597],{"class":279,"line":1594},119,[277,1596,1135],{"class":571},[277,1598,597],{"class":575},[277,1600,1602,1604],{"class":279,"line":1601},120,[277,1603,1110],{"class":575},[277,1605,1145],{"class":287},[277,1607,1609,1611],{"class":279,"line":1608},121,[277,1610,1110],{"class":575},[277,1612,1153],{"class":287},[277,1614,1616,1618],{"class":279,"line":1615},122,[277,1617,1110],{"class":575},[277,1619,1161],{"class":287},[277,1621,1623,1625],{"class":279,"line":1622},123,[277,1624,1110],{"class":575},[277,1626,1169],{"class":287},[277,1628,1630],{"class":279,"line":1629},124,[277,1631,613],{"class":283},[277,1633,1635,1637,1639],{"class":279,"line":1634},125,[277,1636,572],{"class":571},[277,1638,576],{"class":575},[277,1640,1058],{"class":287},[277,1642,1644,1646,1648],{"class":279,"line":1643},126,[277,1645,584],{"class":571},[277,1647,576],{"class":575},[277,1649,1650],{"class":287},"RoleBinding\n",[277,1652,1654,1656],{"class":279,"line":1653},127,[277,1655,594],{"class":571},[277,1657,597],{"class":575},[277,1659,1661,1663,1665],{"class":279,"line":1660},128,[277,1662,695],{"class":571},[277,1664,576],{"class":575},[277,1666,689],{"class":287},[277,1668,1670,1672,1674],{"class":279,"line":1669},129,[277,1671,602],{"class":571},[277,1673,576],{"class":575},[277,1675,1676],{"class":287},"gitlab-kubernetes-agent-write-binding\n",[277,1678,1680,1682],{"class":279,"line":1679},130,[277,1681,1216],{"class":571},[277,1683,597],{"class":575},[277,1685,1687,1689,1691],{"class":279,"line":1686},131,[277,1688,602],{"class":571},[277,1690,576],{"class":575},[277,1692,1553],{"class":287},[277,1694,1696,1698,1700],{"class":279,"line":1695},132,[277,1697,1233],{"class":571},[277,1699,576],{"class":575},[277,1701,1527],{"class":287},[277,1703,1705,1707,1709],{"class":279,"line":1704},133,[277,1706,1243],{"class":571},[277,1708,576],{"class":575},[277,1710,1248],{"class":287},[277,1712,1714,1716],{"class":279,"line":1713},134,[277,1715,1254],{"class":571},[277,1717,597],{"class":575},[277,1719,1721,1723,1725,1727],{"class":279,"line":1720},135,[277,1722,1099],{"class":575},[277,1724,873],{"class":571},[277,1726,576],{"class":575},[277,1728,689],{"class":287},[277,1730,1732,1734,1736],{"class":279,"line":1731},136,[277,1733,1233],{"class":571},[277,1735,576],{"class":575},[277,1737,672],{"class":287},[277,1739,1741,1743,1745],{"class":279,"line":1740},137,[277,1742,695],{"class":571},[277,1744,576],{"class":575},[277,1746,689],{"class":287},[277,1748,1750],{"class":279,"line":1749},138,[277,1751,613],{"class":283},[277,1753,1755,1757,1759],{"class":279,"line":1754},139,[277,1756,572],{"class":571},[277,1758,576],{"class":575},[277,1760,1058],{"class":287},[277,1762,1764,1766,1768],{"class":279,"line":1763},140,[277,1765,584],{"class":571},[277,1767,576],{"class":575},[277,1769,1527],{"class":287},[277,1771,1773,1775],{"class":279,"line":1772},141,[277,1774,594],{"class":571},[277,1776,597],{"class":575},[277,1778,1780,1782,1784],{"class":279,"line":1779},142,[277,1781,695],{"class":571},[277,1783,576],{"class":575},[277,1785,689],{"class":287},[277,1787,1789,1791,1793],{"class":279,"line":1788},143,[277,1790,602],{"class":571},[277,1792,576],{"class":575},[277,1794,1795],{"class":287},"gitlab-kubernetes-agent-read\n",[277,1797,1799,1801],{"class":279,"line":1798},144,[277,1800,1091],{"class":571},[277,1802,597],{"class":575},[277,1804,1806,1808,1810],{"class":279,"line":1805},145,[277,1807,1099],{"class":575},[277,1809,1102],{"class":571},[277,1811,597],{"class":575},[277,1813,1815,1817],{"class":279,"line":1814},146,[277,1816,1110],{"class":575},[277,1818,1577],{"class":287},[277,1820,1822,1824],{"class":279,"line":1821},147,[277,1823,1119],{"class":571},[277,1825,597],{"class":575},[277,1827,1829,1831],{"class":279,"line":1828},148,[277,1830,1110],{"class":575},[277,1832,1577],{"class":287},[277,1834,1836,1838],{"class":279,"line":1835},149,[277,1837,1135],{"class":571},[277,1839,597],{"class":575},[277,1841,1843,1845],{"class":279,"line":1842},150,[277,1844,1110],{"class":575},[277,1846,1377],{"class":287},[277,1848,1850,1852],{"class":279,"line":1849},151,[277,1851,1110],{"class":575},[277,1853,1385],{"class":287},[277,1855,1857,1859],{"class":279,"line":1856},152,[277,1858,1110],{"class":575},[277,1860,1393],{"class":287},[277,1862,1864],{"class":279,"line":1863},153,[277,1865,613],{"class":283},[277,1867,1869,1871,1873],{"class":279,"line":1868},154,[277,1870,572],{"class":571},[277,1872,576],{"class":575},[277,1874,1058],{"class":287},[277,1876,1878,1880,1882],{"class":279,"line":1877},155,[277,1879,584],{"class":571},[277,1881,576],{"class":575},[277,1883,1650],{"class":287},[277,1885,1887,1889],{"class":279,"line":1886},156,[277,1888,594],{"class":571},[277,1890,597],{"class":575},[277,1892,1894,1896,1898],{"class":279,"line":1893},157,[277,1895,695],{"class":571},[277,1897,576],{"class":575},[277,1899,689],{"class":287},[277,1901,1903,1905,1907],{"class":279,"line":1902},158,[277,1904,602],{"class":571},[277,1906,576],{"class":575},[277,1908,1909],{"class":287},"gitlab-kubernetes-agent-read-binding\n",[277,1911,1913,1915],{"class":279,"line":1912},159,[277,1914,1216],{"class":571},[277,1916,597],{"class":575},[277,1918,1920,1922,1924],{"class":279,"line":1919},160,[277,1921,602],{"class":571},[277,1923,576],{"class":575},[277,1925,1795],{"class":287},[277,1927,1929,1931,1933],{"class":279,"line":1928},161,[277,1930,1233],{"class":571},[277,1932,576],{"class":575},[277,1934,1527],{"class":287},[277,1936,1938,1940,1942],{"class":279,"line":1937},162,[277,1939,1243],{"class":571},[277,1941,576],{"class":575},[277,1943,1248],{"class":287},[277,1945,1947,1949],{"class":279,"line":1946},163,[277,1948,1254],{"class":571},[277,1950,597],{"class":575},[277,1952,1954,1956,1958,1960],{"class":279,"line":1953},164,[277,1955,1099],{"class":575},[277,1957,873],{"class":571},[277,1959,576],{"class":575},[277,1961,689],{"class":287},[277,1963,1965,1967,1969],{"class":279,"line":1964},165,[277,1966,1233],{"class":571},[277,1968,576],{"class":575},[277,1970,672],{"class":287},[277,1972,1974,1976,1978],{"class":279,"line":1973},166,[277,1975,695],{"class":571},[277,1977,576],{"class":575},[277,1979,689],{"class":287},[277,1981,1983],{"class":279,"line":1982},167,[277,1984,613],{"class":283},[277,1986,1988,1990,1992],{"class":279,"line":1987},168,[277,1989,572],{"class":571},[277,1991,576],{"class":575},[277,1993,1058],{"class":287},[277,1995,1997,1999,2001],{"class":279,"line":1996},169,[277,1998,584],{"class":571},[277,2000,576],{"class":575},[277,2002,1527],{"class":287},[277,2004,2006,2008],{"class":279,"line":2005},170,[277,2007,594],{"class":571},[277,2009,597],{"class":575},[277,2011,2013,2015,2017],{"class":279,"line":2012},171,[277,2014,695],{"class":571},[277,2016,576],{"class":575},[277,2018,607],{"class":287},[277,2020,2022,2024,2026],{"class":279,"line":2021},172,[277,2023,602],{"class":571},[277,2025,576],{"class":575},[277,2027,2028],{"class":287},"gitlab-kubernetes-agent-write-dude\n",[277,2030,2032,2034],{"class":279,"line":2031},173,[277,2033,1091],{"class":571},[277,2035,597],{"class":575},[277,2037,2039,2041,2043],{"class":279,"line":2038},174,[277,2040,1099],{"class":575},[277,2042,1102],{"class":571},[277,2044,597],{"class":575},[277,2046,2048,2050],{"class":279,"line":2047},175,[277,2049,1110],{"class":575},[277,2051,1577],{"class":287},[277,2053,2055,2057],{"class":279,"line":2054},176,[277,2056,1119],{"class":571},[277,2058,597],{"class":575},[277,2060,2062,2064],{"class":279,"line":2061},177,[277,2063,1110],{"class":575},[277,2065,1577],{"class":287},[277,2067,2069,2071],{"class":279,"line":2068},178,[277,2070,1135],{"class":571},[277,2072,597],{"class":575},[277,2074,2076,2078],{"class":279,"line":2075},179,[277,2077,1110],{"class":575},[277,2079,1145],{"class":287},[277,2081,2083,2085],{"class":279,"line":2082},180,[277,2084,1110],{"class":575},[277,2086,1153],{"class":287},[277,2088,2090,2092],{"class":279,"line":2089},181,[277,2091,1110],{"class":575},[277,2093,1161],{"class":287},[277,2095,2097,2099],{"class":279,"line":2096},182,[277,2098,1110],{"class":575},[277,2100,1169],{"class":287},[277,2102,2104],{"class":279,"line":2103},183,[277,2105,613],{"class":283},[277,2107,2109,2111,2113],{"class":279,"line":2108},184,[277,2110,572],{"class":571},[277,2112,576],{"class":575},[277,2114,1058],{"class":287},[277,2116,2118,2120,2122],{"class":279,"line":2117},185,[277,2119,584],{"class":571},[277,2121,576],{"class":575},[277,2123,1650],{"class":287},[277,2125,2127,2129],{"class":279,"line":2126},186,[277,2128,594],{"class":571},[277,2130,597],{"class":575},[277,2132,2134,2136,2138],{"class":279,"line":2133},187,[277,2135,695],{"class":571},[277,2137,576],{"class":575},[277,2139,607],{"class":287},[277,2141,2143,2145,2147],{"class":279,"line":2142},188,[277,2144,602],{"class":571},[277,2146,576],{"class":575},[277,2148,2149],{"class":287},"gitlab-kubernetes-agent-write-binding-dude\n",[277,2151,2153,2155],{"class":279,"line":2152},189,[277,2154,1216],{"class":571},[277,2156,597],{"class":575},[277,2158,2160,2162,2164],{"class":279,"line":2159},190,[277,2161,602],{"class":571},[277,2163,576],{"class":575},[277,2165,2028],{"class":287},[277,2167,2169,2171,2173],{"class":279,"line":2168},191,[277,2170,1233],{"class":571},[277,2172,576],{"class":575},[277,2174,1527],{"class":287},[277,2176,2178,2180,2182],{"class":279,"line":2177},192,[277,2179,1243],{"class":571},[277,2181,576],{"class":575},[277,2183,1248],{"class":287},[277,2185,2187,2189],{"class":279,"line":2186},193,[277,2188,1254],{"class":571},[277,2190,597],{"class":575},[277,2192,2194,2196,2198,2200],{"class":279,"line":2193},194,[277,2195,1099],{"class":575},[277,2197,873],{"class":571},[277,2199,576],{"class":575},[277,2201,689],{"class":287},[277,2203,2205,2207,2209],{"class":279,"line":2204},195,[277,2206,1233],{"class":571},[277,2208,576],{"class":575},[277,2210,672],{"class":287},[277,2212,2214,2216,2218],{"class":279,"line":2213},196,[277,2215,695],{"class":571},[277,2217,576],{"class":575},[277,2219,689],{"class":287},[277,2221,2223],{"class":279,"line":2222},197,[277,2224,613],{"class":283},[277,2226,2228,2230,2232],{"class":279,"line":2227},198,[277,2229,572],{"class":571},[277,2231,576],{"class":575},[277,2233,1058],{"class":287},[277,2235,2237,2239,2241],{"class":279,"line":2236},199,[277,2238,584],{"class":571},[277,2240,576],{"class":575},[277,2242,1527],{"class":287},[277,2244,2246,2248],{"class":279,"line":2245},200,[277,2247,594],{"class":571},[277,2249,597],{"class":575},[277,2251,2253,2255,2257],{"class":279,"line":2252},201,[277,2254,695],{"class":571},[277,2256,576],{"class":575},[277,2258,607],{"class":287},[277,2260,2262,2264,2266],{"class":279,"line":2261},202,[277,2263,602],{"class":571},[277,2265,576],{"class":575},[277,2267,2268],{"class":287},"gitlab-kubernetes-agent-read-dude\n",[277,2270,2272,2274],{"class":279,"line":2271},203,[277,2273,1091],{"class":571},[277,2275,597],{"class":575},[277,2277,2279,2281,2283],{"class":279,"line":2278},204,[277,2280,1099],{"class":575},[277,2282,1102],{"class":571},[277,2284,597],{"class":575},[277,2286,2288,2290],{"class":279,"line":2287},205,[277,2289,1110],{"class":575},[277,2291,1577],{"class":287},[277,2293,2295,2297],{"class":279,"line":2294},206,[277,2296,1119],{"class":571},[277,2298,597],{"class":575},[277,2300,2302,2304],{"class":279,"line":2301},207,[277,2303,1110],{"class":575},[277,2305,1577],{"class":287},[277,2307,2309,2311],{"class":279,"line":2308},208,[277,2310,1135],{"class":571},[277,2312,597],{"class":575},[277,2314,2316,2318],{"class":279,"line":2315},209,[277,2317,1110],{"class":575},[277,2319,1377],{"class":287},[277,2321,2323,2325],{"class":279,"line":2322},210,[277,2324,1110],{"class":575},[277,2326,1385],{"class":287},[277,2328,2330,2332],{"class":279,"line":2329},211,[277,2331,1110],{"class":575},[277,2333,1393],{"class":287},[277,2335,2337],{"class":279,"line":2336},212,[277,2338,613],{"class":283},[277,2340,2342,2344,2346],{"class":279,"line":2341},213,[277,2343,572],{"class":571},[277,2345,576],{"class":575},[277,2347,1058],{"class":287},[277,2349,2351,2353,2355],{"class":279,"line":2350},214,[277,2352,584],{"class":571},[277,2354,576],{"class":575},[277,2356,1650],{"class":287},[277,2358,2360,2362],{"class":279,"line":2359},215,[277,2361,594],{"class":571},[277,2363,597],{"class":575},[277,2365,2367,2369,2371],{"class":279,"line":2366},216,[277,2368,695],{"class":571},[277,2370,576],{"class":575},[277,2372,607],{"class":287},[277,2374,2376,2378,2380],{"class":279,"line":2375},217,[277,2377,602],{"class":571},[277,2379,576],{"class":575},[277,2381,2382],{"class":287},"gitlab-kubernetes-agent-read-binding-dude\n",[277,2384,2386,2388],{"class":279,"line":2385},218,[277,2387,1216],{"class":571},[277,2389,597],{"class":575},[277,2391,2393,2395,2397],{"class":279,"line":2392},219,[277,2394,602],{"class":571},[277,2396,576],{"class":575},[277,2398,2268],{"class":287},[277,2400,2402,2404,2406],{"class":279,"line":2401},220,[277,2403,1233],{"class":571},[277,2405,576],{"class":575},[277,2407,1527],{"class":287},[277,2409,2411,2413,2415],{"class":279,"line":2410},221,[277,2412,1243],{"class":571},[277,2414,576],{"class":575},[277,2416,1248],{"class":287},[277,2418,2420,2422],{"class":279,"line":2419},222,[277,2421,1254],{"class":571},[277,2423,597],{"class":575},[277,2425,2427,2429,2431,2433],{"class":279,"line":2426},223,[277,2428,1099],{"class":575},[277,2430,873],{"class":571},[277,2432,576],{"class":575},[277,2434,689],{"class":287},[277,2436,2438,2440,2442],{"class":279,"line":2437},224,[277,2439,1233],{"class":571},[277,2441,576],{"class":575},[277,2443,672],{"class":287},[277,2445,2447,2449,2451],{"class":279,"line":2446},225,[277,2448,695],{"class":571},[277,2450,576],{"class":575},[277,2452,689],{"class":287},[12,2454,2455],{},"Now we can apply the deployment with the following command:",[155,2457,2459],{"className":271,"code":2458,"language":273,"meta":161,"style":161},"$ kubectl apply -f k-agent.yaml\n\nnamespace/dude created\nnamespace/naww created\nserviceaccount/gitlab-kubernetes-agent created\ndeployment.apps/gitlab-kubernetes-agent created\nclusterrole.rbac.authorization.k8s.io/gitlab-kubernetes-agent-write-cm created\nclusterrolebinding.rbac.authorization.k8s.io/gitlab-kubernetes-agent-write-binding-cm created\nclusterrole.rbac.authorization.k8s.io/gitlab-kubernetes-agent-read-cm created\nclusterrolebinding.rbac.authorization.k8s.io/gitlab-kubernetes-agent-read-binding-cm created\nrole.rbac.authorization.k8s.io/gitlab-kubernetes-agent-write created\nrolebinding.rbac.authorization.k8s.io/gitlab-kubernetes-agent-write-binding created\nrole.rbac.authorization.k8s.io/gitlab-kubernetes-agent-read created\nrolebinding.rbac.authorization.k8s.io/gitlab-kubernetes-agent-read-binding created\nrole.rbac.authorization.k8s.io/gitlab-kubernetes-agent-write-dude created\nrolebinding.rbac.authorization.k8s.io/gitlab-kubernetes-agent-write-binding-dude created\nrole.rbac.authorization.k8s.io/gitlab-kubernetes-agent-read-dude created\nrolebinding.rbac.authorization.k8s.io/gitlab-kubernetes-agent-read-binding-dude created\n",[22,2460,2461,2476,2480,2487,2494,2501,2508,2515,2522,2529,2536,2543,2550,2557,2564,2571,2578,2585],{"__ignoreMap":161},[277,2462,2463,2465,2467,2470,2473],{"class":279,"line":280},[277,2464,284],{"class":283},[277,2466,375],{"class":287},[277,2468,2469],{"class":287}," apply",[277,2471,2472],{"class":303}," -f",[277,2474,2475],{"class":287}," k-agent.yaml\n",[277,2477,2478],{"class":279,"line":316},[277,2479,319],{"emptyLinePlaceholder":51},[277,2481,2482,2485],{"class":279,"line":322},[277,2483,2484],{"class":283},"namespace/dude",[277,2486,396],{"class":287},[277,2488,2489,2492],{"class":279,"line":343},[277,2490,2491],{"class":283},"namespace/naww",[277,2493,396],{"class":287},[277,2495,2496,2499],{"class":279,"line":610},[277,2497,2498],{"class":283},"serviceaccount/gitlab-kubernetes-agent",[277,2500,396],{"class":287},[277,2502,2503,2506],{"class":279,"line":616},[277,2504,2505],{"class":283},"deployment.apps/gitlab-kubernetes-agent",[277,2507,396],{"class":287},[277,2509,2510,2513],{"class":279,"line":625},[277,2511,2512],{"class":283},"clusterrole.rbac.authorization.k8s.io/gitlab-kubernetes-agent-write-cm",[277,2514,396],{"class":287},[277,2516,2517,2520],{"class":279,"line":634},[277,2518,2519],{"class":283},"clusterrolebinding.rbac.authorization.k8s.io/gitlab-kubernetes-agent-write-binding-cm",[277,2521,396],{"class":287},[277,2523,2524,2527],{"class":279,"line":641},[277,2525,2526],{"class":283},"clusterrole.rbac.authorization.k8s.io/gitlab-kubernetes-agent-read-cm",[277,2528,396],{"class":287},[277,2530,2531,2534],{"class":279,"line":651},[277,2532,2533],{"class":283},"clusterrolebinding.rbac.authorization.k8s.io/gitlab-kubernetes-agent-read-binding-cm",[277,2535,396],{"class":287},[277,2537,2538,2541],{"class":279,"line":656},[277,2539,2540],{"class":283},"role.rbac.authorization.k8s.io/gitlab-kubernetes-agent-write",[277,2542,396],{"class":287},[277,2544,2545,2548],{"class":279,"line":665},[277,2546,2547],{"class":283},"rolebinding.rbac.authorization.k8s.io/gitlab-kubernetes-agent-write-binding",[277,2549,396],{"class":287},[277,2551,2552,2555],{"class":279,"line":675},[277,2553,2554],{"class":283},"role.rbac.authorization.k8s.io/gitlab-kubernetes-agent-read",[277,2556,396],{"class":287},[277,2558,2559,2562],{"class":279,"line":682},[277,2560,2561],{"class":283},"rolebinding.rbac.authorization.k8s.io/gitlab-kubernetes-agent-read-binding",[277,2563,396],{"class":287},[277,2565,2566,2569],{"class":279,"line":692},[277,2567,2568],{"class":283},"role.rbac.authorization.k8s.io/gitlab-kubernetes-agent-write-dude",[277,2570,396],{"class":287},[277,2572,2573,2576],{"class":279,"line":702},[277,2574,2575],{"class":283},"rolebinding.rbac.authorization.k8s.io/gitlab-kubernetes-agent-write-binding-dude",[277,2577,396],{"class":287},[277,2579,2580,2583],{"class":279,"line":707},[277,2581,2582],{"class":283},"role.rbac.authorization.k8s.io/gitlab-kubernetes-agent-read-dude",[277,2584,396],{"class":287},[277,2586,2587,2590],{"class":279,"line":717},[277,2588,2589],{"class":283},"rolebinding.rbac.authorization.k8s.io/gitlab-kubernetes-agent-read-binding-dude",[277,2591,396],{"class":287},[12,2593,2594,2596,2597,2599,2600,2602,2603],{},[136,2595,138],{}," You see we are giving permissions to the gitlab-kubernetes-agent on the ",[22,2598,475],{}," namespace, but not on the ",[22,2601,481],{}," namespace. Currently, permissions for ConfigMaps are necessary but the scope can be reduced.\n",[136,2604,2605],{},"8. Make sure agentk is running",[155,2607,2609],{"className":271,"code":2608,"language":273,"meta":161,"style":161},"$ kubectl get pods -n gitlab-kubernetes-agent\n\nNAME                            READY   STATUS    RESTARTS   AGE\ngitlab-agent-58869d96bd-nqqnf   1/1     Running   0          10s\n",[22,2610,2611,2627,2631,2648],{"__ignoreMap":161},[277,2612,2613,2615,2617,2620,2623,2625],{"class":279,"line":280},[277,2614,284],{"class":283},[277,2616,375],{"class":287},[277,2618,2619],{"class":287}," get",[277,2621,2622],{"class":287}," pods",[277,2624,426],{"class":303},[277,2626,384],{"class":287},[277,2628,2629],{"class":279,"line":316},[277,2630,319],{"emptyLinePlaceholder":51},[277,2632,2633,2636,2639,2642,2645],{"class":279,"line":322},[277,2634,2635],{"class":283},"NAME",[277,2637,2638],{"class":287},"                            READY",[277,2640,2641],{"class":287},"   STATUS",[277,2643,2644],{"class":287},"    RESTARTS",[277,2646,2647],{"class":287},"   AGE\n",[277,2649,2650,2653,2656,2659,2662],{"class":279,"line":343},[277,2651,2652],{"class":283},"gitlab-agent-58869d96bd-nqqnf",[277,2654,2655],{"class":287},"   1/1",[277,2657,2658],{"class":287},"     Running",[277,2660,2661],{"class":303},"   0",[277,2663,2664],{"class":287},"          10s\n",[12,2666,2667],{},"Now that the agentk is deployed, it can start managing our Kubernetes deployments.",[53,2669,2671],{"id":2670},"managing-deployments","Managing deployments",[12,2673,2674],{},"Now let's go back to the GitLab UI, and add some applications to deploy using GitOps.",[12,2676,2677],{},[136,2678,2679],{},"1. Open the Web IDE and create a manifest folder in your project root",[12,2681,2682],{},[136,2683,2684,2685,2687,2688],{},"2. Add a manifest file for what you want to deploy on the ",[22,2686,475],{}," namespace, name it ",[22,2689,2690],{},"dude.yaml",[155,2692,2694],{"className":562,"code":2693,"language":564,"meta":161,"style":161},"apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: nginx-deployment-dude\n  namespace: dude  # Can be any namespace managed by you that the agent has access to.\nspec:\n  selector:\n    matchLabels:\n      app: nginx\n  replicas: 1\n  template:\n    metadata:\n      labels:\n        app: nginx\n    spec:\n      containers:\n      - name: nginx\n        image: nginx:1.14.2\n        ports:\n        - containerPort: 80\n",[22,2695,2696,2704,2712,2718,2727,2738,2744,2750,2756,2765,2773,2779,2785,2791,2799,2805,2811,2821,2830,2837],{"__ignoreMap":161},[277,2697,2698,2700,2702],{"class":279,"line":280},[277,2699,572],{"class":571},[277,2701,576],{"class":575},[277,2703,714],{"class":287},[277,2705,2706,2708,2710],{"class":279,"line":316},[277,2707,584],{"class":571},[277,2709,576],{"class":575},[277,2711,724],{"class":287},[277,2713,2714,2716],{"class":279,"line":322},[277,2715,594],{"class":571},[277,2717,597],{"class":575},[277,2719,2720,2722,2724],{"class":279,"line":343},[277,2721,602],{"class":571},[277,2723,576],{"class":575},[277,2725,2726],{"class":287},"nginx-deployment-dude\n",[277,2728,2729,2731,2733,2735],{"class":279,"line":610},[277,2730,695],{"class":571},[277,2732,576],{"class":575},[277,2734,475],{"class":287},[277,2736,2737],{"class":925},"  # Can be any namespace managed by you that the agent has access to.\n",[277,2739,2740,2742],{"class":279,"line":616},[277,2741,755],{"class":571},[277,2743,597],{"class":575},[277,2745,2746,2748],{"class":279,"line":625},[277,2747,774],{"class":571},[277,2749,597],{"class":575},[277,2751,2752,2754],{"class":279,"line":634},[277,2753,782],{"class":571},[277,2755,597],{"class":575},[277,2757,2758,2760,2762],{"class":279,"line":641},[277,2759,790],{"class":571},[277,2761,576],{"class":575},[277,2763,2764],{"class":287},"nginx\n",[277,2766,2767,2769,2771],{"class":279,"line":651},[277,2768,763],{"class":571},[277,2770,576],{"class":575},[277,2772,768],{"class":303},[277,2774,2775,2777],{"class":279,"line":656},[277,2776,800],{"class":571},[277,2778,597],{"class":575},[277,2780,2781,2783],{"class":279,"line":665},[277,2782,808],{"class":571},[277,2784,597],{"class":575},[277,2786,2787,2789],{"class":279,"line":675},[277,2788,816],{"class":571},[277,2790,597],{"class":575},[277,2792,2793,2795,2797],{"class":279,"line":682},[277,2794,824],{"class":571},[277,2796,576],{"class":575},[277,2798,2764],{"class":287},[277,2800,2801,2803],{"class":279,"line":692},[277,2802,844],{"class":571},[277,2804,597],{"class":575},[277,2806,2807,2809],{"class":279,"line":702},[277,2808,862],{"class":571},[277,2810,597],{"class":575},[277,2812,2813,2815,2817,2819],{"class":279,"line":707},[277,2814,870],{"class":575},[277,2816,873],{"class":571},[277,2818,576],{"class":575},[277,2820,2764],{"class":287},[277,2822,2823,2825,2827],{"class":279,"line":717},[277,2824,884],{"class":571},[277,2826,576],{"class":575},[277,2828,2829],{"class":287},"nginx:1.14.2\n",[277,2831,2832,2835],{"class":279,"line":727},[277,2833,2834],{"class":571},"        ports",[277,2836,597],{"class":575},[277,2838,2839,2841,2844,2846],{"class":279,"line":734},[277,2840,903],{"class":575},[277,2842,2843],{"class":571},"containerPort",[277,2845,576],{"class":575},[277,2847,2848],{"class":303},"80\n",[12,2850,2851],{},[136,2852,2853,2854,2856,2857],{},"3. Add a manifest file for what you want to deploy on the ",[22,2855,481],{}," namespace and name it ",[22,2858,2859],{},"naww.yaml",[155,2861,2863],{"className":562,"code":2862,"language":564,"meta":161,"style":161},"apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: nginx-deployment-naww\n  namespace: naww  # Can be any namespace managed by you that the agent has access to.\nspec:\n  selector:\n    matchLabels:\n      app: nginx\n  replicas: 1\n  template:\n    metadata:\n      labels:\n        app: nginx\n    spec:\n      containers:\n      - name: nginx\n        image: nginx:1.14.2\n        ports:\n        - containerPort: 80\n",[22,2864,2865,2873,2881,2887,2896,2906,2912,2918,2924,2932,2940,2946,2952,2958,2966,2972,2978,2988,2996,3002],{"__ignoreMap":161},[277,2866,2867,2869,2871],{"class":279,"line":280},[277,2868,572],{"class":571},[277,2870,576],{"class":575},[277,2872,714],{"class":287},[277,2874,2875,2877,2879],{"class":279,"line":316},[277,2876,584],{"class":571},[277,2878,576],{"class":575},[277,2880,724],{"class":287},[277,2882,2883,2885],{"class":279,"line":322},[277,2884,594],{"class":571},[277,2886,597],{"class":575},[277,2888,2889,2891,2893],{"class":279,"line":343},[277,2890,602],{"class":571},[277,2892,576],{"class":575},[277,2894,2895],{"class":287},"nginx-deployment-naww\n",[277,2897,2898,2900,2902,2904],{"class":279,"line":610},[277,2899,695],{"class":571},[277,2901,576],{"class":575},[277,2903,481],{"class":287},[277,2905,2737],{"class":925},[277,2907,2908,2910],{"class":279,"line":616},[277,2909,755],{"class":571},[277,2911,597],{"class":575},[277,2913,2914,2916],{"class":279,"line":625},[277,2915,774],{"class":571},[277,2917,597],{"class":575},[277,2919,2920,2922],{"class":279,"line":634},[277,2921,782],{"class":571},[277,2923,597],{"class":575},[277,2925,2926,2928,2930],{"class":279,"line":641},[277,2927,790],{"class":571},[277,2929,576],{"class":575},[277,2931,2764],{"class":287},[277,2933,2934,2936,2938],{"class":279,"line":651},[277,2935,763],{"class":571},[277,2937,576],{"class":575},[277,2939,768],{"class":303},[277,2941,2942,2944],{"class":279,"line":656},[277,2943,800],{"class":571},[277,2945,597],{"class":575},[277,2947,2948,2950],{"class":279,"line":665},[277,2949,808],{"class":571},[277,2951,597],{"class":575},[277,2953,2954,2956],{"class":279,"line":675},[277,2955,816],{"class":571},[277,2957,597],{"class":575},[277,2959,2960,2962,2964],{"class":279,"line":682},[277,2961,824],{"class":571},[277,2963,576],{"class":575},[277,2965,2764],{"class":287},[277,2967,2968,2970],{"class":279,"line":692},[277,2969,844],{"class":571},[277,2971,597],{"class":575},[277,2973,2974,2976],{"class":279,"line":702},[277,2975,862],{"class":571},[277,2977,597],{"class":575},[277,2979,2980,2982,2984,2986],{"class":279,"line":707},[277,2981,870],{"class":575},[277,2983,873],{"class":571},[277,2985,576],{"class":575},[277,2987,2764],{"class":287},[277,2989,2990,2992,2994],{"class":279,"line":717},[277,2991,884],{"class":571},[277,2993,576],{"class":575},[277,2995,2829],{"class":287},[277,2997,2998,3000],{"class":279,"line":727},[277,2999,2834],{"class":571},[277,3001,597],{"class":575},[277,3003,3004,3006,3008,3010],{"class":279,"line":734},[277,3005,903],{"class":575},[277,3007,2843],{"class":571},[277,3009,576],{"class":575},[277,3011,2848],{"class":303},[12,3013,3014],{},[136,3015,3016],{},"4. Commit changes and wait for the pipeline to run",[12,3018,3019],{},[136,3020,3021],{},"5. Check dude namespace",[155,3023,3025],{"className":271,"code":3024,"language":273,"meta":161,"style":161},"$ kubectl get pods -n dude\n\nNAME                                     READY   STATUS    RESTARTS   AGE\nnginx-deployment-dude-66b6c48dd5-rpxx2   1/1     Running   0          6m22s\n",[22,3026,3027,3042,3046,3059],{"__ignoreMap":161},[277,3028,3029,3031,3033,3035,3037,3039],{"class":279,"line":280},[277,3030,284],{"class":283},[277,3032,375],{"class":287},[277,3034,2619],{"class":287},[277,3036,2622],{"class":287},[277,3038,426],{"class":303},[277,3040,3041],{"class":287}," dude\n",[277,3043,3044],{"class":279,"line":316},[277,3045,319],{"emptyLinePlaceholder":51},[277,3047,3048,3050,3053,3055,3057],{"class":279,"line":322},[277,3049,2635],{"class":283},[277,3051,3052],{"class":287},"                                     READY",[277,3054,2641],{"class":287},[277,3056,2644],{"class":287},[277,3058,2647],{"class":287},[277,3060,3061,3064,3066,3068,3070],{"class":279,"line":343},[277,3062,3063],{"class":283},"nginx-deployment-dude-66b6c48dd5-rpxx2",[277,3065,2655],{"class":287},[277,3067,2658],{"class":287},[277,3069,2661],{"class":303},[277,3071,3072],{"class":287},"          6m22s\n",[12,3074,3075],{},"Notice that the application has deployed.",[12,3077,3078],{},[136,3079,3080],{},"6. Check naww namespace",[155,3082,3084],{"className":271,"code":3083,"language":273,"meta":161,"style":161},"$ kubectl get pods -n naww\n\nNo resources found in naww namespace.\n",[22,3085,3086,3101,3105],{"__ignoreMap":161},[277,3087,3088,3090,3092,3094,3096,3098],{"class":279,"line":280},[277,3089,284],{"class":283},[277,3091,375],{"class":287},[277,3093,2619],{"class":287},[277,3095,2622],{"class":287},[277,3097,426],{"class":303},[277,3099,3100],{"class":287}," naww\n",[277,3102,3103],{"class":279,"line":316},[277,3104,319],{"emptyLinePlaceholder":51},[277,3106,3107,3110,3113,3116,3119,3122],{"class":279,"line":322},[277,3108,3109],{"class":283},"No",[277,3111,3112],{"class":287}," resources",[277,3114,3115],{"class":287}," found",[277,3117,3118],{"class":287}," in",[277,3120,3121],{"class":287}," naww",[277,3123,3124],{"class":287}," namespace.\n",[12,3126,3127],{},"Notice there is nothing on there.",[12,3129,3130],{},[136,3131,3132],{},"7. Look at the k-agent logs",[155,3134,3136],{"className":271,"code":3135,"language":273,"meta":161,"style":161},"$ kubectl get pods -n gitlab-kubernetes-agent\n\nNAME                            READY   STATUS    RESTARTS   AGE\ngitlab-agent-58869d96bd-nqqnf   1/1     Running   0          10s\n\n$ kubectl logs gitlab-agent-58869d96bd-nqqnf -n gitlab-kubernetes-agent\n\n{\"level\":\"info\",\"time\":\"2021-08-19T19:17:26.088Z\",\"msg\":\"Feature status change\",\"feature_name\":\"tunnel\",\"feature_status\":true}\n{\"level\":\"info\",\"time\":\"2021-08-19T19:17:26.088Z\",\"msg\":\"Observability endpoint is up\",\"mod_name\":\"observability\",\"net_network\":\"tcp\",\"net_address\":\"[::]:8080\"}\n{\"level\":\"info\",\"time\":\"2021-08-19T19:17:26.375Z\",\"msg\":\"Starting synchronization worker\",\"mod_name\":\"gitops\",\"project_id\":\"devsecops/gitops-project\"}\n...\n",[22,3137,3138,3152,3156,3168,3180,3184,3200,3204,3256,3316,3365],{"__ignoreMap":161},[277,3139,3140,3142,3144,3146,3148,3150],{"class":279,"line":280},[277,3141,284],{"class":283},[277,3143,375],{"class":287},[277,3145,2619],{"class":287},[277,3147,2622],{"class":287},[277,3149,426],{"class":303},[277,3151,384],{"class":287},[277,3153,3154],{"class":279,"line":316},[277,3155,319],{"emptyLinePlaceholder":51},[277,3157,3158,3160,3162,3164,3166],{"class":279,"line":322},[277,3159,2635],{"class":283},[277,3161,2638],{"class":287},[277,3163,2641],{"class":287},[277,3165,2644],{"class":287},[277,3167,2647],{"class":287},[277,3169,3170,3172,3174,3176,3178],{"class":279,"line":343},[277,3171,2652],{"class":283},[277,3173,2655],{"class":287},[277,3175,2658],{"class":287},[277,3177,2661],{"class":303},[277,3179,2664],{"class":287},[277,3181,3182],{"class":279,"line":610},[277,3183,319],{"emptyLinePlaceholder":51},[277,3185,3186,3188,3190,3193,3196,3198],{"class":279,"line":616},[277,3187,284],{"class":283},[277,3189,375],{"class":287},[277,3191,3192],{"class":287}," logs",[277,3194,3195],{"class":287}," gitlab-agent-58869d96bd-nqqnf",[277,3197,426],{"class":303},[277,3199,384],{"class":287},[277,3201,3202],{"class":279,"line":625},[277,3203,319],{"emptyLinePlaceholder":51},[277,3205,3206,3209,3212,3214,3217,3220,3223,3225,3228,3230,3233,3235,3238,3240,3243,3245,3248,3250,3253],{"class":279,"line":634},[277,3207,3208],{"class":575},"{",[277,3210,3211],{"class":283},"\"level\"",[277,3213,559],{"class":303},[277,3215,3216],{"class":283},"\"info\"",[277,3218,3219],{"class":283},",",[277,3221,3222],{"class":283},"\"time\"",[277,3224,559],{"class":303},[277,3226,3227],{"class":283},"\"2021-08-19T19:17:26.088Z\"",[277,3229,3219],{"class":283},[277,3231,3232],{"class":283},"\"msg\"",[277,3234,559],{"class":303},[277,3236,3237],{"class":283},"\"Feature status change\"",[277,3239,3219],{"class":283},[277,3241,3242],{"class":283},"\"feature_name\"",[277,3244,559],{"class":303},[277,3246,3247],{"class":283},"\"tunnel\"",[277,3249,3219],{"class":283},[277,3251,3252],{"class":283},"\"feature_status\"",[277,3254,3255],{"class":283},":true}\n",[277,3257,3258,3260,3262,3264,3266,3268,3270,3272,3274,3276,3278,3280,3283,3285,3288,3290,3293,3295,3298,3300,3303,3305,3308,3310,3313],{"class":279,"line":641},[277,3259,3208],{"class":575},[277,3261,3211],{"class":283},[277,3263,559],{"class":303},[277,3265,3216],{"class":283},[277,3267,3219],{"class":283},[277,3269,3222],{"class":283},[277,3271,559],{"class":303},[277,3273,3227],{"class":283},[277,3275,3219],{"class":283},[277,3277,3232],{"class":283},[277,3279,559],{"class":303},[277,3281,3282],{"class":283},"\"Observability endpoint is up\"",[277,3284,3219],{"class":283},[277,3286,3287],{"class":283},"\"mod_name\"",[277,3289,559],{"class":303},[277,3291,3292],{"class":283},"\"observability\"",[277,3294,3219],{"class":283},[277,3296,3297],{"class":283},"\"net_network\"",[277,3299,559],{"class":303},[277,3301,3302],{"class":283},"\"tcp\"",[277,3304,3219],{"class":283},[277,3306,3307],{"class":283},"\"net_address\"",[277,3309,559],{"class":303},[277,3311,3312],{"class":283},"\"[::]:8080\"",[277,3314,3315],{"class":283},"}\n",[277,3317,3318,3320,3322,3324,3326,3328,3330,3332,3335,3337,3339,3341,3344,3346,3348,3350,3353,3355,3358,3360,3363],{"class":279,"line":651},[277,3319,3208],{"class":575},[277,3321,3211],{"class":283},[277,3323,559],{"class":303},[277,3325,3216],{"class":283},[277,3327,3219],{"class":283},[277,3329,3222],{"class":283},[277,3331,559],{"class":303},[277,3333,3334],{"class":283},"\"2021-08-19T19:17:26.375Z\"",[277,3336,3219],{"class":283},[277,3338,3232],{"class":283},[277,3340,559],{"class":303},[277,3342,3343],{"class":283},"\"Starting synchronization worker\"",[277,3345,3219],{"class":283},[277,3347,3287],{"class":283},[277,3349,559],{"class":303},[277,3351,3352],{"class":283},"\"gitops\"",[277,3354,3219],{"class":283},[277,3356,3357],{"class":283},"\"project_id\"",[277,3359,559],{"class":303},[277,3361,3362],{"class":283},"\"devsecops/gitops-project\"",[277,3364,3315],{"class":283},[277,3366,3367],{"class":279,"line":656},[277,3368,3369],{"class":303},"...\n",[12,3371,3372],{},"You should see logs as follows:",[12,3374,3375,3376],{},"Application successfully deployed to ",[22,3377,475],{},[155,3379,3382],{"className":3380,"code":3381,"language":160,"meta":161},[158],"{\"level\":\"info\",\"time\":\"2021-08-20T22:03:57.561Z\",\"msg\":\"Synchronizing objects\",\"mod_name\":\"gitops\",\"project_id\":\"29010173\",\"agent_id\":711,\"commit_id\":\"221499beaf2dcf267cd40324235570001e928817\"}\n{\"eventType\":\"resourceStatus\",\"group\":\"apps\",\"kind\":\"Deployment\",\"message\":\"Deployment is available. Replicas: 1\",\"name\":\"nginx-deployment-dude\",\"namespace\":\"dude\",\"status\":\"Current\",\"timestamp\":\"2021-08-20T22:03:58Z\",\"type\":\"status\"}\n",[22,3383,3381],{"__ignoreMap":161},[12,3385,3386,3387],{},"Application failed to deploy to ",[22,3388,481],{},[155,3390,3393],{"className":3391,"code":3392,"language":160,"meta":161},[158],"{\"eventType\":\"resourceStatus\",\"group\":\"apps\",\"kind\":\"Deployment\",\"message\":\"\",\"name\":\"nginx-deployment-naww\",\"namespace\":\"naww\",\"status\":\"Unknown\",\"timestamp\":\"2021-08-20T22:03:29Z\",\"type\":\"status\"}\n{\"level\":\"warn\",\"time\":\"2021-08-20T22:03:30.015Z\",\"msg\":\"Synchronization failed\",\"mod_name\":\"gitops\",\"project_id\":\"29010173\",\"agent_id\":711,\"commit_id\":\"221499beaf2dcf267cd40324235570001e928817\",\"error\":\"1 resources failed\"}\n",[22,3394,3392],{"__ignoreMap":161},[12,3396,3397,3398,3400,3401,3406,3407,3409],{},"We can see that deployments only happen on the ",[22,3399,475],{}," namespace because that is all the k-agent has access to. You can add access to other namespaces by creating ",[16,3402,3405],{"href":3403,"rel":3404},"https://kubernetes.io/docs/reference/access-authn-authz/rbac/",[],"Roles and RoleBindings"," for each namespace like we did for the ",[22,3408,475],{}," namespace.",[53,3411,3413],{"id":3412},"securing-gitops-workflow-on-kubernetes","Securing GitOps workflow on Kubernetes",[12,3415,3416],{},"Now you have seen how you can create a more restrictive GitOps workflow, allowing you to meet your security needs.",[12,3418,3419,3420,3425],{},"Thanks for reading! I hope this guide brings you one step forward into using and securing your GitOps workflow on Kubernetes. For more information see the ",[16,3421,3424],{"href":3422,"rel":3423},"https://docs.gitlab.com/user/clusters/agent/",[],"GitLab Agent documentation",".",[12,3427,3428,3429,3433,3434],{},"Photo by ",[16,3430,3432],{"href":3431},"https://unsplash.com/@sebbb?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText","seabass creatives"," on ",[16,3435,3437],{"href":3436},"https://unsplash.com/s/photos/limited?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText","Unsplash",[53,3439,3441],{"id":3440},"read-more-on-kubernetes","Read more on Kubernetes:",[81,3443,3444,3450,3456,3462,3468],{},[84,3445,3446],{},[16,3447,3449],{"href":3448},"/blog/gko-on-ocp/","How to install and use the GitLab Kubernetes Operator",[84,3451,3452],{},[16,3453,3455],{"href":3454},"/blog/threat-modeling-kubernetes-agent/","Threat modeling the Kubernetes Agent: from MVC to continuous improvement",[84,3457,3458],{},[16,3459,3461],{"href":3460},"/blog/gitlab-kubernetes-agent-on-gitlab-com/","A new era of Kubernetes integrations on GitLab.com",[84,3463,3464],{},[16,3465,3467],{"href":3466},"/blog/kubernetes-terminology/","Understand Kubernetes terminology from namespaces to pods",[84,3469,3470],{},[16,3471,3473],{"href":3472},"/blog/year-of-kubernetes/","What we learned after a year of GitLab.com on Kubernetes",[3475,3476,3477],"style",{},"html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}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 .shJU0, html code.shiki .shJU0{--shiki-default:#22863A}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}",{"title":161,"searchDepth":316,"depth":316,"links":3479},[3480,3481,3488,3489,3490],{"id":55,"depth":316,"text":56},{"id":114,"depth":316,"text":115,"children":3482},[3483,3484,3485,3486,3487],{"id":461,"depth":322,"text":462},{"id":485,"depth":322,"text":486},{"id":496,"depth":322,"text":497},{"id":507,"depth":322,"text":508},{"id":525,"depth":322,"text":526},{"id":2670,"depth":316,"text":2671},{"id":3412,"depth":316,"text":3413},{"id":3440,"depth":316,"text":3441},"devsecops","2021-09-10"," Learn how to deploy the GitLab Agent for Kubernetes with Limited Permissions.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749668655/Blog/Hero%20Images/seabass-creatives-U3m4_cKbUfc-unsplash.jpg",{},"/en-us/blog/setting-up-the-k-agent",{"title":5,"description":3493,"ogTitle":5,"ogDescription":3493,"noIndex":3496,"ogImage":3497,"ogUrl":3501,"ogSiteName":3502,"ogType":3503,"canonicalUrls":3501},"https://about.gitlab.com/blog/setting-up-the-k-agent","https://about.gitlab.com","article","setting-up-the-k-agent","en-us/blog/setting-up-the-k-agent",[3507,34,3508],"git","security","BlogPost","eULsy2eDIaTyz1N4tmOBZYIcK4G7EttrQ4ggV6w3Ag4",{"logo":3512,"freeTrial":3517,"sales":3522,"login":3527,"items":3532,"search":3858,"minimal":3889,"duo":3908,"switchNav":3917,"pricingDeployment":3928},{"config":3513},{"href":3514,"dataGaName":3515,"dataGaLocation":3516},"/","gitlab logo","header",{"text":3518,"config":3519},"Get free trial",{"href":3520,"dataGaName":3521,"dataGaLocation":3516},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":3523,"config":3524},"Request a demo",{"href":3525,"dataGaName":3526,"dataGaLocation":3516},"/sales/?contact-topic=request-demo","sales",{"text":3528,"config":3529},"Sign in",{"href":3530,"dataGaName":3531,"dataGaLocation":3516},"https://gitlab.com/users/sign_in/","sign in",[3533,3562,3662,3667,3780,3836],{"text":3534,"config":3535,"menu":3537},"Platform",{"dataNavLevelOne":3536},"platform",{"type":3538,"columns":3539},"cards",[3540,3546,3554],{"title":3534,"description":3541,"link":3542},"The intelligent orchestration platform for DevSecOps",{"text":3543,"config":3544},"Explore our Platform",{"href":3545,"dataGaName":3536,"dataGaLocation":3516},"/platform/",{"title":3547,"description":3548,"link":3549},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":3550,"config":3551},"Meet GitLab Duo",{"href":3552,"dataGaName":3553,"dataGaLocation":3516},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":3555,"description":3556,"link":3557},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":3558,"config":3559},"Learn more",{"href":3560,"dataGaName":3561,"dataGaLocation":3516},"/why-gitlab/","why gitlab",{"text":3563,"left":51,"config":3564,"menu":3566},"Product",{"dataNavLevelOne":3565},"solutions",{"type":3567,"link":3568,"columns":3572,"feature":3641},"lists",{"text":3569,"config":3570},"View all Solutions",{"href":3571,"dataGaName":3565,"dataGaLocation":3516},"/solutions/",[3573,3597,3620],{"title":3574,"description":3575,"link":3576,"items":3581},"Automation","CI/CD and automation to accelerate deployment",{"config":3577},{"icon":3578,"href":3579,"dataGaName":3580,"dataGaLocation":3516},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[3582,3586,3589,3593],{"text":3583,"config":3584},"CI/CD",{"href":3585,"dataGaLocation":3516,"dataGaName":3583},"/solutions/continuous-integration/",{"text":3547,"config":3587},{"href":3552,"dataGaLocation":3516,"dataGaName":3588},"gitlab duo agent platform - product menu",{"text":3590,"config":3591},"Source Code Management",{"href":3592,"dataGaLocation":3516,"dataGaName":3590},"/solutions/source-code-management/",{"text":3594,"config":3595},"Automated Software Delivery",{"href":3579,"dataGaLocation":3516,"dataGaName":3596},"Automated software delivery",{"title":3598,"description":3599,"link":3600,"items":3605},"Security","Deliver code faster without compromising security",{"config":3601},{"href":3602,"dataGaName":3603,"dataGaLocation":3516,"icon":3604},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[3606,3610,3615],{"text":3607,"config":3608},"Application Security Testing",{"href":3602,"dataGaName":3609,"dataGaLocation":3516},"Application security testing",{"text":3611,"config":3612},"Software Supply Chain Security",{"href":3613,"dataGaLocation":3516,"dataGaName":3614},"/solutions/supply-chain/","Software supply chain security",{"text":3616,"config":3617},"Software Compliance",{"href":3618,"dataGaName":3619,"dataGaLocation":3516},"/solutions/software-compliance/","software compliance",{"title":3621,"link":3622,"items":3627},"Measurement",{"config":3623},{"icon":3624,"href":3625,"dataGaName":3626,"dataGaLocation":3516},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[3628,3632,3636],{"text":3629,"config":3630},"Visibility & Measurement",{"href":3625,"dataGaLocation":3516,"dataGaName":3631},"Visibility and Measurement",{"text":3633,"config":3634},"Value Stream Management",{"href":3635,"dataGaLocation":3516,"dataGaName":3633},"/solutions/value-stream-management/",{"text":3637,"config":3638},"Analytics & Insights",{"href":3639,"dataGaLocation":3516,"dataGaName":3640},"/solutions/analytics-and-insights/","Analytics and insights",{"title":3642,"type":3567,"items":3643},"GitLab for",[3644,3650,3656],{"text":3645,"config":3646},"Enterprise",{"icon":3647,"href":3648,"dataGaLocation":3516,"dataGaName":3649},"Building","/enterprise/","enterprise",{"text":3651,"config":3652},"Small Business",{"icon":3653,"href":3654,"dataGaLocation":3516,"dataGaName":3655},"Work","/small-business/","small business",{"text":3657,"config":3658},"Public Sector",{"icon":3659,"href":3660,"dataGaLocation":3516,"dataGaName":3661},"Organization","/solutions/public-sector/","public sector",{"text":3663,"config":3664},"Pricing",{"href":3665,"dataGaName":3666,"dataGaLocation":3516,"dataNavLevelOne":3666},"/pricing/","pricing",{"text":3668,"config":3669,"menu":3670},"Resources",{"dataNavLevelOne":1102},{"type":3567,"link":3671,"columns":3675,"feature":3769},{"text":3672,"config":3673},"View all resources",{"href":3674,"dataGaName":1102,"dataGaLocation":3516},"/resources/",[3676,3709,3736],{"title":3677,"items":3678},"Getting started",[3679,3684,3689,3694,3699,3704],{"text":3680,"config":3681},"Install",{"href":3682,"dataGaName":3683,"dataGaLocation":3516},"/install/","install",{"text":3685,"config":3686},"Quick start guides",{"href":3687,"dataGaName":3688,"dataGaLocation":3516},"/get-started/","quick setup checklists",{"text":3690,"config":3691},"Learn",{"href":3692,"dataGaLocation":3516,"dataGaName":3693},"https://university.gitlab.com/","learn",{"text":3695,"config":3696},"Product documentation",{"href":3697,"dataGaName":3698,"dataGaLocation":3516},"https://docs.gitlab.com/","product documentation",{"text":3700,"config":3701},"Best practice videos",{"href":3702,"dataGaName":3703,"dataGaLocation":3516},"/getting-started-videos/","best practice videos",{"text":3705,"config":3706},"Integrations",{"href":3707,"dataGaName":3708,"dataGaLocation":3516},"/integrations/","integrations",{"title":3710,"items":3711},"Discover",[3712,3717,3722,3727,3731],{"text":3713,"config":3714},"Customer success stories",{"href":3715,"dataGaName":3716,"dataGaLocation":3516},"/customers/","customer success stories",{"text":3718,"config":3719},"Blog",{"href":3720,"dataGaName":3721,"dataGaLocation":3516},"/blog/","blog",{"text":3723,"config":3724},"Demo Hub",{"href":3725,"dataGaName":3726,"dataGaLocation":3516},"/demo-hub/","demo hub",{"text":3728,"config":3729},"The Source",{"href":3730,"dataGaName":3721,"dataGaLocation":3516},"/the-source/",{"text":3732,"config":3733},"Remote",{"href":3734,"dataGaName":3735,"dataGaLocation":3516},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":3737,"items":3738},"Connect",[3739,3744,3749,3754,3759,3764],{"text":3740,"config":3741},"GitLab Services",{"href":3742,"dataGaName":3743,"dataGaLocation":3516},"/services/","services",{"text":3745,"config":3746},"Contribute",{"href":3747,"dataGaName":3748,"dataGaLocation":3516},"https://contributors.gitlab.com","contribute",{"text":3750,"config":3751},"Community",{"href":3752,"dataGaName":3753,"dataGaLocation":3516},"/community/","community",{"text":3755,"config":3756},"Forum",{"href":3757,"dataGaName":3758,"dataGaLocation":3516},"https://forum.gitlab.com/","forum",{"text":3760,"config":3761},"Events",{"href":3762,"dataGaName":3763,"dataGaLocation":3516},"/events/","events",{"text":3765,"config":3766},"Partners",{"href":3767,"dataGaName":3768,"dataGaLocation":3516},"/partners/","partners",{"config":3770,"title":3773,"text":3774,"link":3775},{"background":3771,"textColor":3772},"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":3776,"config":3777},"Read the latest",{"href":3778,"dataGaName":3779,"dataGaLocation":3516},"/whats-new/","whats new",{"text":3781,"config":3782,"menu":3784},"Company",{"dataNavLevelOne":3783},"company",{"type":3567,"columns":3785},[3786],{"items":3787},[3788,3793,3799,3801,3806,3811,3816,3821,3826,3831],{"text":3789,"config":3790},"About",{"href":3791,"dataGaName":3792,"dataGaLocation":3516},"/company/","about",{"text":3794,"config":3795,"footerGa":3798},"Jobs",{"href":3796,"dataGaName":3797,"dataGaLocation":3516},"/jobs/","jobs",{"dataGaName":3797},{"text":3760,"config":3800},{"href":3762,"dataGaName":3763,"dataGaLocation":3516},{"text":3802,"config":3803},"Leadership",{"href":3804,"dataGaName":3805,"dataGaLocation":3516},"/company/team/e-group/","leadership",{"text":3807,"config":3808},"Handbook",{"href":3809,"dataGaName":3810,"dataGaLocation":3516},"https://handbook.gitlab.com/","handbook",{"text":3812,"config":3813},"Investor relations",{"href":3814,"dataGaName":3815,"dataGaLocation":3516},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":3817,"config":3818},"Trust Center",{"href":3819,"dataGaName":3820,"dataGaLocation":3516},"/security/","trust center",{"text":3822,"config":3823},"AI Transparency Center",{"href":3824,"dataGaName":3825,"dataGaLocation":3516},"/ai-transparency-center/","ai transparency center",{"text":3827,"config":3828},"Newsletter",{"href":3829,"dataGaName":3830,"dataGaLocation":3516},"/company/contact/#contact-forms","newsletter",{"text":3832,"config":3833},"Press",{"href":3834,"dataGaName":3835,"dataGaLocation":3516},"/press/","press",{"text":3837,"config":3838,"menu":3839},"Contact us",{"dataNavLevelOne":3783},{"type":3567,"columns":3840},[3841],{"items":3842},[3843,3848,3853],{"text":3844,"config":3845},"Talk to sales",{"href":3846,"dataGaName":3847,"dataGaLocation":3516},"/sales/","talk to sales",{"text":3849,"config":3850},"Support portal",{"href":3851,"dataGaName":3852,"dataGaLocation":3516},"https://support.gitlab.com/hc/en-us","support portal",{"text":3854,"config":3855},"Customer portal",{"href":3856,"dataGaName":3857,"dataGaLocation":3516},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":3859,"login":3860,"suggestions":3867},"Close",{"text":3861,"link":3862},"To search repositories and projects, login to",{"text":3863,"config":3864},"gitlab.com",{"href":3530,"dataGaName":3865,"dataGaLocation":3866},"search login","search",{"text":3868,"default":3869},"Suggestions",[3870,3872,3876,3878,3882,3886],{"text":3547,"config":3871},{"href":3552,"dataGaName":3547,"dataGaLocation":3866},{"text":3873,"config":3874},"Code Suggestions (AI)",{"href":3875,"dataGaName":3873,"dataGaLocation":3866},"/solutions/code-suggestions/",{"text":3583,"config":3877},{"href":3585,"dataGaName":3583,"dataGaLocation":3866},{"text":3879,"config":3880},"GitLab on AWS",{"href":3881,"dataGaName":3879,"dataGaLocation":3866},"/partners/technology-partners/aws/",{"text":3883,"config":3884},"GitLab on Google Cloud",{"href":3885,"dataGaName":3883,"dataGaLocation":3866},"/partners/technology-partners/google-cloud-platform/",{"text":3887,"config":3888},"Why GitLab?",{"href":3560,"dataGaName":3887,"dataGaLocation":3866},{"freeTrial":3890,"mobileIcon":3895,"desktopIcon":3900,"secondaryButton":3903},{"text":3891,"config":3892},"Start free trial",{"href":3893,"dataGaName":3521,"dataGaLocation":3894},"https://gitlab.com/-/trials/new/","nav",{"altText":3896,"config":3897},"Gitlab Icon",{"src":3898,"dataGaName":3899,"dataGaLocation":3894},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":3896,"config":3901},{"src":3902,"dataGaName":3899,"dataGaLocation":3894},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":3904,"config":3905},"Get Started",{"href":3906,"dataGaName":3907,"dataGaLocation":3894},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":3909,"mobileIcon":3913,"desktopIcon":3915},{"text":3910,"config":3911},"Learn more about GitLab Duo",{"href":3552,"dataGaName":3912,"dataGaLocation":3894},"gitlab duo",{"altText":3896,"config":3914},{"src":3898,"dataGaName":3899,"dataGaLocation":3894},{"altText":3896,"config":3916},{"src":3902,"dataGaName":3899,"dataGaLocation":3894},{"button":3918,"mobileIcon":3923,"desktopIcon":3925},{"text":3919,"config":3920},"/switch",{"href":3921,"dataGaName":3922,"dataGaLocation":3894},"#contact","switch",{"altText":3896,"config":3924},{"src":3898,"dataGaName":3899,"dataGaLocation":3894},{"altText":3896,"config":3926},{"src":3927,"dataGaName":3899,"dataGaLocation":3894},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":3929,"mobileIcon":3934,"desktopIcon":3936},{"text":3930,"config":3931},"Back to pricing",{"href":3665,"dataGaName":3932,"dataGaLocation":3894,"icon":3933},"back to pricing","GoBack",{"altText":3896,"config":3935},{"src":3898,"dataGaName":3899,"dataGaLocation":3894},{"altText":3896,"config":3937},{"src":3902,"dataGaName":3899,"dataGaLocation":3894},{"title":3939,"titleMobile":3940,"button":3941,"config":3946},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":3558,"config":3942},{"href":3943,"dataGaName":3944,"dataGaLocation":3945},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":3947,"disabled":3496},"release",{"data":3949},{"text":3950,"source":3951,"edit":3957,"contribute":3962,"config":3967,"items":3972,"minimal":4180},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":3952,"config":3953},"View page source",{"href":3954,"dataGaName":3955,"dataGaLocation":3956},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":3958,"config":3959},"Edit this page",{"href":3960,"dataGaName":3961,"dataGaLocation":3956},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":3963,"config":3964},"Please contribute",{"href":3965,"dataGaName":3966,"dataGaLocation":3956},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":3968,"facebook":3969,"youtube":3970,"linkedin":3971},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[3973,4020,4072,4116,4148],{"title":3663,"links":3974,"subMenu":3989},[3975,3979,3984],{"text":3976,"config":3977},"View plans",{"href":3665,"dataGaName":3978,"dataGaLocation":3956},"view plans",{"text":3980,"config":3981},"Why Premium?",{"href":3982,"dataGaName":3983,"dataGaLocation":3956},"/pricing/premium/","why premium",{"text":3985,"config":3986},"Why Ultimate?",{"href":3987,"dataGaName":3988,"dataGaLocation":3956},"/pricing/ultimate/","why ultimate",[3990],{"title":3991,"links":3992},"Contact Us",[3993,3996,3998,4000,4005,4010,4015],{"text":3994,"config":3995},"Contact sales",{"href":3846,"dataGaName":3526,"dataGaLocation":3956},{"text":3849,"config":3997},{"href":3851,"dataGaName":3852,"dataGaLocation":3956},{"text":3854,"config":3999},{"href":3856,"dataGaName":3857,"dataGaLocation":3956},{"text":4001,"config":4002},"Status",{"href":4003,"dataGaName":4004,"dataGaLocation":3956},"https://status.gitlab.com/","status",{"text":4006,"config":4007},"Terms of use",{"href":4008,"dataGaName":4009,"dataGaLocation":3956},"/terms/","terms of use",{"text":4011,"config":4012},"Privacy statement",{"href":4013,"dataGaName":4014,"dataGaLocation":3956},"/privacy/","privacy statement",{"text":4016,"config":4017},"Cookie preferences",{"dataGaName":4018,"dataGaLocation":3956,"id":4019,"isOneTrustButton":51},"cookie preferences","ot-sdk-btn",{"title":3563,"links":4021,"subMenu":4030},[4022,4026],{"text":4023,"config":4024},"DevSecOps platform",{"href":3545,"dataGaName":4025,"dataGaLocation":3956},"devsecops platform",{"text":4027,"config":4028},"AI-Assisted Development",{"href":3552,"dataGaName":4029,"dataGaLocation":3956},"ai-assisted development",[4031],{"title":4032,"links":4033},"Topics",[4034,4039,4043,4048,4053,4057,4062,4067],{"text":4035,"config":4036},"CICD",{"href":4037,"dataGaName":4038,"dataGaLocation":3956},"/topics/ci-cd/","cicd",{"text":34,"config":4040},{"href":4041,"dataGaName":4042,"dataGaLocation":3956},"/topics/gitops/","gitops",{"text":4044,"config":4045},"DevOps",{"href":4046,"dataGaName":4047,"dataGaLocation":3956},"/topics/devops/","devops",{"text":4049,"config":4050},"Version Control",{"href":4051,"dataGaName":4052,"dataGaLocation":3956},"/topics/version-control/","version control",{"text":4054,"config":4055},"DevSecOps",{"href":4056,"dataGaName":3491,"dataGaLocation":3956},"/topics/devsecops/",{"text":4058,"config":4059},"Cloud Native",{"href":4060,"dataGaName":4061,"dataGaLocation":3956},"/topics/cloud-native/","cloud native",{"text":4063,"config":4064},"AI for Coding",{"href":4065,"dataGaName":4066,"dataGaLocation":3956},"/topics/devops/ai-for-coding/","ai for coding",{"text":4068,"config":4069},"Agentic AI",{"href":4070,"dataGaName":4071,"dataGaLocation":3956},"/topics/agentic-ai/","agentic ai",{"title":4073,"links":4074},"Solutions",[4075,4077,4079,4084,4088,4091,4095,4098,4100,4103,4106,4111],{"text":3607,"config":4076},{"href":3602,"dataGaName":3607,"dataGaLocation":3956},{"text":3596,"config":4078},{"href":3579,"dataGaName":3580,"dataGaLocation":3956},{"text":4080,"config":4081},"Agile development",{"href":4082,"dataGaName":4083,"dataGaLocation":3956},"/solutions/agile-delivery/","agile delivery",{"text":4085,"config":4086},"SCM",{"href":3592,"dataGaName":4087,"dataGaLocation":3956},"source code management",{"text":4035,"config":4089},{"href":3585,"dataGaName":4090,"dataGaLocation":3956},"continuous integration & delivery",{"text":4092,"config":4093},"Value stream management",{"href":3635,"dataGaName":4094,"dataGaLocation":3956},"value stream management",{"text":34,"config":4096},{"href":4097,"dataGaName":4042,"dataGaLocation":3956},"/solutions/gitops/",{"text":3645,"config":4099},{"href":3648,"dataGaName":3649,"dataGaLocation":3956},{"text":4101,"config":4102},"Small business",{"href":3654,"dataGaName":3655,"dataGaLocation":3956},{"text":4104,"config":4105},"Public sector",{"href":3660,"dataGaName":3661,"dataGaLocation":3956},{"text":4107,"config":4108},"Education",{"href":4109,"dataGaName":4110,"dataGaLocation":3956},"/solutions/education/","education",{"text":4112,"config":4113},"Financial services",{"href":4114,"dataGaName":4115,"dataGaLocation":3956},"/solutions/finance/","financial services",{"title":3668,"links":4117},[4118,4120,4122,4124,4127,4129,4132,4134,4136,4138,4140,4142,4144,4146],{"text":3680,"config":4119},{"href":3682,"dataGaName":3683,"dataGaLocation":3956},{"text":3685,"config":4121},{"href":3687,"dataGaName":3688,"dataGaLocation":3956},{"text":3690,"config":4123},{"href":3692,"dataGaName":3693,"dataGaLocation":3956},{"text":3695,"config":4125},{"href":3697,"dataGaName":4126,"dataGaLocation":3956},"docs",{"text":3718,"config":4128},{"href":3720,"dataGaName":3721,"dataGaLocation":3956},{"text":4130,"config":4131},"What's new",{"href":3778,"dataGaName":3779,"dataGaLocation":3956},{"text":3713,"config":4133},{"href":3715,"dataGaName":3716,"dataGaLocation":3956},{"text":3732,"config":4135},{"href":3734,"dataGaName":3735,"dataGaLocation":3956},{"text":3740,"config":4137},{"href":3742,"dataGaName":3743,"dataGaLocation":3956},{"text":3745,"config":4139},{"href":3747,"dataGaName":3748,"dataGaLocation":3956},{"text":3750,"config":4141},{"href":3752,"dataGaName":3753,"dataGaLocation":3956},{"text":3755,"config":4143},{"href":3757,"dataGaName":3758,"dataGaLocation":3956},{"text":3760,"config":4145},{"href":3762,"dataGaName":3763,"dataGaLocation":3956},{"text":3765,"config":4147},{"href":3767,"dataGaName":3768,"dataGaLocation":3956},{"title":3781,"links":4149},[4150,4152,4154,4156,4158,4160,4164,4169,4171,4173,4175],{"text":3789,"config":4151},{"href":3791,"dataGaName":3783,"dataGaLocation":3956},{"text":3794,"config":4153},{"href":3796,"dataGaName":3797,"dataGaLocation":3956},{"text":3802,"config":4155},{"href":3804,"dataGaName":3805,"dataGaLocation":3956},{"text":3807,"config":4157},{"href":3809,"dataGaName":3810,"dataGaLocation":3956},{"text":3812,"config":4159},{"href":3814,"dataGaName":3815,"dataGaLocation":3956},{"text":4161,"config":4162},"Sustainability",{"href":4163,"dataGaName":4161,"dataGaLocation":3956},"/sustainability/",{"text":4165,"config":4166},"Diversity, inclusion and belonging (DIB)",{"href":4167,"dataGaName":4168,"dataGaLocation":3956},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":3817,"config":4170},{"href":3819,"dataGaName":3820,"dataGaLocation":3956},{"text":3827,"config":4172},{"href":3829,"dataGaName":3830,"dataGaLocation":3956},{"text":3832,"config":4174},{"href":3834,"dataGaName":3835,"dataGaLocation":3956},{"text":4176,"config":4177},"Modern Slavery Transparency Statement",{"href":4178,"dataGaName":4179,"dataGaLocation":3956},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":4181},[4182,4185,4188],{"text":4183,"config":4184},"Terms",{"href":4008,"dataGaName":4009,"dataGaLocation":3956},{"text":4186,"config":4187},"Cookies",{"dataGaName":4018,"dataGaLocation":3956,"id":4019,"isOneTrustButton":51},{"text":4189,"config":4190},"Privacy",{"href":4013,"dataGaName":4014,"dataGaLocation":3956},[4192],{"id":4193,"title":7,"body":3495,"config":4194,"content":4196,"description":3495,"extension":4200,"meta":4201,"navigation":51,"path":4202,"seo":4203,"stem":4204,"__hash__":4205},"blogAuthors/en-us/blog/authors/fernando-diaz.yml",{"template":4195},"BlogAuthor",{"name":7,"config":4197},{"headshot":4198,"ctfId":4199},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659556/Blog/Author%20Headshots/fern_diaz.png","fjdiaz","yml",{},"/en-us/blog/authors/fernando-diaz",{},"en-us/blog/authors/fernando-diaz","lxRJIOydP4_yzYZvsPcuQevP9AYAKREF7i8QmmdnOWc",[4207,4215,4223],{"title":4208,"description":4209,"heroImage":4210,"category":3491,"date":4211,"authors":4212,"slug":4214,"externalUrl":3495},"Consolidate your GitLab stack with Gitaly on Kubernetes","Discover how to install Gitaly on Kubernetes, which is now generally available.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1756500636/wmey6kqzzuhirk88w2de.png","2026-05-07",[4213],"Olivier Campeau","gitaly-on-kubernetes-generally-available",{"title":4216,"description":4217,"heroImage":4218,"category":3491,"date":4219,"authors":4220,"slug":4222,"externalUrl":3495},"Teaching software development the easy way using GitLab","Learn how University of Washington lecturer Stephen G. Dame uses GitLab for Education to manage student assignments, distribute course materials, and provide inline code feedback at scale.\n","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659537/Blog/Hero%20Images/display-article-image-0679-1800x945-fy26.png","2026-04-29",[4221],"Rod Burns","teaching-software-development-the-easy-way-using-gitlab",{"title":4224,"description":4225,"heroImage":4226,"category":3491,"date":4227,"authors":4228,"slug":4230,"externalUrl":3495},"AI is reshaping DevSecOps: Attend GitLab Transcend to see what’s next","AI-generated code is 34% of development work. Discover how to balance productivity gains with quality, reliability, and security.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1767982271/e9ogyosmuummq7j65zqg.png","2026-01-08",[4229],"Manav Khurana","ai-is-reshaping-devsecops-attend-gitlab-transcend-to-see-whats-next",{"promotions":4232},[4233,4247,4259,4270],{"id":4234,"categories":4235,"header":4237,"text":4238,"button":4239,"image":4244},"ai-modernization",[4236],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":4240,"config":4241},"Get your AI maturity score",{"href":4242,"dataGaName":4243,"dataGaLocation":3721},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":4245},{"src":4246},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":4248,"categories":4249,"header":4251,"text":4238,"button":4252,"image":4256},"devops-modernization",[4250,3491],"product","Are you just managing tools or shipping innovation?",{"text":4253,"config":4254},"Get your DevOps maturity score",{"href":4255,"dataGaName":4243,"dataGaLocation":3721},"/assessments/devops-modernization-assessment/",{"config":4257},{"src":4258},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":4260,"categories":4261,"header":4262,"text":4238,"button":4263,"image":4267},"security-modernization",[3508],"Are you trading speed for security?",{"text":4264,"config":4265},"Get your security maturity score",{"href":4266,"dataGaName":4243,"dataGaLocation":3721},"/assessments/security-modernization-assessment/",{"config":4268},{"src":4269},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":4271,"paths":4272,"header":4275,"text":4276,"button":4277,"image":4282},"github-azure-migration",[4273,4274],"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":4278,"config":4279},"See how GitLab compares to GitHub",{"href":4280,"dataGaName":4281,"dataGaLocation":3721},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":4283},{"src":4258},{"header":4285,"blurb":4286,"button":4287,"secondaryButton":4292},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":4288,"config":4289},"Get your free trial",{"href":4290,"dataGaName":3521,"dataGaLocation":4291},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":3994,"config":4293},{"href":3846,"dataGaName":3526,"dataGaLocation":4291},1786803774624]