--- stage: Deploy group: Environments info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://handbook.gitlab.com/handbook/product/ux/technical-writing/#assignments --- # Using GitOps with a Kubernetes cluster **(FREE ALL)** > - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/259669) in GitLab 13.7. > - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/332227) in GitLab 14.0, the `resource_inclusions` and `resource_exclusions` attributes were removed and `reconcile_timeout`, `dry_run_strategy`, `prune`, `prune_timeout`, `prune_propagation_policy`, and `inventory_policy` attributes were added. > - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/346567) from GitLab Premium to GitLab Free in 15.3. > - [Changed](https://gitlab.com/gitlab-org/gitlab/-/issues/346585) to make the `id` attribute optional in GitLab 15.7. > - Specifying a branch, tag, or commit reference to fetch the Kubernetes manifest files [introduced](https://gitlab.com/groups/gitlab-org/-/epics/4516) in GitLab 15.7. > - [Changed](https://gitlab.com/gitlab-org/gitlab/-/issues/395364) in GitLab 16.1 to prioritize Flux for GitOps. GitLab integrates [Flux](https://fluxcd.io/flux/) for GitOps. To get started with Flux, see the [Flux for GitOps tutorial](gitops/flux_tutorial.md). With GitOps, you can manage containerized clusters and applications from a Git repository that: - Is the single source of truth of your system. - Is the single place where you operate your system. By combining GitLab, Kubernetes, and GitOps, you can have: - GitLab as the GitOps operator. - Kubernetes as the automation and convergence system. - GitLab CI/CD for Continuous Integration. - The agent for Continuous Deployment and cluster observability. - Built-in automatic drift remediation. - Resource management with [server-side applies](https://kubernetes.io/docs/reference/using-api/server-side-apply/) for transparent multi-actor field management. ## Deployment sequence This diagram shows the repositories and main actors in a GitOps deployment: ```mermaid sequenceDiagram participant D as Developer participant A as Application code repository participant M as Deployment repository participant R as OCI registry participant C as Agent configuration repository participant K as GitLab agent participant F as Flux loop Regularly K-->>C: Grab the configuration end D->>+A: Pushing code changes A->>M: Updating manifest M->>R: Build an OCI artifact M->>K: Notify K->>F: Notify and watch sync R-->>F: Pulling and applying changes K->>M: Notify after sync ``` You should use both Flux and `agentk` for GitOps deployments. Flux keeps the cluster state synchronized with the source, while `agentk` simplifies the Flux setup, provides cluster-to-GitLab access management, and visualizes the cluster state in the GitLab UI. ### OCI for source control You should use OCI images as a source controller for Flux, instead of a Git repository. The [GitLab container registry](../../packages/container_registry/index.md) supports OCI images. | OCI registry | Git repository | | --- | --- | | Designed to serve container images at scale. | Designed to version and store source code. | | Immutable, supports security scans. | Mutable. | | The default Git branch can store cluster state without triggering a sync. | The default Git branch triggers a sync when used to store cluster state. | ## Repository structure To simplify configuration, use one delivery repository per team. You can package the delivery repository into multiple OCI images per application. For additional repository structure recommendations, see the [Flux documentation](https://fluxcd.io/flux/guides/repository-structure/). ## Immediate Git repository reconciliation > - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/392852) in GitLab 16.1 with a [flag](../../../administration/feature_flags.md) named `notify_kas_on_git_push`. Disabled by default. > - [Enabled on GitLab.com and self-managed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/126527) in GitLab 16.2. > - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/410429) in GitLab 16.3. Usually, the Flux source controller reconciles Git repositories at configured intervals. This can cause delays between a `git push` and the reconciliation of the cluster state, and results in unnecessary pulls from GitLab. The agent for Kubernetes automatically detects Flux `GitRepository` objects that reference GitLab projects in the instance the agent is connected to, and configures a [`Receiver`](https://fluxcd.io/flux/components/notification/receiver/) for the instance. When the agent for Kubernetes detects a `git push`, the `Receiver` is triggered and Flux reconciles the cluster with any changes to the repository. To use immediate Git repository reconciliation, you must have a Kubernetes cluster that runs: - The agent for Kubernetes. - Flux `source-controller` and `notification-controller`. Immediate Git repository reconciliation can reduce the time between a push and reconciliation, but it doesn't guarantee that every `git push` event is received. You should still set [`GitRepository.spec.interval`](https://fluxcd.io/flux/components/source/gitrepositories/#interval) to an acceptable duration. ### Custom webhook endpoints When the agent for Kubernetes calls the `Receiver` webhook, the agent defaults to `http://webhook-receiver.flux-system.svc.cluster.local`, which is also the default URL set by a Flux bootstrap installation. To configure a custom endpoint, set `flux.webhook_receiver_url` to a URL that the agent can resolve. For example: ```yaml flux: webhook_receiver_url: http://webhook-receiver.another-flux-namespace.svc.cluster.local ``` There is special handing for [service proxy URLs](https://kubernetes.io/docs/tasks/access-application-cluster/access-cluster-services/) configured in this format: `/api/v1/namespaces/[^/]+/services/[^/]+/proxy`. For example: ```yaml flux: webhook_receiver_url: /api/v1/namespaces/flux-system/services/http:webhook-receiver:80/proxy ``` In these cases, the agent for Kubernetes uses the available Kubernetes configuration and context to connect to the API endpoint. You can use this if you run an agent outside a cluster and you haven't [configured an `Ingress`](https://fluxcd.io/flux/guides/webhook-receivers/#expose-the-webhook-receiver) for the Flux notification controller. WARNING: You should configure only trusted service proxy URLs. When you provide a service proxy URL, the agent for Kubernetes sends typical Kubernetes API requests which include the credentials necessary to authenticate with the API service. ## Token management To use certain Flux features, you might need multiple access tokens. Additionally, you can use multiple token types to achieve the same result. This section provides guidelines for the tokens you might need, and provides token type recommendations where possible. ### GitLab access by Flux To access the GitLab the container registry or Git repositories, Flux can use: - A project or group deploy token. - A project or group deploy key. - A project or group access token. - A personal access token. The token does not need write access. You should use project deploy tokens if `http` access is possible. If you require `git+ssh` access, you should use deploy keys. To compare deploy keys and deploy tokens, see [Deploy keys](../../project/deploy_keys/index.md). Support for automating deploy token creation, rotation, and reporting is proposed in [issue 389393](https://gitlab.com/gitlab-org/gitlab/-/issues/389393). ### Flux to GitLab notification If you configure Flux to synchronize from a Git source, [Flux can register an external job status](https://fluxcd.io/flux/components/notification/provider/#git-commit-status-updates) in GitLab pipelines. To get external job statuses from Flux, you can use: - A project or group deploy token. - A project or group access token. - A personal access token. The token requires `api` scope. To minimize the attack surface of a leaked token, you should use a project access token. Integrating Flux into GitLab pipelines as a job is proposed in [issue 405007](https://gitlab.com/gitlab-org/gitlab/-/issues/405007). ## Related topics - [GitOps working examples for training and demos](https://gitlab.com/groups/guided-explorations/gl-k8s-agent/gitops/-/wikis/home) - [Self-paced classroom workshop](https://gitlab-for-eks.awsworkshop.io) (Uses AWS EKS, but you can use for other Kubernetes clusters) - Managing Kubernetes secrets in a GitOps workflow - [with SOPS built-in to Flux](https://fluxcd.io/flux/guides/mozilla-sops/) - [with Sealed Secrets](https://fluxcd.io/flux/guides/sealed-secrets/)